🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## apk组成 apk包含应用所有所需资源的 zip 包,它包含了如下所示的几个组成部分: ![](https://img.kancloud.cn/f9/c7/f9c71d660d549d62efa2ca1f487a9c87_477x309.png) ## 图片资源 对安装包内所有PNG图片进行二次无损压缩,列出大小可被进一步压缩的文件及压缩比例。 注:压缩流程是先使用PngCrush工具优化图片,再使用OptiPNG进行无损压缩。 目前是先用pngcrush进行压缩,然后再用optipng进一步压缩 pngcrush工具链接:https://pmt.sourceforge.io/pngcrush/,压缩命令:"pngcrush source dst" optipng工具链接:http://optipng.sourceforge.net/,压缩命令:"optipng -out dst src" ## dex优化 在 AGP 的构建过程中,Java 或 Kotlin 源代码在经过编译之后会生成 Class 字节码文件,在这个阶段 AGP 提供了 Transform 来做字节码的处理,我们非常熟悉的 Proguard 就是在这个阶段工作的,之后 Class 文件经由 dexBuilder 生成一堆较小的 DEX 文件,再经由 mergeDex 合并成最终的 DEX 文件,然后打入 APK 中。具体过程如下图所示: ![](https://img.kancloud.cn/b8/d7/b8d79a6e044663992e00d8ddeaf59776_1080x255.png) 因此,我们针对 DEX 文件的优化时机可以从分别从三个阶段切入,分别是.kt 或.java 源文件、class 文件、DEX 文件: * 在源文件进行处理也就是手动改造代码,这种方式对程序设计本身有侵入,并且有较强的局限性; * 在 class 字节码阶段对开发者无感知,而且基本上能完成大多数的优化,但对于像跨 DEX 引用优化这样涉及 DEX 格式本身的优化无法完成; * 在 DEX 文件阶段进行优化是最理想的,在这个阶段我们除了能对 DEX 字节码本身进行优化,也可对 DEX 文件格式进行操作。 优化的手段总体上来说也就是冗余去除、内容精简、格式优化等方式。 由于早期抖音 class 字节码修改工具建设比较成熟,我们很多包体积的优化都是通过修改 class 字节码完成的,随着优化的深入,后期也有很多优化是在 DEX 文件阶段处理的。关于 DEX 阶段相关的优化我们后续会有相关文章介绍,这里主要介绍 Class 字节码阶段进行的相关优化,主要分为两大类: * 单纯去除无用的代码指令,包括**去除冗余赋值,无副作用代码删除**等 * 除了能减少代码指令数量外,同时减少方法和字段的数量,从而有效减少 DEX 的数量。我们知道 DEX 中引用方法数、引用字段数等不能超过 65535,超过之后就需要新开一个 DEX 文件,因此减少 DEX 中方法数、字段数可以减少 DEX 文件数量,像**短方法内联、常量字段消除、R 常量内联**就属于这类优化。 ## 动态库优化 在一些需要安全高性能的常见,应用中需要采用native来实现。android平台提供了适配各种cpu架构的可能,包括x86 arm mips等,包活arm也有v7 v8等。针对不同cpu我们可以选择打不同包,gradle脚本中通过api也可以限制。或者损失一些性能,只采用arm最低版本也是可以兼容的。对于某些不常用功能,我们也能用动态加载,运行时再下载so到本地。 ## 参考资料 [抖音 Android 包体积优化探索:从 Class 字节码入手精简 DEX 体积](https://juejin.cn/post/7052614577216815134)