如何获得一个简单的Android(Studio)Proguard配置文件?

3

在我之前工作的所有项目中,如果指定了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个编译警告,这些警告都不太有意义。现在我真的很困惑。

  • 我如何确保Proguard实际上正在读取我的Proguard配置文件?或者它是否正在使用它,但我设置了错误的选项?
  • 我可以添加什么到Proguard文件中来将其工作仅限于混淆,以便我有一个启用了Proguard的构建配置作为起点(而不会破坏我的应用程序),并且不会优化任何代码。

我希望能得到任何帮助,以帮助我减少对Proguard的厌恶。

1个回答

0
将以下内容放入您的Proguard配置文件中,以避免混淆ButterKnife库。
-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


您的回答有助于我了解添加这些行会影响构建,因此我知道Proguard配置文件正在使用。但是我不想逐个修复每个库,我想禁用所有删除代码的优化,以便Proguard仅混淆代码。我尝试了您提到的方法(具体来说是--dontwarn,我之前没有使用),因此添加类似“-dontwarn okio.**”的行已允许我解决构建警告并创建一个APK,这很好,但是APK在没有Proguard的情况下不会崩溃,而现在却以各种方式崩溃。我需要停止Proguard删除代码。 - Ollie C
浏览Proguard手册后,我发现我需要的是保留所有内容的能力。我希望从不删除任何代码的基础上开始,只进行优化混淆,但我看不到如何保留全部内容,似乎要求我逐个保留每个错误删除的类,但这并不简单明了。 - Ollie C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接