APK瘦身
APK文件的构成
- META-INF/:包含CERT.SF和CERT.RSA签名文件,和MANIFEST.MF清单文件;
- assets/:不需编译的资源文件;
- res/:包含需要编译到resource.arsc,但还未编译的资源;
- lib/:包含特定于处理器软件层的已编译代码armeabi等;
- resource.arsc:包含已编译的资源;
- classes.dex:我们的代码;
- AndroidManifest.xml:核心Android清单文件。
瘦身方法
移除未使用资源
可以通过IDE提供的建议,和lint检查工具检测出未使用的资源、无用的import、字段、方法、类,然后删掉。
如何保护必须资源
lint 工具不会扫描 assets/ 文件夹、通过反射引用的资源或已链接至应用的库文件。此外,它也不会移除资源,只会提醒您它们的存在。
那么有些资源暂时用不到,我们又需要保留的,可以通过创建一个包含<resources>的xml文件:
|  |  | 
- tools:keep 指定每个要保留的资源;
- tools:discard 指定要舍弃的资源;
这两个属性都接受逗号分隔符和*号通配符。
启用资源缩减
- minifyEnabled,开启代码混淆;
- shrinkResources,开启资源缩减。
指定本地化语言
如果使用了包含了语言的库(如AppCompat),那么打包的时候会把所有已翻译的语言的字符串都打包进去。
所以我们可以指定需要的语言来缩减apk体积:
|  |  | 
指定需要的动态库so
|  |  | 
armeabi-v7a兼容arm64架构,但是不如arm64的so性能高。我们可以配合productFlavor和flavorDimensions来分别针对arm和arm64设备来打包。
图片瘦身
可以使用webp替代png和jpg,可以使用VectorDrawable矢量图替代应用图标。
可以通过ImageView的tint属性前台改色,达到复用图片的目的。
开启本地库压缩
|  |  | 
当android:extractNativeLibs = true时,gradle打包会对工程中的so进行压缩,使最终生成的apk体积变小。但用户在安装过程中,系统会对so库解压,从而造成apk安装时间变长。