随着业务需求的扩展,apk size会不断增加,size太大会影响用户下载和升级的意愿,压缩size是每个大型app必须的工作。
首先来看一下apk的构成:
image.png
主要包含资源和代码,那压缩size就要从这2方面入手。
资源方面
1. 删除无用资源
通过lint
或resource shinking
等删除无用资源
2. 压缩图片
1)无透明度的png
转成jpg
2)通过tingpng, tingjpg
等进行有损压缩,或通过ImageOptim
进行无损压缩
3)在不影响质量的提前下将大图转换成webp
3. 压缩动画
压缩 loading 等gif
动画,及其它较大的资源,如mp3
4. 动态加载
对动态表情等特定业务场景才使用的动画等资源做动态加载,app启动后在线下载,不随apk发包。
5. 使用微信资源压缩方案
方案见 https://github.com/shwenzhang/AndResGuard
代码方面
1. 开启proguard
proguard
不仅能够混淆,而且能够优化代码,可以大大减小dex
文件的大小。
但需要对被反射引用的类需要做好keep
2. 动态加载
对ocr(身份证识别)等较大的库做动态加载,app启动后在线下载,不随apk发包。
3. 插件化
将相对独立的业务做成插件,app启动后在线下载,不随apk发包。
4. 删除非必要的so库
很多app为了支持x86
,apk至少包含arm
和x86
2个ABI,甚至包括arm
其实x86
构架的手机也支持arm
,可以删除x86 so
,只保留arm
。
有人认为x86
手机以兼容模式运行arm so
会影响效率,其实效率上的影响对用户并没有直接的感知。
删除x86 so
可以大大减少apk size
,特别是app集成了很多第三方so库的情况下,如fresco
,rn
等。
关于so的介绍详见Android 动态链接库加载原理及 HotFix 方案介绍
- Facebook字节码优化方案redex
方案见 https://github.com/facebook/redex
其它方面
Android标准打包过程未对so库,arsc等文件进行压缩,打包时可以对这些资源进行压缩,可以压缩好几M的大小。
实践以上方案可大大减小apk size,实测45M降到30M以下~~~
网友评论