Android的极致瘦身
删除无用代码
代码也是占用apk的大小,而且有部分代码引用一些无关的资源,然而你想删除这部分资源必须删除特定的代码
资源压缩
- 第一个压缩是通过TinyPNG网站进行压缩的。这里的压缩也有个好处,当你图片格式选择
BitmapFactory.decodeByteArray(b, 0, b.length, opt);
opt.inPreferredConfig = Bitmap.Config.RGB_565;
或者inPreferredConfig不填时,占用内存会小3/4.这个会对通道有影响,但是在大部分图片的现实没有问题
- 图片格式的选择,大图可以选择使用webp的格式,可以很好的压缩图片大小,但是有个兼容性的问题:Android4.0到Android4.2.1之间的版本不支持无损压缩和透明格式的WebP图片的编解码,这个需要也可以解决使用通用自己的webp格式decode,但是这也会增加包大小,当图片很多时,可以采取这种方式。我打的so有82K,自己权衡吧,我觉得值的。
- .9图之坑,apk打包的时候会把.9图转成png,这时会无形中增加3倍图片大小.如果一张很大的.9图,最好放在网上,能不用大的.9图就不用.9图,放在外网时需要对.9图做特殊处理。
- 合并项目中一样的图,如关闭按钮等,删除一样的图
- 将一些不是很重要的图放服务器下载,有可能的话使用webp,放网上也能节省流量。我这里是剔除了所有大于10K的图。
- 使用cocosjs的朋友,可以将打成的图集过下TinyPNG,能节省不少。
- 资源尽量放在drawable-xhdpi中,一些适配的资源可以单独抽出来放,大部分资源没必要放很多
- 如果支持的so的版本不多的话尽量放在armeabi中,不使用其他的so,如果不能的话,会有一个压缩的库供大家选择,下面会具体介绍的,so可以使用7Z再次压缩。有compile的包使用如下的代码放gradle
ndk {
// 设置支持的SO库架构
abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}
gradle优化和工具使用
- 在gradle使用minifyEnabled进行Proguard混淆的配置
android {
buildTypes {
release {
minifyEnabled true
}
}
}
- 开启shrinkResources去除无用资源
android {
buildTypes {
release {
shrinkResources true
}
}
}
- 清理无用资源
通过Android Studio自带的 “Remove Unused Resources”小插件来实现了,但是在某些大型项目上这个是不好使的。删除后很大概率编译失败或部分页面挂死、无图等问题。 - 删除无用的语言资源
android {
defaultConfig {
resConfigs "zh"
}
}
- 微信资源压缩打包工具通过短资源名称,采用7zip对APP进行极致压缩实现减小APP的目标,效果非常的好。建议开启7zip,注意白名单的配置
- 针对so的7z压缩方案,如果项目so多的话,可以节省很多空间。
https://github.com/liyuming1978/NativeLibCompression - 支持插件化,这个需要拆分代码,我们还在努力拆分中。
插件化技术支持动态的加载代码和动态的加载资源,把APP的一部分分离出来了,对于业务庞大的项目来说非常有用,极大的分解了APP大小。
因为插件化技术需要一定的技术保障和服务端系统支持,有一定的风险,如无必要(比如一些小型项目,也没什么扩展业务)就不需要了,建议酌情选择
- 清理第三方库和冗余代码,比如httpclient4.3 jar等等公共基础库
- Facebook的redex优化字节码
另外,据反应redex后会有崩溃的现象,这个要留意一下,我这里压缩之后都是可以正常运行的
综上:我们原来49M左右大小的包 优化后大约34.27M