Jenkins执行:app:minifyReleaseWithR8失败 开启minifyEnabled报错如何解决?
问题产生原因
错误指向自动生成的aapt混淆规则文件/app/build/intermediates/aapt_proguard_file/release/aapt_rules.txt第316行存在语法错误,该行内容为-keepclassmembers class * { *** @{listner::onNextClickListner}(android.view.View); },其中@{listner::onNextClickListner}是无效的混淆规则语法,R8校验不通过导致编译失败,具体根因如下:
- 布局文件存在拼写错误:你在xml布局中使用Data Binding的点击事件绑定时,监听器名称拼写错误,把正确的
listener::onNextClickListener错写为listner::onNextClickListner(两处少了字母e),AAPT处理布局时无法正确解析该错误占位符,直接把@{xxx}格式的占位符原样写入了自动生成的混淆规则文件。 - 仅开启混淆时触发报错:
minifyEnabled开关控制是否开启R8压缩混淆,只有开关为true时,R8才会加载并校验所有混淆规则的语法,所以你之前debug模式关闭混淆时不会触发错误,开启混淆后就会报错,Jenkins构建走release包默认开启混淆所以触发失败,本地未触发大概率是本地构建缓存了旧的正确规则文件。
修复方案
- 修正布局拼写错误
全局搜索项目所有xml布局文件中的listner::onNextClickListner字符串,将其修正为正确的监听器方法名称,同时检查是否存在其他拼写错误的Data Binding方法引用。 - 清理构建缓存
执行清理命令删除旧的构建产物,避免错误的混淆规则被复用:./gradlew clean - 紧急规避方案(仅临时使用)
如果需要快速打包暂时找不到错误布局,可以在模块级build.gradle的android配置块中添加如下配置,关闭AAPT自动生成混淆规则的功能:
android { aaptOptions { additionalParameters "--no-proguard-rules" } }
注意:该配置会关闭AAPT自动生成布局相关混淆规则的能力,你需要手动将所有和布局、Data Binding相关的keep规则添加到自定义的proguard-rules.pro文件中,否则release包运行时可能出现类/方法找不到的崩溃问题,不建议长期使用。
4. 验证修复
临时将debug模式的minifyEnabled改为true,执行debug构建验证问题是否解决:./gradlew assembleDebug
验证通过后恢复debug的配置,提交代码到Jenkins重新执行构建即可。
内容的提问来源于stack exchange,提问作者abrar ul haq
相关产品推荐
相关产品推荐

