如何为ButterKnife 8配置ProGuard设置?

时间:2017-03-24 14:07:12

标签: android android-proguard butterknife

我在Android应用中运行ButterKnife版本8.5.1。如果我尝试为ButterKnife进行ProGuard设置,我的发行版本仍然会崩溃。有issue on the official ButterKnife Github page告诉您进行以下设置:

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

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

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

或者写它是为了使用这些设置:

# Butterknife
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector { *; }
-keepnames class * { @butterknife.InjectView *;}

这些都不适合我的配置。访问ButterKnife绑定的视图时,我仍然遇到崩溃。那么你需要为ButterKnife 8制作任何新的设置吗?

2 个答案:

答案 0 :(得分:6)

在ButterKnife 8中,自动生成的子类被称为不同的。您可以通过以下方式处理版本7和8的ProGuard设置:

###---------------Begin: proguard configuration for ButterKnife  ----------
# For Butterknife:
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**

# Version 7
-keep class **$$ViewBinder { *; }
# Version 8
-keep class **_ViewBinding { *; }

-keepclasseswithmembernames class * { @butterknife.* <fields>; }
-keepclasseswithmembernames class * { @butterknife.* <methods>; }
###---------------End: proguard configuration for ButterKnife  ----------

虽然我使用@OnClick方法,但我甚至不需要最后一行。这些设置对我来说非常合适。试试吧!

答案 1 :(得分:0)

这对我有用:

-keep public class * implements butterknife.Unbinder { public <init>(**, android.view.View); }
-keep public class * implements butterknife.internal.ViewBinder { public <init>(); }
-keep class butterknife.*
-keepclasseswithmembernames class * { @butterknife.* <methods>; }
-keepclasseswithmembernames class * { @butterknife.* <fields>; }
-keep class **$$ViewBinder { *; }
-keep class **$ViewHolder { *; }
-keep class butterknife.**$Finder { *; }
-keep class **_ViewBinding { *; }

如果您有多个库,请确保butterknife依赖项位于应用的build.gradle文件中,或者至少将annotationProcessor移入其中。