Android测试模块类加载器混淆导致kotlin.Result伴生对象缺失怎么解决?
解决方案
可根据项目实际需求选择以下任意方案解决问题:
- 方案1:在App模块的混淆规则中保留伴生对象
在:app模块的proguard-rules.pro(或项目自定义的混淆规则文件)中添加如下规则,避免kotlin.Result的伴生对象被混淆裁剪:
该方案改动量最小,无需调整测试逻辑,仅会在App包中增加极少量的类体积,适配绝大多数场景。-keep class kotlin.Result$Companion { *; } - 方案2:为测试模块配置独立的混淆规则
在:test模块的混淆配置中添加规则,强制将测试模块用到的kotlin.Result相关类设置为不混淆,或混淆为和App模块不同的命名,避免类名冲突:
测试模块的-keep class kotlin.Result { *; } -keepclassmembers class kotlin.Result { *; }kotlin.Result类名和App模块混淆后的类名不一致后,类加载器会自动加载测试模块中对应的类,无需修改App模块的任何配置,也不会影响App的最终包体积。 - 方案3:规避对伴生对象的直接依赖
调整测试代码逻辑,将所有用到kotlin.Result.Companion的操作封装为自定义的工具方法,不直接引用伴生对象类,从根源上消除对被裁剪类的依赖。 - 方案4:修改测试类加载优先级
自定义测试Runner,重写getClassLoader方法,将测试APK的dex路径放到类加载路径的最前面,强制优先加载测试模块的类。该方案适配性强,但需要自定义测试组件,改动量相对更大。
内容的提问来源于stack exchange,提问作者tynn
相关产品推荐
相关产品推荐

