APK包体积优化

APK包的主要结构如下图,对于大部分项目中文件实际占用空间大小排序正如图中从上到下。
APK包体积优化_第1张图片

代码

  • 开启Proguard,一方面可以降低代码被反编译后的可读性,另一方面也可以减小包体积。
  • 删除debug信息,参考支付宝方案:支付宝 App 构建优化解析:Android 包大小极致压缩

Dex:

  • dex分包优化,跨dex调用会导致method id等信息需要同时存在于调用与被调用的dex文件中,这就造成了信息冗余,所以就需要尽量减少跨dex的调用
  • dex压缩,参考Facebook方案,Facebook App 的 classes.dex 只是一个壳,真正的代码都放到 assets 下面,他们把所有dex文件合并成了一个文件secondary.dex.jar.xzs,并通过xz压缩

so文件:

  • 只保留一个abi平台,如armeabi-v7a

  • 尽量使用精简版so,只保留自己项目中使用到的功能

  • 检查是否存在多个动态库都依赖了STL,如果存在则应该采用动态链接的方式而非多个动态库都去静态链接STL

  • 搜索apk中未经裁剪的动态库文件,动态库经过裁剪之后,文件大小通常会减小很多

资源文件:

  • 开启资源混淆:
    1、因为资源索引文件 resources.arsc 需要记录资源文件的名称与路径,使用混淆后的短路径 res/s/a,可以减小文件大小
    2、metadata 签名文件。签名文件 MF 与 SF都需要记所有文件的路径以及它们的哈希值,使用短路径可以减小这两个文件
    3、apk打包基于zip压缩,zip压缩格式需要记录每个文件 Entry 的路径、压缩算法、CRC、文件大小等信息。使用短路径,本身就可以减少记录文件路径的字符串大小。

  • 虽然AndroidStudio支持 lint 和 shrinkResources 功能,在打包过程中会将未引用资源替换成同名的空文件,但文件名称与路径还是被记录在resources.arsc中了,所以依然建议主动删除项目中未引用的资源,从而减小resource.arsc文件大小。

    Lint 作为一个静态扫描工具,它最大的问题在于没有考虑到 ProGuard 的代码裁剪。在 ProGuard 过程我们会 shrink 掉大量的无用代码,但是 Lint 工具并不能检查出这些无用代码所引用的无用资源。

  • 搜索不含alpha通道的png文件,可以将其转换成jpg格式减小文件大小。

  • 搜索冗余的文件,对于两个或多个内容完全相同的文件,应该只保留一个。

  • 资源合并,将所有资源文件合并成一个大文件。

你可能感兴趣的:(性能优化)