ButterKnife 5.1.1 Proguard混淆报错问题求助
解决ButterKnife 5.1.1 Proguard混淆报错的方案
老哥,我看你在用ButterKnife 5.1.1做Android开发时,混淆阶段碰到了找不到javax.lang.model相关类的警告对吧?这个问题本质是Proguard误把ButterKnife的编译时注解处理器当成了运行时代码来处理——毕竟ButterKnifeProcessor只是编译阶段生成绑定代码的工具,根本不该被打包进APK,更轮不到Proguard去处理它。下面给你一套针对性的解决步骤:
第一步:修正依赖配置,隔离编译时处理器
首先要确保ButterKnife的注解处理器是仅编译时依赖,不会被打包到最终APK里:- 如果你用的是旧版Gradle(Android Plugin 2.x及以下),把处理器依赖标记为
provided:dependencies { compile 'com.jakewharton:butterknife:5.1.1' provided 'com.jakewharton:butterknife-processor:5.1.1' } - 要是用的是新版Gradle(3.0+),就用
annotationProcessor替代provided:dependencies { implementation 'com.jakewharton:butterknife:5.1.1' annotationProcessor 'com.jakewharton:butterknife-processor:5.1.1' }
- 如果你用的是旧版Gradle(Android Plugin 2.x及以下),把处理器依赖标记为
第二步:添加适配5.1.1版本的Proguard规则
在你的proguard-rules.pro文件里加入以下规则,避免Proguard误处理ButterKnife核心类、生成的绑定类和注解:# ButterKnife 5.x 专属Proguard规则 -keep class butterknife.** { *; } -dontwarn butterknife.internal.** -keep class **$$ViewInjector { *; } # 保留带InjectView注解的字段 -keepclasseswithmembernames class * { @butterknife.InjectView <fields>; } # 保留带ButterKnife点击/长按等注解的方法 -keepclasseswithmembernames class * { @butterknife.OnClick <methods>; # 如果你还用了其他注解,比如OnLongClick,按需添加 # @butterknife.OnLongClick <methods>; }简单解释下:
-dontwarn butterknife.internal.**直接忽略处理器相关的警告,因为它本来就不属于运行时代码**$$ViewInjector是ButterKnife自动生成的绑定类,必须保留不混淆,否则运行时会找不到绑定逻辑- 最后两个规则确保带ButterKnife注解的字段和方法不会被Proguard移除或混淆
第三步:清理重构项目
做完上面两步后,先执行Build -> Clean Project,再Rebuild Project,最后重新运行混淆打包流程,那些找不到类的警告应该就消失了。
另外提一句,ButterKnife 5.1.1确实是比较老旧的版本了,后续如果碰到更多兼容性问题,考虑升级到较新的稳定版本会更省心,但上面的方案足以解决你当前的混淆问题。
内容的提问来源于stack exchange,提问作者Nuwan Withanage




