包体积优化

2019-09-30  本文已影响0人  修塔寻千里

为什么需要优化包体积

包体积与性能

包体积优化

海外Google Play市场,可以根据用户的ABI、density和language发布,也可以使用App Bundle。


1、代码

ProGuard

仔细检查配置文件,尤其是第三方SDK,是不是存在过度keep的现象。一般来说,应用都会keep住四大组件以及View的部分方法,这样是为了再代码和XML布局中可以引用到它们。事实上,我们完全可以把非exported的四大组件以及View混淆,但是需要完成下面几个工作:

去掉Debug信息或者去掉行号


DebugItem里面主要包含两种信息:

Dex分包

如下图所示如果将Class A与Class B分别编译到不同的Dex中,由于method a 调用了method b,所以在classes2.dex中也需要加上method b的id。



因为跨dex调用造成的这些冗余信息,它对Dex的大小会造成如下影响:

Dex压缩

逆向Facebook的App时会惊讶的发现,它只有一个700多KB的Dex,事实上Facebook APP的dex只是一个壳,真正的代码都放到assets下面,它们把所有的Dex都合并成同一个secondary.dex.jar.xzs文件,并通过XZ压缩。
XZ压缩算法和7-Zip一样内部使用的都是LZMA算法,对于Dex格式来说,XZ的压缩可以比Zip高30%左右。这套方案似乎存在一些问题:

2、Native Library

Library压缩

跟Dex压缩一样,Libray优化的有效方法就是使用XZ或者7-Zip压缩。Facebook有一个So加载的开源库SoLoader,它可以跟改套方案配合使用。和Dex压缩一样,压缩方案的主要缺点在于首次启动的时间,毕竟对于低端机来说,多线程的意义不大,一次我们要再包体积和用户体验之间做好平衡。

Library合并与裁剪

AndResGuard工具

1、资源混淆

ProGuard的优化核心主要有三个:Shrink、Optimize和Obfuscate,也就是裁剪、优化和混淆。资源混淆的思路其实非常简单,就是把资源文件和文件的名字混淆成短路径,这样做有如下优化作用:

2、极限压缩

资源合并

在资源混淆方案中,发现资源文件的路径对于resources.arsc、签名信息以及ZIP文件信息都会有影响,而且资源文件数量非常之多,导致这部分体积非常客观。
那我们能否将所有资源文件都合并成同一个大文件,这样做肯定会比资源混淆方案更好。事实上大部分的换肤方案也是采用这个思路,这个大资源文件就相当于一套资源文件。

无用资源

上一篇 下一篇

猜你喜欢

热点阅读