目录
使用 ResConfigs 来删除没用的配置种类
resources.arsc 中的松散配置项问题
资源 id 混淆
首页 web前端 html教程 apk 瘦身系列③:删除没用的资源文件_html/css_WEB-ITnose

apk 瘦身系列③:删除没用的资源文件_html/css_WEB-ITnose

Jun 21, 2016 am 08:54 AM

没用的代码可以删除, 没用的资源文件当然也可以删除。只需要设置 gradle 属性 shrinkResources 为true 即可启用该功能。

build.gradle

Java

android {    ...    buildTypes {        release {            minifyEnabled true            shrinkResources true            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}
登录后复制
android {    ...    buildTypes {        release {            minifyEnabledtrue            shrinkResourcestrue            proguardFilesgetDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}
登录后复制

如果有些资源被误删了,在代码中有使用(通过反射),则可以通过 tools:keep 属性来保留这些资源。为了方便管理,还可以创建一个单独的文件来保留所有需要保留的资源,类似于 ProGuard 的配置文件:

res/raw/keep.xml

XHTML

<?xml version="1.0" encoding="utf-8"?><resources xmlns:tools="http://schemas.android.com/tools"   tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"/>
登录后复制
<?xmlversion="1.0" encoding="utf-8"?><resourcesxmlns:tools="http://schemas.android.com/tools"  tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"/>
登录后复制

还可以使用 tools:discard 属性来删除之前保留的属性

res/raw/keep.xml

XHTML

<?xml version="1.0" encoding="utf-8"?><resources xmlns:tools="http://schemas.android.com/tools"    tools:shrinkMode="safe"    tools:discard="@layout/unused2"/>
登录后复制
<?xmlversion="1.0" encoding="utf-8"?><resourcesxmlns:tools="http://schemas.android.com/tools"    tools:shrinkMode="safe"    tools:discard="@layout/unused2"/>
登录后复制

在 tools 网站上 详细解释了如何通过log 查看资源清理以及 safe 和 strict 清理模式的区别。

当然了,如果你发现有大量的资源文件没有用, 为了保持文件整洁,你最好还是手工自己把这些文件删除掉吧。

使用 ResConfigs 来删除没用的配置种类

各种第三方库都把字符串资源翻译成了各种语言,例如 Support Library 和 Google Play Services 就支持几十种语言。但是在你的应用中可能只支持一种或者几种语言,可以通过 resConfigs 选项来告诉编译器,你的应用只支持这些配置的语言,其他语言资源不会被编译到最终的 apk 文件中:

build.gradle

Java

android {    defaultConfig {        ...        resConfigs "en", "zh"    }}
登录后复制
android {    defaultConfig {        ...        resConfigs "en", "zh"    }}
登录后复制

上面的配置只保留中文和英文资源文件, 其他资源文件都不会包含在最终的 apk 文件中。

注意,在 resConfigs 中只能定义一种屏幕密度属性,对于不同屏幕密度的处理可以使用后面即将结束的 分屏幕发布不同版本的功能。

resources.arsc 中的松散配置项问题

本节讨论的问题一般是针对大型项目的,这些项目使用了成千上万个资源文件。

如果你发现 resources.arsc 文件占用的空间非常多,多的不太合理,则很有可能就是松散配置项引起的。 下面通过例子来看看引起该问题的原因:

假设在默认的字符串配置文件 (values/strings.xml)中有 5 个字符串。这 5 个字符串的值会定义在一个字符串池中,每个字符串的标识符和对应的池地址会保存在其他地方。那么这 5 个字符串 最后编译到 resources.arsc 中的内容类似如下所示:

Java

String pool: "My App", "Hello", "Exit", "Settings", "Feature"                  Default config: string/myapp      0x00000001string/hello      0x00000002string/exit       0x00000003string/settings   0x00000004string/feature    0x00000005
登录后复制
String pool: "My App", "Hello", "Exit", "Settings", "Feature"                  Default config: string/myapp      0x00000001string/hello      0x00000002string/exit      0x00000003string/settings  0x00000004string/feature    0x00000005
登录后复制

现在,假设你在应用中添加了一个新的功能,并且该功能仅仅在 api 21+ 之上存在。该新功能需要显示一个不同的字符串内容,那么你选择在 values-v21/strings.xml 中添加一个字符串。

仅仅添加了一个新的 v21 字符串,则 resources.arsc 的内容将会变成下面这个样子:

Java

String pool: "My App", "Hello", "Exit", "Settings", "Feature", "New feature"                  Default config:         -v21 config:string/myapp      0x00000001              NO_ENTRYstring/hello      0x00000002              NO_ENTRYstring/exit       0x00000003              NO_ENTRYstring/settings   0x00000004              NO_ENTRYstring/feature    0x00000005              0x00000006                                    ==========              ==========Config size:      20 bytes                **20 bytes!**
登录后复制
String pool: "My App", "Hello", "Exit", "Settings", "Feature", "New feature"                  Default config:        -v21config:string/myapp      0x00000001              NO_ENTRYstring/hello      0x00000002              NO_ENTRYstring/exit      0x00000003              NO_ENTRYstring/settings  0x00000004              NO_ENTRYstring/feature    0x00000005              0x00000006                                    ==========              ==========Configsize:      20 bytes                **20 bytes!**
登录后复制

每个配置项都占用了所有资源文件的空间,虽然实际上在 v21 中其他字符串指向的地址为 null 但是仍然会占用同样的字节数。每个标识符 4个字节。

如果你的应用中有很多不同的配置项,比如 -v21、 -land 、 -en-land-v21 等。则会多占用不少的空间。

假设在实际场景中,一个应用有 3500 个字符串,但是有一个特殊的字符串单独定义在另外一种配置项中,然后改字符串需要翻译为其他 50 种语言(也就是说将会有类似 values-en-land, -pl-land, -de-land, -fr-land… 等 50个目录),这样会多占用如下的空间:

4 bytes * 3500 null entries * 50 languages = 700 kilobytes

如果你把这个特殊的字符串给删除了,则就可以节省 700KB的空间。 有些大型项目仅仅删除了 3 个资源就可以节省 2.5M 的空间。

针对这种特殊的情况,如果你发现仅仅几个字符串的添加就导致 apk 文件变得很大,则你可以考虑在默认配置项中定义这些特殊的字符串,然后在运行的时候,根据系统配置动态的选择使用哪个字符串。

资源 id 混淆

资源 id 一般也有很长的名字,比如 xxx_xxxx.png ,如果可以像混淆代码一样把资源文件也给混淆了,则同样可以减少 resources.arsc 文件的大小,可以使用 DexGuard或者 微信团队的 资源混淆器来实现这个功能。关于资源混淆的原理,可以 参考这里。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验? 公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验? Mar 04, 2025 pm 12:32 PM

公众号网页更新缓存,这玩意儿,说简单也简单,说复杂也够你喝一壶的。你辛辛苦苦更新了公众号文章,结果用户打开还是老版本,这滋味,谁受得了?这篇文章,咱就来扒一扒这背后的弯弯绕绕,以及如何优雅地解决这个问题。读完之后,你就能轻松应对各种缓存难题,让你的用户始终体验到最新鲜的内容。先说点基础的。网页缓存,说白了就是浏览器或者服务器为了提高访问速度,把一些静态资源(比如图片、CSS、JS)或者页面内容存储起来。下次访问时,直接从缓存里取,不用再重新下载,速度自然快。但这玩意儿,也是个双刃剑。新版本上线,

如何使用HTML5表单验证属性来验证用户输入? 如何使用HTML5表单验证属性来验证用户输入? Mar 17, 2025 pm 12:27 PM

本文讨论了使用HTML5表单验证属性,例如必需的,图案,最小,最大和长度限制,以直接在浏览器中验证用户输入。

HTML5中跨浏览器兼容性的最佳实践是什么? HTML5中跨浏览器兼容性的最佳实践是什么? Mar 17, 2025 pm 12:20 PM

文章讨论了确保HTML5跨浏览器兼容性的最佳实践,重点是特征检测,进行性增强和测试方法。

如何高效地在网页中为PNG图片添加描边效果? 如何高效地在网页中为PNG图片添加描边效果? Mar 04, 2025 pm 02:39 PM

本文展示了使用CSS为网页中添加有效的PNG边框。 它认为,与JavaScript或库相比,CSS提供了出色的性能,详细介绍了如何调整边界宽度,样式和颜色以获得微妙或突出的效果

&lt; datalist&gt;的目的是什么。 元素? &lt; datalist&gt;的目的是什么。 元素? Mar 21, 2025 pm 12:33 PM

本文讨论了html&lt; datalist&gt;元素,通过提供自动完整建议,改善用户体验并减少错误来增强表格。Character计数:159

我如何使用html5&lt; time&gt; 元素以语义表示日期和时间? 我如何使用html5&lt; time&gt; 元素以语义表示日期和时间? Mar 12, 2025 pm 04:05 PM

本文解释了HTML5&lt; time&gt;语义日期/时间表示的元素。 它强调了DateTime属性对机器可读性(ISO 8601格式)的重要性,并在人类可读文本旁边,增强Accessibilit

&gt; gt;的目的是什么 元素? &gt; gt;的目的是什么 元素? Mar 21, 2025 pm 12:34 PM

本文讨论了HTML&lt; Progress&gt;元素,其目的,样式和与&lt; meter&gt;元素。主要重点是使用&lt; progress&gt;为了完成任务和LT;仪表&gt;对于stati

&lt; meter&gt;的目的是什么。 元素? &lt; meter&gt;的目的是什么。 元素? Mar 21, 2025 pm 12:35 PM

本文讨论了HTML&lt; meter&gt;元素,用于在一个范围内显示标量或分数值及其在Web开发中的常见应用。它区分了&lt; meter&gt;从&lt; progress&gt;和前

See all articles