转:深入探索 Android 包体积优化

480 阅读9分钟

​吹爆系列:深入探索 Android 包体积优化

作者:jsonchao 链接: juejin.cn/post/684490… 本文由作者授权发布。

转发鸿洋文章:

7 瘦身优化常见问题

瘦身优化是性能优化当中不那么重要的一个分支,不过对于处于稳定运营期的产品会比较有帮助。下面我们就来看看对于瘦身优化有哪些常见问题。

1、怎么降低 Apk 包大小?

我们在回答的时候要注意一些 可操作的干货,同时注意结合你的 项目周期。主要可以从以下 三点 来回答:

1)代码:Proguard、统一三方库、无用代码删除。 2)资源:无用资源删除、资源混淆。 3)So:只保留 Armeabi、更优方案。

在项目初期,我们一直在不断地加功能,加入了很多的代码、资源,同时呢,也没有相应的规范,所以说,UI 同学给我们很多 UI 图的时候,都是没有经过压缩的图片,长期累积就会导致我们的包体积越来越大。

到了项目稳定期的时候,我们对各种运营数据进行考核,发现 APK 的包大小影响了用户下载的意愿,于是我们就着手做包体积的优化,我们采用的是 Android Studio 自带的 Analyze APK 来做的包体积分析,主要就是做了代码、资源、So 等三个方面的重点优化。

首先,针对于代码瘦身.

第一点,我们首先 使用 Proguard 工具进行了混淆,它将程序代码转换为功能相同,但是不容易理解的形式。

比如说将一个很长的类转换为字母 a,同时,这样做还有一个好处,就是让代码更加安全了。第二点呢,我们将项目中使用到的一些 第三方库进行了统一,比如说图片库、网络库、数据库等,不允许项目中出现功能相同,但是却实现不一样的库。

同时也做了 规范,之后引入的三方库,需要去考量它的大小、方法数等,而且呢,如果只是需要一个很大库的一个小功能,那我们就修改源码,只引入部分代码即可。第三点,我们将项目中的 无用代码进行了删减,我们使用了 AOP 的方式统计到了哪些 Activity 以及 fragment 在真实的场景下没有用户使用,这样你就可以删除掉了。

对于那些不是 Activity 或者是 Fragment 的类,我们切了很多类的构造函数,这样你就可以统计出来这些类在线上有没有真正被调用到。但是,对于代码的瘦身效果,实际上不是很明显。

接下来,我们做了资源的瘦身。

首先,我们 移除了项目当中冗余的资源文件,这一点在项目当中一定会遇到。然后,我们做了 资源图片的压缩,UI 同学给我们资源图片的时候,需要确认已经是压缩过的图片,同时,我们还会做一个 兜底策略,在打包的时候,如果图片没有被压缩过,那我们就会再来压缩一遍,这个效果就非常的明显。

对于资源,我们还做了 资源的混淆,也就是将冗余的资源名称换成简短的名字,资源压缩的效果要比代码瘦身的效果要好的多。

最后,我们做了 So 的瘦身。

首先,我们只保留了 armeabi 这个目录,它可以 兼容别的 CPU 架构,这点的优化效果非常的明显。

移除了对别的架构适配 So 之后,我们还做了另外一个处理,对于项目当中使用到的视频模块的 So,它对性能要求非常高,所以我们采用了另外一种方式,我们将所有这个模块下的 So 都放到了 armeabi 这个目录下,然后在代码中做判断,如果是别的 CPU 架构,那我们就加载对应 CPU 架构的 So 文件即可。

这样即减少了包体积,同时又达到了性能最佳。最后,通过实践可以看出 So瘦身的效果一般是最好的。

2、Apk 瘦身如何实现长效治理?

主要可以从以下 两个方面 来进行回答:

发版之前与上个版本包体积对比,超过阈值则必须优化。 推进插件化架构改进。

在大型项目中,最好的方式就是 结合 CI,每个开发同学 在往主干合入代码的时候需要经过一次预编译,这个预编译出来的包对比主干打出来的包大小,如果超过阈值则不允许合入,需要提交代码的同学自己去优化去提交的代码。

此外,针对项目的 架构,我们可以做 插件化的改造,将每一个功能模块都改造成插件,以插件的形式来支持动态下发,这样应用的包体积就可以从根本上变小了。

8 总结

在本篇文章中,我们主要从以下 七个方面 讲解了 Android 包体积优化相关的知识:

1)、瘦身优化及 Apk 分析方案:瘦身优势、APK 组成、APK 分析。

2)、代码瘦身方案探索:Dex 探秘、ProGuard、D8 与 R8 优化、去除 debug 信息与行号信息、Dex 分包优化、使用 XZ Utils 进行 Dex 压缩、三方库处理、移除无用代码、避免产生 Java access 方法、利用 ByteX Gradle 插件平台中的代码优化插件。

