Android Apk瘦身
本文链接:https://blog.youkuaiyun.com/feather_wch/article/details/131673130
文章目录
组成部分
1、Apk内容
- dex文件
- debug有多个dex,方法数超过65535
- release可能就一个,开启了混淆会变少
- res:包含未编译到resources.arsc中的资源(图片、音视频)
- resources.arsc中的资源(图片、音视频) 映射文件, 帮助从ID找到资源文件
ID = 0x7ffxxff,default = ‘res/drawable/xxx.xml’
- 第三方库文件:kotlin、okhttp3
- META-INF:签名文件CERT.RSA和CERT.SF(1.0签名版本才会有)、MANIFEST.MF清单文件
- AndroidManifest.xml - 都会经过aapt编译,记事本打开是乱码
- assets:资产目录,可以用AssetManager对象检索这些资源
2、只有AndroidManifest文件,没有dex和res文件都是合理合法的,只是没有意义
瘦身手段
Android Size Analyzer
3、插件 Android Size Analyzer 的使用
- install
- Analyze->Analyze App Size…
- 产生建议
- png -> webp // 图片右击convert to webp,减少66%大小
- enable proguard // 开启混淆,proguard-rules.pro写混淆规则,不混淆的keep
- x
shrinkResources
4、资源缩减
- 资源缩减:build.gradle中minifyEnabled+shrinkResources
andorid{
buildType{
release{
minifyEnabled true // 资源优化 + 混淆
shrinkResources true
}
}
}
- 把没用的资源变得非常小,删除了内容,可能几十Byte
keep.xml
5、自定义keep资源配置
- src/main/res/raw/keep.xml中keep列表和discard列表
- 指明需要保留的资源和需要优化的资源
Lint工具
也会读取keep.xml文件
Lint
6、Lint工具
- Analyze->Run Inspection by Name->unused resources
- 只会检查没有直接使用的资源,间接的没办法发现:反射
- 删除前全局搜索一下
备用资源
7、备用资源是什么?
- 不同语言都有各语言的资源
- 可以删除无用的语言的资源,string文件等等
- androidx.appcompat等包会引入很多语言的资源
8、移除无用的备用资源
defaultConfig{
resConfig 'zh-rCN'
}
- 会保留zh、zh-rCN、default三种资源
动态库打包配置
- so放到jniLibs
- build.gradle中defaultConfig
ndk{
abiFilters 'armeabi-v7a'
}
- 过滤掉无用的so
productFlavor和splits
1、根据市场打包出包含不同so的apk,分别交给应用商店
- 根据设备硬件,选择对应apk下载安装
2、splite干嘛的
矢量图
1、SVG的场景
- svg适合小图标,需要更多的时间去绘制。
- svg本身就小 png 1/2。
- 做点击变色效果,svg修改color就可以了。png需要两张。
- tint和svg配合效果更好,tint填充非透明部分,有些png效果不好
AndResGuard原理
3、AndResGuard的原理
- 主要是处理arsc文件,里面是映射关系。
- 混淆处理后apk没有res文件,只有r文件夹,看不到原来的资源文件
- arsc中存储的name混淆为res/a/b.xml后,体积更小
- AndResGuard实现步骤:
- ZipFile解压缩文件:
- 读取res文件,目录和文件改名,如r/a/a.png
- 处理arsc文件,从stream中读取成byte[],按照arsc格式要求处理【手把手解析resources.arsc】,将映射后的name改成 r/a/a.png实现混淆
4、怎么操作apk下面的文件:
- ZipFile+ZipEntry解压缩 apk,遍历
5、阿里debugItem优化方案
- dex中debugitem对运行没有影响,可以删除。
- 删除方案:
AndResGuard的使用
- 根目录build.gradle配置classpath
- module的build.gradle中apply plugin引入插件
- 配置andResGuard{各种开关}
- whitelist:白名单不能混淆App图标,通知栏,桌面相关的图标,反射后资源不能混淆
- 右侧gradle会生成任务
使用
Apk瘦身总结
2、 apk瘦身总结:
- 依赖按需加载,加载精简版本依赖如protubuf-lite
- 开启r8/混淆
3.不常见模块用插件化加载
4.避免使用枚举,用@intdef - 开启资源混淆 AndResGuard微信开元工具
6.支付宝 删除 dex debugitem
7.发布于谷歌的使用aab
8.webp,svg
9.去除资源
10.so分开打包
11.去除备用资源(国际语言)