如何在Android Studio中使用ProGuard?


98

这是我在Android Studio中的第一个项目,并且我的应用程序的代码没有混淆。我在build.gradle文件中使用此配置: 在此处输入图片说明

我使用了Build> Generate Signed APK ...,并选中了Run Proguard。而且,当我使用Apk_OneClick.v4.2测试时,我的代码非常容易阅读:

在此处输入图片说明

请帮我。:(


显示在文本文件中为混淆代码定义的保护规则。
pyus13

如何检查应用程序是否模糊?
VVB

@VVB由反向工程APK文件我猜:D
hotHead

Answers:


71

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

./gradlew assembleRelease

或者,您可以从Build Variants视图中选择发布版本,然后从GUI进行构建:

IDE主窗口显示构建变体


大!我已经测试过将调试更改为runProguard true,并且可以完美运行。现在,我阅读了您的回复,并且可以正常工作!!!!好人!谢谢。
Felipe Porge Xavier 2014年

糟糕,我不小心在命令行说明中放了“ assembleDebug”而不是“ assembleRelease”。我确定了答案。
Scott Barta 2014年

通过命令行导出的.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 falseproductionbuild和其他build一起使用minifyEnabled true

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

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

您可以根据需要更改文件名。配置后,根据buildType使用三个可用选项之一来生成您的构建

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

  2. 转到左侧面板中的“ Build Variant”,然后从下拉列表中选择“ Build”

  3. 转到文件资源管理器中的项目根目录,然后打开cmd / terminal并运行

的Linux ./gradlew assembleRelease or assemble(#your_defined_buildtype)

视窗 gradlew assembleRelease or assemble(#your_defined_buildtype)

您可以在module / build目录中找到apk。

链接中提供了有关配置和proguard文件位置的更多信息

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


在哪里可以说使用myproductionbuild?
Felipe Porge Xavier 2014年

是的,您是对的:)您可以在左侧面板的“构建版本”标签中看到相同的内容。
pyus13 2014年

但是apk并没有混淆... :(
Felipe Porge Xavier 2014年

您是否已在proguard-rule.txt中编写了配置,请参见此处的一些示例proguard.sourceforge.net/index.html#manual/examples.html
pyus13 2014年

我没有找到Gradle DSL方法runProguard()。
SleepNot


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 2014年

0

这里的其他答案是有关使用proguard的重要参考。但是,我没有看到我遇到的一个讨论者是一个弯腰的人。生成签名的发行版.apk后,它会放入/release您应用程序的文件夹中,但我的应用程序中的apk不在该/release文件夹中。因此,我花了数小时来反编译错误的apk,想知道为什么我的proguard更改没有任何影响。希望这对某人有帮助!


0

这是您需要在proguard-rules.pro中添加的一些最常见的Proguard规则在Android Sutdio文件中。

牛油刀

 -keep class butterknife.** { *; }
 -dontwarn butterknife.internal.**
 -keep class **$$ViewBinder { *; }
 -keepclasseswithmembernames class * {
        @butterknife.* <fields>;
  }
 -keepclasseswithmembernames class * {
        @butterknife.* <methods>;
  }

翻新

 -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 

格森

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

代码混淆

-keepclassmembers class com.yourname.models** { <fields>; }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.