为何显式调用构造函数时R8仍移除MyDateRequest类?
R8移除显式调用类的原因分析
以下是几种可能导致该问题的原因:
MyUseCase的foo方法被判定为未使用:如果
foo方法没有被任何代码路径实际调用(比如是private方法且未被本类其他方法引用,或者MyUseCase的实例从未被创建并调用foo),R8会将整个foo方法标记为无用代码移除,连带里面的MyDateRequest构造调用也会被删除。此时MyDateRequest没有其他被引用的地方,自然会被R8清理掉。MyDateRequest的实例未被实际使用:如果在
foo方法中只是单纯调用new MyDateRequest(),但没有将创建的实例赋值给变量、作为参数传递,或者调用实例的任何方法/属性,R8会认为这个实例的创建是无意义的冗余操作,会直接优化掉该构造调用。失去唯一引用的MyDateRequest类就会被移除。混淆规则存在冲突或遗漏:检查你的混淆配置文件,如果存在针对
MyDateRequest所在包的全局移除规则,或者某些自定义规则覆盖了R8默认的“显式调用保留”逻辑,可能会导致R8强制移除该类。另外,如果配置了-allowaccessmodification等激进优化选项,也可能影响R8的保留判断。R8的激进优化层级触发:在release构建中,R8默认会启用更高层级的优化,比如跨方法的无用代码分析。如果
MyUseCase所在的调用链最终没有关联到应用的入口点(比如Activity、Service等组件),R8可能会将整个调用链判定为无用,进而移除相关类。
内容的提问来源于stack exchange,提问作者Lavan
相关产品推荐
相关产品推荐

