包体积优化的一些总结
前言
最近一直在搞包体积的优化,有点点心得
并且在优化的过程中发现了原有工程的各种问题,这里总结一下。
包体积优化的一些手段
Dex 优化
R8 和 ProGuard 配置优化
- R8 目前已经是默认的编译优化工具,只需要 minifyEnable = true
- 基础功能
- code shrink 删减
- obfuscation 混淆
- optimization 优化
- R8 fullMode 模式
- 包体积还可以继续缩减
- 遇到的问题 [R8 fullMode Constructor 问题]
- Gson 解析问题
- kotlin data class
- 解决办法
- -keepclasseswithmembers class * { (…); @com.google.gson.annotations.SerializedName ; }
- 基础功能
- ProGuard 配置优化
proGuard 描述了代码混淆和删减的规则,代码删减直接缩减 dex 体积,代码混淆会使类名、方法名、变量名更短从而缩减 dex 体积。
目前 proGuard 配置存在的一些问题:- 重复
-keepclassmembers class .entities. { ; }
-keepclassmembers class com.xingin.xhs.model.entities.* { *;}
// 范围很大
-keep @Kotlin.Metadata class * { *; } - 删除 kotlin metadata 注解
- kotlin metadata keep 规则导致所有 kotlin 代码被 keep
- 引发了一些负负反而得正的潜在问题(Gson 解析)
- 删除 kotlin Intrinsics
- 优化 optimize 并没有开启
- -dontoptimize:删除这条 keep 规则,才会开启 R8 的代码优化
- optimize 的副作用:插件化打包的内联问题
- 重复
- 隐性存在的反射大家没有在意
需要 Gson 解析的类的成员变量被混淆了,到底对于解析有没有影响?- Gson 的解析,默认依赖反射,除非有注解
- 反射效率和启动耗事问题
R.class 优化
R.class 内的值,可以直接内联