随着功能的迭代,我们的APP体积也越来越大,因此在保证功能正常的情况下尽可能的降低包体积是一个必须要面对的问题。
APK的组成结构
通过上图可以看出APK体积包主要包含:dex字节码文件、META-INF签名信息文件、manifest文件、res资源文件、lib包文件、resources.arsc 记录资源文件和资源 ID 之间的映射关系的文件和assets 资源文件(图片中未包含)。其中可以直接或者间接修改的是dex文件、res文件、assets 资源文件以及lib包中的文件。
降低包体积的方案
1.使用Lint去除无用的资源文件,操作步骤是Analyze -> Run Inspection by Name -> 输入框输入 Unused resources 就可以扫描工程找到未使用的资源了
2.gradle配置去除无用的资源文件或者开启混淆去除无用的代码
buildTypes {
release {
//去除无用资源
shrinkResources true
/开启混淆
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
注意:反射方式调用的资源会有问题。
3.资源方面手写的xml资源替代UI给的套资源,从而减少资源占用大小。
4.资源重用,比如倒三角图片,当我们需要正三角图片时可以使用动画等方式实现,这样一来就减少了一套资源。
5.针对png jpeg等资源进行压缩,使用Tinypng等在线工具无损压缩图片,降低资源大小。
6.使用webp图片,webp图片提供有损压缩,资源占用较小。使用Android Studio自带的方式将图片转换成webp格式。
7.使用AndResGuard工具对资源进行混淆,不仅提高资源安全性,也能配合7z压缩,降低资源大小。
8.国内应用只保留中英语音,降低资源占用
android {
...
defaultConfig {
....
resConfigs "en", "zh-rCN"
}
}
9.去除非必要的so资源,目前市面上绝大部分的CPU架构都是 ARMv7/ARMv8,所以可以在gradle中加入配置,只保留v7,v8。
defaultConfig {
...
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
10.按需加载so文件,使用System.load()方式动态加载so文件,这样就可以将so文件挂载在服务器上,按需下载,从而达到降低包体积效果。
11.插件化架构,将功能模块apk挂载到服务器上,使用到再去下载。