# Andorid 性能优化-包体积优化

By [祖安钢琴家](https://paragraph.com/@0x87aa0fbf311ea1e2f7f8a5be878ebc84780a3956) · 2021-12-14

---

基本优化
----

● png 转 webp。打包统一压缩图片 ● 资源转 url 下发（图片，so，以及其他资源），启动时预加载 ● 重复资源扫描 md5 ● git hook 提交前检查资源大小（raw/assets/drawable/mipmap)，检查重复资源 md5 ● 第三方lib 的整合和依赖约束

arsc 优化
-------

### 混淆

AndResGuard

### 无用资源删除

简单来说，arsc 就是一个资源索引表，配置 R 文件从这个索引表找到对应的资源。 arsc 文件的解析：[https://github.com/google/android-arscblamer](https://github.com/google/android-arscblamer) 存在的问题：配置 shrinkResouces true 之后没有完全删除无用的资源

![](https://storage.googleapis.com/papyrus_images/d330bd20f6c7f1b735660b6f27e538a058e5f7fb049c1830c16a10042f18bf41.png)

1.  一些无用的 Sring、id、attr、dimen 资源实际还存在于 .arsc 文件
    
2.  无用的 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包瘦身优化实践

---

*Originally published on [祖安钢琴家](https://paragraph.com/@0x87aa0fbf311ea1e2f7f8a5be878ebc84780a3956/andorid)*
