Android Studio 3.1编译Debug变体时ProGuard规则截断警告排查求助
嘿,我来帮你捋捋这个问题——我之前也碰到过类似的情况,尤其是在升级AS版本后,ProGuard的警告经常会出现这种截断或者找不到对应规则的迷惑状况。
问题根源分析
这个截断的警告Warning: The rule -keep public class extends java.lang.annotation.Annotation {一看就是规则语法不完整,大概率是某个ProGuard规则文件里的这行代码有语法错误(比如和extends之间缺了空格,或者没写闭合的}`)。你自己项目里找不到匹配的规则,主要有这几个原因:
- 依赖库自带的ProGuard规则出问题:Android Studio编译时会自动合并所有项目内和第三方依赖库的ProGuard规则,错误规则很可能来自某个你引入的第三方库。
- AS 3.1的ProGuard解析bug:这个版本相对老旧,对有语法错误的规则进行警告时,可能存在信息截断的问题,没法完整显示规则所在的文件路径。
- Debug变体意外开启了混淆:虽然默认Debug模式是关闭混淆的,但如果你的
build.gradle里手动开启了minifyEnabled true,或者某些插件强制触发了混淆规则检查,也会出现这个警告。
排查解决思路
先确认Debug模式的混淆配置
打开app模块的build.gradle,找到buildTypes下的debug块,检查minifyEnabled是不是设成了true。如果是,先改成false试试,要是警告消失了,说明就是Debug模式触发了混淆规则检查。导出合并后的所有ProGuard规则
你可以通过Gradle命令导出所有被合并的规则(包括项目和依赖库的),这样就能定位到错误规则的来源:
在Terminal里执行:./gradlew app:printConsumerProguardFiles这个命令会输出所有被加载的ProGuard规则文件路径和内容,你直接搜索
extends java.lang.annotation.Annotation这个片段,就能找到那个不完整的规则行,以及它来自哪个依赖库的规则文件。定位并处理有问题的依赖库
找到错误规则的来源后,你有几种处理方式:- 查看该依赖库是否有更新版本,通常作者会修复这类低级的规则语法错误;
- 临时在你的项目
proguard-rules.pro里添加一条正确的规则来覆盖错误的:-keep public class * extends java.lang.annotation.Annotation { *; } - 如果该库的规则影响不大,也可以在依赖声明里排除它的ProGuard规则(不过不推荐,可能导致该库混淆出问题)。
升级AS或Gradle插件
Android Studio 3.1是比较老的版本了,后续版本修复了不少ProGuard相关的解析bug,包括警告信息截断的问题。升级到更高版本的AS和对应的Gradle插件,不仅能解决这个警告显示的问题,还能避免其他兼容性坑。
按照这些步骤一步步排查,应该能很快找到问题根源并解决。如果还是卡壳,可以把导出的合并规则里的相关片段贴出来,我再帮你深挖。
内容的提问来源于stack exchange,提问作者j2emanue