3)、资源瘦身方案探索:冗余资源优化、重复资源优化、图片压缩、使用针对性的图片格式、资源混淆、R Field 的内联优化、资源合并方案、资源文件最少化配置、尽量每张图片只保留一份、资源在线化、统一应用风格。

4)、So 瘦身方案探索:So 移除方案、So 移除方案优化版、使用 XZ Utils 对 Native Library 进行压缩、对 Native Library 进行合并、删除 Native Library 中无用的导出 symbol、So 动态下载。

5)、其它优化方案:插件化、业务梳理、转变开发模式。

6)、包体积监控。

7)、瘦身优化常见问题。

如果要想对包体积做更深入的优化,我们就必须对 APK 组成,Dex、So 动态库以及 Resource 文件格式,还有 APK 的编译流程 有深入地了解,这样我们才能有 足够的内功素养 去实现包体积的深度优化。

此外,在做性能优化过程中,为了提升研发效率,降低研发成本,我渐渐发现 AOP 编译插桩、Gradle 自动化构建 的知识越来越重要;并且,一旦涉及 Native 层甚至 Android 内核层的深度优化时,就越发感觉到功力不足。

因此,为了 补充深度优化所需的养分,从下篇开始,笔者将暂停更新 深入探索 Android 性能优化系列文章。下篇文章,笔者的分享将会从先从 编译插桩 相关的知识开始,敬请期待~

参考链接:

1、Top团队大牛带你玩转Android性能分析与优化 第10章 App瘦身优化 2、极客时间之Android开发高手课 包体积优化 3、《Android性能优化最佳实践》第七章 安装包大小优化 4、android-arscblamer 5、Android SVG to VectorDrawable 6、App瘦身最佳实践 7、使用Simian工具扫描重复代码 8、FontZip 9、Android-Iconics 10、iconfont 11、IconFont在Android中的使用 12、TinyPngPlugin 13、我是如何通过 nimbledroid 做android app性能优化的 14、Apktool Install Instructions 15、nimbledroid 16、android-classyshark 17、Android混淆从入门到精通 18、APK Expansion Files 19、写入放大 20、D8 dexer and R8 shrinker 21、Android新Dex编译器D8与新混淆工具R8 22、Comparison of ProGuard vs. R8: October 2019 edition 23、支付宝 App 构建优化解析:Android 包大小极致压缩 24、Redex 25、Redex 初探与 Interdex:Andorid 冷启动优化 26、Dalvik 可执行文件格式 27、InterDex.cpp 贪心算法部分 28、CrossDexRefMinimizer.cpp 跨dex调用优化 29、我是如何通过 nimbledroid 做android app性能优化的 30、XZ Embedded 31、oatmeal 32、SoLoader 33、buck 34、android-native-library-merging-demo 35、Redex优化demo 36、android-chunk-utils 37、ResourceUsageAnalyzer.java 38、Android安装包相关知识汇总 39、安装包立减1M--微信Android资源混淆打包工具 40、AndResGuard 41、Android APK 签名原理 42、西瓜视频apk瘦身之 Java access 方法删除 43、动态下发 so 库在 Android APK 安装包瘦身方面的应用

推荐阅读:

Android “易错” 知识来了! 善于将系统源码为己用,会“抄”也是技能! MVC / MVP / MVVM 到底该如何选?有对错吗?

扫一扫 关注我的公众号 如果你想要跟大家分享你的文章,欢迎投稿~

┏(^0^)┛明天见! 阅读原文 阅读 9458 赞 在看34

写下你的留言 精选留言

冷秋橙月 9 根据本文,我成功将公司APP从3m压缩到了2m开心

hApple 2 真的很极致,世面上找到的基本覆盖全了吧

S 1 仪表盘暗示开车? 作者 1 换了一堆图,没找到合适的,这个放上去感觉还挺清新,就它了

Jowan 1 有用的知识增加了 作者

终于不是奇怪的知识了

和气生财 1 一直在压缩,从未成功过

joker° 1 我不信还有鸿洋不知道的,这些肯定都刻在脑子里了,你铁定在装菜 作者

哈哈,反正学到了

CERT.RSA是对前一步生成的CERT.SF检验,而不是MANIFEST.MF

李健雄

大赞,发现宝藏系列 作者

嗯,这个系列我会慢慢推,特点就是文章长,但是足够深入,也不用完全弄懂,能搞明白几个方案也不错,系列标题包含吹爆系列,大家可以鉴别。

一步两步走

好好学习天天向上

OF

前几天在掘金看了他那个炼狱篇的内存优化,真没看完,长的要死 作者

内存有两篇呀,莫着急,我都看完了,后面也会推送

Justin

反正就是很nb

铭记于心

这个系列可以