Android 开发高手课
张绍文
前微信高级工程师,Tinker 负责人
52722 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
导读 (1讲)
模块一 高质量开发 (25讲)
Android 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

23 | 包体积优化(下):资源优化的进阶实践

第三阶段:realShrinkResources
第二阶段:shrinkResources
第一阶段:Lint
资源的管理
资源的解析
压缩更多的文件
更高的压缩率
优化作用
资源混淆的思路
识别出无用的Assets资源
安装包中的资源的优化方案
对于Android的编译流程
不断思考如何突破系统的限制
不完美的地方
无用资源
资源合并
极限压缩
资源混淆
安装包还有哪些可以优化的地方
上一期聊了Dex与Native Library的优化
标题:资源优化的进阶实践
课后作业
总结
进阶的优化方法
AndResGuard工具
参考文章
资源优化的进阶实践

该思维导图由 AI 生成,仅供参考

上一期我们聊了 Dex 与 Native Library 的优化,是不是还有点意犹未尽的感觉呢?那安装包还有哪些可以优化的地方呢?
请看上面这张图,Assets、Resource 以及签名 metadata 都是安装包中的“资源”部分,今天我们就一起来看看如何进一步优化资源的体积。

AndResGuard 工具

在美团的一篇文章《Android App 包瘦身优化实践》中,也讲到了很多资源优化相关的方法,例如 WebP 和 SVG、R 文件、无用资源、资源混淆以及语言压缩等。
在我们的安装包中,资源相关的文件具体有下面这几个,它们都是我们需要优化的目标文件。
想使用好AndResGuard工具,需要对安装包格式以及 Android 资源编译的原理有很深地理解,它主要有两个功能,一个是资源混淆,一个是资源的极限压缩。
接下来我们先来复习一下这个工具的核心实现,然后再进一步思考还有哪些地方需要继续优化。
1. 资源混淆
ProGuard 的核心优化主要有三个:Shrink、Optimize 和 Obfuscate,也就是裁剪、优化和混淆。当初我在写 AndResGuard 的时候,希望实现的就是 ProGuard 中的混淆功能。
资源混淆的思路其实非常简单,就是把资源和文件的名字混淆成短路径:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了资源优化的技术细节,为读者提供了进阶实践的思路和方法。重点讨论了安装包中的资源部分,包括Assets、Resource以及签名metadata的优化方法。文章介绍了AndResGuard工具,该工具实现了资源混淆和极限压缩两个功能。资源混淆通过将资源和文件名混淆成短路径,减少了resources.arsc、签名文件以及ZIP文件的大小,从而达到优化作用。另外,极限压缩通过利用7-Zip的大字典优化,提升了APK的整体压缩率,并支持针对特定文件格式的强制压缩。文章还提到了Android系统选择不压缩某些文件的原因,以及在启动性能、内存和安装包体积之间的抉择。此外,文章还介绍了资源合并和无用资源优化的进阶方法。资源合并可以将所有资源文件合并成一个大文件,以减少资源文件数量和体积。而无用资源优化方面,介绍了Lint、shrinkResources和realShrinkResources三个阶段的优化方法,以及对Android编译流程的思考。总的来说,本文内容丰富,深入剖析了资源优化的技术细节,为读者提供了实用的优化方法和思路。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Android 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • 星辰大海
    哈哈,shwen哥,重写arsc文件我们在matrix里其实已经实现了,借你的文章广告下。

    作者回复: 牛逼

    2019-04-30
    4
    25
  • Danny _Jiang
    Matrix中的UnusedAssetTask也有一定的缺陷,因为只是调用DexFileFactory.loadDexFile加载dex文件,所以只会去搜索java文件中的引用。 如果在assets目录下有一个.json文件,此.json文件中记录assets文件夹中的其它图片路径,然后在java代码中通过AssetManager读取这个json文件之后,循环遍历出它所引用的图片,对于这种方式Matrix是检测不到的,会将它置为unused. 想问一下作者,对于这种情况有什么好的建议优化matrix吗

    作者回复: 对于xml是有做处理的,json这个属于特殊情况,只能放到白名单里面了

    2019-06-12
    2
    2
  • 功夫熊猫
    极限压缩这部分说的更高效率的压缩是指压缩的什么,最后APK的压缩算法?如果是那么系统安装如何解压?还是说优化了现有的zip算法?

    作者回复: 依然是zip算法,只是优化了字典

    2019-02-27
    1
  • Tony
    绍文大师,我看完了你写的这篇文章,但是有个疑问,直接删除无用资源文件的话,java代码或者kotlin代码中资源引用例如0x73c8745为什么会错乱或找不到呢,虽然资源ID是顺序分配的,但是并不会影响java代码中的引用把?对这个不是很理解啊

    作者回复: 删除的无用代码都是没有Java引用的,你看起来有Java引用,可能是因为那些Java代码被proguard了

    2019-12-09
    4
  • joker°
    请问 shrinkResources 输入的无用文件相关代码在哪里看呢?实测无用 drawable 文件会压缩为一个内容仅为“<x/>”文件,但是无用 layout 文件并无任何改动

    作者回复: 指的是源码吗?源码可以看build-system里面

    2019-05-08
  • Carlo
    有没有一个好的,通用的linter或者真正的resourceshirk 工具?

    作者回复: 现在专栏完结了,真正的无用资源删除等我有空实现一下

    2019-03-25
  • 奚岩
    Lint 只能静态分析 ,但是有些动态生成的就没法识别,比如我了 kotlin-android-extensions, 有些 id 使用了,但是 Lint 却不知道,有没有什么工具可以 分析编译后 代码? 有个插件 statistics 可以统计代码。

    作者回复: shrinkresource看的就是java字节码

    2019-02-23
  • 张晴天天天天天☁️☁️
    老师您好,我从网上了解到shrinkResources=true时可能会导致一些应用崩溃的问题,那还要去使用它吗?

    作者回复: 是因为没有排除某些会使用的文件,需要加白名单

    2019-02-20
  • Egos
    所有资源文件合成一个大文件,是一个zip?

    作者回复: 不是,是一个自定义的二进制文件

    2019-02-15
  • Zain Zhu
    硬着头皮在看,一直写业务代码都废掉了啊
    2020-05-24
    8
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部