● png 转 webp。打包统一压缩图片 ● 资源转 url 下发(图片,so,以及其他资源),启动时预加载 ● 重复资源扫描 md5 ● git hook 提交前检查资源大小(raw/assets/drawable/mipmap),检查重复资源 md5 ● 第三方lib 的整合和依赖约束
AndResGuard
简单来说,arsc 就是一个资源索引表,配置 R 文件从这个索引表找到对应的资源。 arsc 文件的解析:https://github.com/google/android-arscblamer 存在的问题:配置 shrinkResouces true 之后没有完全删除无用的资源

一些无用的 Sring、id、attr、dimen 资源实际还存在于 .arsc 文件
无用的 Drawable、layout 资源,仅仅被替换成了一个空文件
优化思路: ● drawable layout 直接把空文件删掉,同时删除对应 arsc 值 ● 插桩代码记录所有用过的资源,再和 arsc 的资源比对,删掉没用的
实际测试:没有用到的 String: app_name2 仍然存在,2 个空的 layout activity_main2 和 activity_main3 分为存在一个空的 xml 文件
打包时会把 String anim drawable 等资源打包进 arsc 做映射。
解压一个 apk 可以看到有一个 resource.arsc。可以看到有很多类型,而这些就是我们熟悉的 R.array R.attr R.bool 等等,其实 R.jar 存储就是 arsc 中的资源索引。
我们回顾一下 Android 打包的流程:
arsc 文件被 appt(The Android Asset Packaing Tool) 处理生成。这个过程同时也会生成 R.jar。
ResourceTypes.h 定义了 arsc 的结构。
aapt 打包对应的 task: processDebugResources,在这个 task 结束时对 arsc 文件操作 在 build/intermediates/processedres/debug/out 目录下会成一个后缀为 .ap_ 的文件,这个文件解压后变成:
里面由 Manifest.xml,res,和生成的 arsc 组成。
查找重复的资源 遍历 zip 的 entries 以 crc 分组,如果组内的 size 大于 1 就是重复了。 crc 是一个文件的唯一值。 CRC 全称:Cyclic redundancy check(冗余校验码)
R文件 内联 booster R inline :booster/booster-transform-r-inline/
每个 module 都会生成一个 R 文件。 agp 4.1.0 已经做了 自动内联(Android agp 对 R 文件内联支持),4.1.0 里面删除了 默认对 R 的 keep 规则。在 minifyReleaseWithR8 task 中处理。
无用的 asset 资源
Dex 优化 ● 去除 DebugItem: 支付宝 App 构建优化解析:Android 包大小极致压缩
agp 4.2 新增 android.enableResourceOptimizations=true
android.enableResourceOptimizations=true Smaller APKs with resource optimization
Reference
#SmallerAPK #SmallerAPK, Part 1: Anatomy of an APK #SmallerAPK, Part 2: Minifying code #SmallerAPK, Part 3: Removing unused resources #SmallerAPK, Part 4: Multi-APK through ABI and density splits #SmallerAPK, Part 5: Multi-APK through product flavors #SmallerAPK, Part 6: Image optimization, Zopfli & WebP #SmallerAPK, Part 7: Image optimization, Shape and VectorDrawables #SmallerAPK, Part 8: Native libraries, open from APK
23 | 包体积优化(下):资源优化的进阶实践 深入探索 Android 包体积优化(匠心制作-上) Android App包瘦身优化实践
