APK包体积优化

APK包的主要结构如下图,对于大部分项目中文件实际占用空间大小排序正如图中从上到下。
在这里插入图片描述

代码

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格式减小文件大小。

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值