AGP 8.0下proguard-rules的-dontwarn规则失效问题求助
升级Android Gradle Plugin(AGP)8.0后,执行minifyReleaseAndroidTestWithR8构建步骤时触发以下编译错误:
运行R8时检测到缺失类,请添加缺失类或应用C:\Users...\app\build\outputs\mapping\releaseAndroidTest\missing_rules.txt中生成的额外保留规则。
缺失类io.reactivex.Flowable(引用自io.realm.BaseRealm.asFlowable()等6处)
缺失类io.reactivex.Observable(引用自io.realm.RealmList.asChangesetObservable()等4处)
缺失类java.lang.ClassValue(引用自com.google.common.util.concurrent相关方法等4处)
已知AGP 8.0之前这类缺失类仅为警告,升级后变为错误。按照提示将missing_rules.txt中的规则添加到proguard-rules.pro:
-dontwarn io.reactivex.Flowable -dontwarn io.reactivex.Observable -dontwarn java.lang.ClassValue
但新增的-dontwarn规则完全无效,后续构建仍报相同的“缺失类”错误。已尝试清理项目、重启Android Studio、清除缓存等操作,均无效果;给规则添加.**后缀也没用。
proguard-rules.pro中已有一条-dontwarn sun.misc.Cleaner规则可正常生效:移除该规则会出现sun.misc.Cleaner缺失类警告,恢复后错误消失,说明-dontwarn规则本身没有问题。
禁用minifyEnabled后,构建可正常完成。其中两个缺失的io.reactivex类来自Realm的引用,不确定是否相关。求可行的解决思路。
附当前proguard-rules.pro内容:
-dontwarn sun.misc.Cleaner # 这条规则生效 -dontwarn io.reactivex.Flowable # 无效 -dontwarn io.reactivex.Observable # 无效 -dontwarn java.lang.ClassValue # 无效 # 不要混淆通过JSON导入/导出的RealmObject字段名 # 例如design和project及其子类 -keep class com.something.model.design.** { <fields>; } -keep class com.something.model.project.** { <fields>; } # 不要混淆BracingButtonBar的ViewBinding类中的字段 -keep class com.something.databinding.BracingButtonBarBinding { <fields>; } # 没有这条规则:BracingButtonBarBinding.class.getDeclaredFields()无法返回CheckImageButtons的字段 # 会导致BracingButtonBar.getButtons()失效 # 不要混淆FretboardValuesDialog的ViewBinding类中的字段 -keep class com.something.databinding.FretboardValuesDialogBinding { <fields>; } # 没有这条规则:弹出FretboardValuesDialog时会崩溃 -keepattributes *Annotation*, Exceptions # 在堆栈跟踪中保留源文件名和行号 -keepattributes SourceFile, LineNumberTable # 内部类的反混淆似乎不起作用,这条规则或许有用? -keepattributes InnerClasses
内容的提问来源于stack exchange,提问作者Clo Knibbe

