You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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'
      }
      
  • 第二步:添加适配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

火山引擎 最新活动