如何在Android Studio中使用ProGuard?

101

这是我在Android Studio中的第一个项目,我的应用程序代码没有混淆。我在build.gradle文件中使用以下配置:

enter image description here

我使用“Build > Generate Signed APK...”并勾选了“Run Proguard”选项。当我使用Apk_OneClick.v4.2进行测试时,我的代码完全易于阅读:

enter image description here

请帮帮我。


展示你在文本文件中定义的Proguard规则,以便混淆代码。 - Piyush Agarwal
如何检查应用程序是否已混淆? - VVB
通过反向工程APK文件,我猜测@VVB是这样做的:D - Mike Herasimov
7个回答

73

你可能没有通过签名向导实际签署APK的发布版本。你可以使用以下命令之一从命令行构建发布版APK:

./gradlew assembleRelease

你可以从 Build Variants 视图中选择发布版本,并从GUI构建:

IDE main window showing Build Variants


太好了!我已经测试了将调试更改为runProguard true,完美地运行了。现在我看到了你的回复,它也可以工作!!太棒了!谢谢。 - Felipe Porge Xavier
哎呀,我在命令行指令中不小心输入了"assembleDebug"而不是"assembleRelease"。我已经修正了我的答案。 - Scott Barta
通过命令行导出的.apk文件的路径是什么? - Shajeel Afzal

50

您可以配置您的 build.gradle 文件来实现 Proguard。它可以在模块级别或项目级别进行配置。

 buildTypes {

    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'

    }

}

所示配置为调试级别,但您可以像下面在buildTypes中自己编写构建类型:

    myproductionbuild{
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }

最好将调试设置为minifyEnabled false,将生产构建和其他构建设置为minifyEnabled true

将您的proguard-rules.txt文件复制到模块或项目文件夹的根目录中,例如:

$YOUR_PROJECT_DIR\YoutProject\yourmodule\proguard-rules.txt

您可以按照自己的意愿更改文件名。配置完成后,使用三个选项之一根据buildType生成您的构建:

  1. 在右侧面板中转到gradle任务,搜索模块任务下的assembleRelease/assemble(#your_defined_buildtype)

  2. 在左侧面板中转到Build Variant,并从下拉菜单中选择构建

  3. 在文件浏览器中转到项目根目录,打开cmd/终端并运行

Linux ./gradlew assembleRelease 或 assemble(#your_defined_buildtype)

Windows gradlew assembleRelease 或 assemble(#your_defined_buildtype)

您可以在模块/build目录中找到apk文件。

有关配置和proguard文件位置的更多信息,请访问以下链接:

http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Running-ProGuard


我在哪里可以使用myproductionbuild? - Felipe Porge Xavier
是的,你说得对 :) 你可以在左侧面板的“构建变体”选项卡中看到相同的内容。 - Piyush Agarwal
但是apk没有混淆... :( - Felipe Porge Xavier
你是否已经在proguard-rule.txt中编写了配置?在这里可以看到一些示例:http://proguard.sourceforge.net/index.html#manual/examples.html - Piyush Agarwal
我遇到了Gradle DSL方法runProguard()未找到的问题。 - SleepNot
runProguard已经过时。不要在gradle文件中使用runProguard,而是尝试使用minifyEnabled。请参见https://dev59.com/F18d5IYBdhLWcg3wRAeE#27052851。 - kouretinho

41
runProguard false

你需要使用

minifyEnabled false

6
可能应该将其设置为true。 - anna_manzhula

3
以下是一些最常用的Proguard规则,您需要将它们添加到Android Studio中的proguard-rules.pro文件中。
ButterKnife
 -keep class butterknife.** { *; }
 -dontwarn butterknife.internal.**
 -keep class **$$ViewBinder { *; }
 -keepclasseswithmembernames class * {
        @butterknife.* <fields>;
  }
 -keepclasseswithmembernames class * {
        @butterknife.* <methods>;
  }

Retrofit

 -dontwarn retrofit.**
 -keep class retrofit.** { *; }
 -keepattributes Signature
 -keepattributes Exceptions

OkHttp3
 -keepattributes Signature
 -keepattributes *Annotation*
 -keep class okhttp3.** { *; }
 -keep interface okhttp3.** { *; }
 -dontwarn okhttp3.** 
 -keep class sun.misc.Unsafe { *; }
 -dontwarn java.nio.file.*
 -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 

Gson

 -keep class sun.misc.Unsafe { *; }
 -keep class com.google.gson.stream.** { *; }

代码混淆

-keepclassmembers class com.yourname.models** { <fields>; }

1

尝试将“proguard-rules.txt”文件重命名为“proguard-android.txt”,并在gradle文件中删除对“proguard-rules.txt”的引用。 getDefaultProguardFile(...)调用引用了不同的默认proguard文件,由Google提供而不是您的项目中的文件。因此,也要将其删除,以便gradle文件如下:

buildTypes {
    release {
        runProguard true
        proguardFile 'proguard-android.txt'
    }
}

不起作用。我把我的自定义proguard-android.txt放在与proguard-rules.txt相同的目录中,但我的代码没有任何变化。 - Felipe Porge Xavier

0

0
这里的其他答案都是关于使用proguard的很好的参考。然而,我遇到了一个让人头疼的问题,它没有被讨论过。在你生成签名的发布版.apk之后,它会被放置在你的应用程序的/release文件夹中,但我的应用程序有一个不在/release文件夹中的apk。因此,我花了几个小时反编译错误的apk,想知道为什么我的proguard更改没有任何影响。希望这能帮助到某些人!

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