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

时间:2015-07-07 20:34:08

标签: android bind proguard butterknife

我一直在使用Butterknife构建Android应用程序,最近升级到7.0.1。我将所有@InjectViewButterKnife.inject用法替换为新的@Bind功能,并且在调试版本中没有任何问题,但应用程序在启动时崩溃,因为发布版本。

如果我在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.**

2 个答案:

答案 0 :(得分:10)

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

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

-keepnames class * { @butterknife.Bind *;}添加到proguard文件修复了我们的问题。

答案 1 :(得分:7)

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

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

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

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