为啥 Butterknife @Bind 在发布版本中失败(在 proguard 之后)

Posted

技术标签:

【中文标题】为啥 Butterknife @Bind 在发布版本中失败(在 proguard 之后)【英文标题】:Why does Butterknife @Bind fail in release build (after proguard)为什么 Butterknife @Bind 在发布版本中失败(在 proguard 之后) 【发布时间】:2015-09-25 12:58:41 【问题描述】:

我一直在使用 Butterknife 构建一个 android 应用,最近升级到了 7.0.1。我用新的@Bind 功能替换了所有@InjectViewButterKnife.inject 用法,调试版本没有问题,但应用程序在启动时崩溃以进行发布版本。

如果我在 build.gradle 中将“minifyEnabled”切换为 false,那么我可以生成一个工作版本构建。

我正在使用 Butterknife 网站上记录的 proguard 配置,但它似乎对我不起作用。我还在构建中使用 Dagger、Picasso 和 Flurry。

我的 proguard-rules.pro 内容:

# ButterKnife
-keep class butterknife.**  *; 
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder  *; 

-keepclasseswithmembernames class * 
    @butterknife.* <fields>;


-keepclasseswithmembernames class * 
    @butterknife.* <methods>;


# Dagger
-keepclassmembers,allowobfuscation class * 
    @javax.inject.* *;
    @dagger.* *;
    <init>();


-keep class javax.inject.**  *; 
-keep class **$$ModuleAdapter
-keep class **$$InjectAdapter
-keep class **$$StaticInjection
-keep class dagger.**  *; 

# Picaso
-dontwarn com.squareup.okhttp.**

# Flurry
-keep class com.flurry.**  *; 
-dontwarn com.flurry.**

【问题讨论】:

【参考方案1】:

升级到 7.0.1 后我们遇到了类似的问题,但我们得到了 ANR。

问题似乎是因为我们用 ButterKnife 网站上的新推荐选项替换了 Proguard 的 Butterknife 部分。

-keepnames class * @butterknife.Bind *; 添加到 proguard 文件已解决了我们的问题。

【讨论】:

【参考方案2】:

从网站上,http://jakewharton.github.io/butterknife/ 这似乎对我有用:

-keep class butterknife.**  *; 
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder  *; 

-keepclasseswithmembernames class * 
    @butterknife.* <fields>;


-keepclasseswithmembernames class * 
    @butterknife.* <methods>;

【讨论】:

这位来自杰克的官员

以上是关于为啥 Butterknife @Bind 在发布版本中失败(在 proguard 之后)的主要内容,如果未能解决你的问题,请参考以下文章

ButterKnife源码分析

ButterKnife源码分析

Android Studio上方便使用butterknife注解框架的偷懒插件Android Butterknife Z

为啥我的Androidstudio的butterKnife插件不能用?

ButterKnife省略findViewById的原理

Android Studio3.0 配置ButterKnife出错的解决