Android Studio中的混淆技术

50

有没有可以与Android Studio一起使用的混淆工具?IntelliGuard插件被声称支持Studio,但实际上由于缺失AntSupport插件而无法使用。我在存储库中也找不到任何工具。你有什么想法吗?

附注:Android Studio的构建过程是基于Gradle构建的,所以我不会指望在那里看到Ant支持。也许我错了。


2
这个链接可能会有所帮助:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Running-ProGuard - Pankaj Kumar
5个回答

72
  • 基本混淆

在Android Studio中对代码进行混淆,只需打开你的Android Studio项目中的build.gradle文件:

enter image description here

将minifyEnabled属性从false更改为true

enter image description here

这是一种基本的混淆方法。

在生成apk后,你可以通过任何软件对apk进行反编译来查看混淆结果。这个网页可能会有所帮助:

http://www.decompileandroid.com/

在混淆结果中,你会看到类名为:a,b,c....

enter image description here

而混淆变量和方法也会像aa,c,ac等一样具有名称。

enter image description here

  • 常规混淆:

要以更复杂的方式混淆代码,可以进入应用程序的根目录,并创建一个.pro文件。例如,在下面的图片中,我创建了文件proguard-rules-new.pro。在同一目录下,你应该会看到一个名为proguard-rules.pro的文件。

enter image description here

现在将你创建的文件添加到build.gradle文件中

enter image description here

并编写你自己的定制ProGuard规则的.pro文件

enter image description here


上传 APK 后出现“AccessDenied”错误。 - VVB
2
我有相同的配置,除了我的文件是proguard.cfg。尝试反编译apk,类没有混淆,是否需要将.cfg重命名为.pro - mboy
4
有没有可以自动编写Proguard规则的插件? - Pramod Waghmare

22

首先在您的 build.gradle 文件中启用 minifyEnabled,例如:

minifyEnabled true

在此之后,将以下行添加到progurad-rules.txt文件中。

-keep class yourpackage.** { *; }
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

检查是否正常工作,请访问:http://www.javadecompilers.com/apktool网站,以便在反编译后进行验证。

它将正常工作,并且您的类将完全隐藏。


7
就我个人而言,我绝不会将我的apk上传到那样的网站!我怎么能相信那个网站呢?!? - user2342558
1
@user2342558 我提供了一个参考,仅用于测试和交叉检查的目的。 - amit pandya

14

更新:在Android Studio 3.4.0及以上版本中,默认启用了R8

在Android Studio 3.4+中,默认启用了R8,因此无需添加其他属性,但您可以通过在gradle.properties中添加fullMode属性来选择深度优化,如下所示:

android.enableR8.fullMode=true 

您可以通过在gradle.properties中添加以下属性来禁用R8并启用proguard

android.enableR8 = false
useProguard = true

2018年9月,Android发布了一个新的工具R8收缩器和混淆器。

R8 - R8是一种Java代码收缩器和最小化工具,将Java字节码转换为优化的dex代码。

适用于AS版本3.4.0以下。

  1. 打开gradle.properties
  2. 添加android.enableR8 = true

as

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit

android.enableR8 = true

最低要求:

  • Android studio 3.2 2018年9月版或更高版本
  • Java 8

R8工具

R8支持Proguard:

请注意,R8旨在与现有的ProGuard规则配合使用,因此您可能不需要采取任何措施来获得R8的好处。但是,由于它是专门为Android项目设计的不同技术,缩小和优化可能会导致删除ProGuard没有删除的代码。所以,在这种不太可能的情况下,您可能需要添加额外的规则以保留该代码。

禁用AS 3.4.0及以上版本中的R8:

# Disables R8 for Android Library modules only.
android.enableR8.libraries = false
# Disables R8 for all modules.
android.enableR8 = false

注意:对于给定的构建类型,在您的应用程序模块的build.gradle文件中,如果将useProguard设置为false,则Android Gradle插件将使用R8来缩小该构建类型的应用程序代码,而不管您是否在项目的gradle.properties文件中禁用了R8。{{}}

1
我猜目前选项设置“android.enableR8=true”是实验性的且不受支持。在支持版本发布之前,我不建议使用它。 - ilkayaktas
我进行了有和没有的比较,但它并没有缩小 :) - Sabri Meviş
如果你只是写了 minifyEnabled true,在构建输出中你会看到一个任务 Task :app:minifyReleaseWithR8,现在你不需要手动去做它了,让我们来处理所有这些... 谢谢... - Maifee Ul Asad
1
@MaifeeUlAsad,是的,新行为已经在更新中提到了,不过我们将其移动到了一个更详细的特定部分。谢谢! - Pavneet_Singh

2

1
当minifyEnabled设置为true时,代码将被ProGuard缩小和混淆。https://teamtreehouse.com/community/what-is-minifyenabled - Roger Huang

1

minifyEnabled 设置为 true 后,您可以获取两个版本的 apk,因此您需要在 build.gradle 中添加调试选项以混淆调试版本:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

同步、构建和构建apk。

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