如何让一个简单的Android(Studio)Proguard配置工作

时间:2014-12-03 17:26:04

标签: android proguard

我之前曾在Proguard指定的每个项目中最终放弃了它,因为它导致了许多问题,导致无法使用,资源大量流失。但我目前的项目确实需要混淆,以使逆向工程更加困难。当我使用Android Studio和Gradle时,我在构建配置中启用了它:

    release {
        runProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }

然后我构建了一个发布版本,看到了292个警告和构建失败。大多数如下并与图书馆(Retrofit,Joda Time,Butterknife等)有关

Warning:butterknife.internal.ButterKnifeProcessor: can't find referenced class javax.lang.model.element.TypeElement

好的,所以我认为它正在优化部分库。所以我尝试将这样的行添加到proguard-rules.pro文件中(在Gradle文件中指定并由Android Studio自动创建):

-keep class butterknife.internal.** { *; }

没有区别。好的,所以我会尝试禁用所有收缩和优化,希望只能从混淆中获益(即使不可否认的是一点点混淆效益)。我将这些行添加到Proguard配置文件中:

-dontshrink
-dontoptimize

我重新编译,绝对没有任何变化,我仍然留下292个无意义的编译警告。现在我真的很困惑。

  • 如何让100%确定Proguard实际上是在阅读我的Proguard配置文件?或者它正在使用它,但我设置了一个不正确的选项?
  • 我可以添加什么来Proguard文件以减少其工作到JUST混淆,所以我有一个启用Proguard的构建配置作为一个起点(不破坏我的应用程序)并且不会优化任何代码。

我很感激帮助减少我对Proguard的仇恨。

1 个答案:

答案 0 :(得分:0)

将以下内容放入您的proguard配置中,以便它不会破坏您的刀库。

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

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

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

这是关于同一问题的{github讨论链接https://github.com/JakeWharton/butterknife/pull/117#issuecomment-51292624