APK瘦身
减少apk大小主要从代码、图片、so库、其他资源等方面进行优化;
-
首先我们可以通过Gradle配置
-
开启代码混淆(minifyEnabled)和资源压缩(shrinkResources)功能;这个配置可以在打包时将项目中无用的代码和资源删除,所谓的删除不是真正的删除,而是将资源内容清空
-
然后可以将不需要的平台so库以及语言资源通过配置不打进apk包中
-
ndk{ abiFilters “armeabi-v7a”}
-
resConfigs “en”
-
splits:打特定包
-
-
-
在图片方面:
-
我们可以使用占用空间更小的图片格式,比如webp、svg等
-
非必要的图片不要内置app,而是通过网络下载到本地后再显示
-
对于不同屏幕分辨率的设备,只适配主流分辨率
-
-
so库我们也可以通过远程下载到本地再进行动态加载
- so库动态加载方案主要有两种,一种是像Tinker那样启动时优先加载so库下载目录,如果不存在才去加载apk内的;另一种是通过反射修改DexClassLoader中的DexPathList的属性中存放so路径的List,将下载的so路径添加到列表最前面
APK打包流程
AndroidStudio作为UI工具->通过Gradle命令执行打包流程->Gradle通过build-tool等各种命令进行打包
-
使用aapt命令打包资源文件并生成生成R.java文件
-
使用aidl命令将aidl文件转成java文件
-
使用dex命令将所有class文件打包成dex文件
-
使用apkBuilder命令将所有资源文件打包成apk文件
-
使用jarsign命令对apk文件进行签名
-
使用zipalign命令对apk文件进行4k对其
APK签名
了解各个版本APK签名原理的意义在于往apk中写入渠道信息,完成批量多渠道打包任务
-
V1:对apk里的的每一个文件记录它的唯一值(SHA-256)防止被修改,并保存到
MEFT-INFO
文件夹下的签名信息文件(MANIFEST.MF)中,但是验证签名时对于MEFT-INFO
文件夹下的文件却不会校验;所以可以批量打包时往apk文件的MEFT-INFO
文件夹下添加渠道信息文件 -
V2:在V2版本中,为了避免V1中存在的问题,它对整个apk包进行校验,并把校验信息存放到存放压缩包信息的地方,开辟了一块空间;这块空间时以键值对的形式存放数据;所以我们也可以通过读取这块区域信息,以键值对的形式插入我们的渠道信息
-
V3:整体方案还是跟V2一样,它支持在修改签名文件后也能覆盖安装旧版app;实现原理就是签名信息里会存放旧版的签名信息,只要apk安装时检测到旧版签名信息跟v3里记录的旧版签名信息一致就可以覆盖安装