添加ProGuard规则后APK体积异常增大的原因排查求助
依赖递归保留的量级差异:你的Demo几乎没有业务代码,当通过
-keep class com.pax.neptunelite.api.Nepcore{*;}强制保留该类所有成员时,ProGuard会递归追踪并保留这个类直接、间接依赖的所有类、方法甚至关联资源——这些内容原本在空规则下都会被判定为无用代码/资源而移除。而其他大项目本身已经因为业务功能包含了这些依赖类的大部分,新增的被保留内容极少,所以体积增长幅度很小。Dex分包与代码复用的差异:小项目代码量少,D8/R8在处理dex分包时,会把Nepcore及其所有依赖打包进新的dex文件,这些新增dex的体积就是Jar包中未被移除的核心内容总和。而大项目已有大量代码,Nepcore的依赖类很多已经被合并到现有dex中,不会额外新增大体积的独立dex块,同时大项目的代码复用率更高,避免了重复打包相同类。
资源收缩的连锁效应差异:你开启了
isShrinkResources,空规则下Demo的冗余资源会被彻底清理。但保留Nepcore后,它关联的所有资源(如内部用到的布局、字符串、原生库等)都会被强制保留,这些资源对小项目来说都是全新的,直接推高了APK体积;而大项目可能已经在其他模块用到了部分关联资源,新增的资源量微乎其微。无用代码移除的效率差异:小项目本身没有多少业务代码,空规则下D8/R8会移除Jar包中几乎所有未被引用的代码。但
-keep规则强制保留Nepcore的所有成员后,Jar包中原本被判定为无用的大量代码(包括Nepcore依赖的底层类、工具类等)都被保留下来,相当于把Jar包的大部分有效内容都塞进了APK;而大项目中这些依赖类很多已经是业务必需的,不会因为这条规则额外新增太多无用代码。
内容的提问来源于stack exchange,提问作者Mirko

