Android:Proguard集成的解释

Android:Proguard集成的解释,android,proguard,Android,Proguard,我已经做了一点Android开发,在我的一个项目中,我想使用Proguard缩小我的APk的大小,并帮助解决dex限制问题。不幸的是,我得到了一些错误和堆栈溢出的答案,但他们似乎是针对那些有更多经验 我的问题是你的proguard android.txt和proguard rules.pro有什么关系?为什么有两个不同的文件,为什么它们的格式不同?这些文件中的语句何时调用,顺序如何?我只是想了解一下在开发环境中使用Progurad的总体环境 提前谢谢。ProGuard使用配置文件及其包含的规则按

我已经做了一点Android开发,在我的一个项目中,我想使用Proguard缩小我的APk的大小,并帮助解决dex限制问题。不幸的是,我得到了一些错误和堆栈溢出的答案,但他们似乎是针对那些有更多经验

我的问题是你的
proguard android.txt
proguard rules.pro
有什么关系?为什么有两个不同的文件,为什么它们的格式不同?这些文件中的语句何时调用,顺序如何?我只是想了解一下在开发环境中使用Progurad的总体环境


提前谢谢。

ProGuard使用配置文件及其包含的规则按照您的方式处理Java字节码。ProGuard可以做很多事情。它会完全破坏你的应用程序,因此你必须确保添加正确的规则

我假设你的应用程序使用基于Gradle的构建。然后,您可能会遇到以下代码段,该代码段为您的应用程序(或Android库)的发布版本启用ProGuard:

在配置中,列表
proguardFiles
告诉构建它必须使用哪些包含ProGuard规则的文件。此列表可以包含任意数量的文件

为什么文件(
proguard android.txt
proguard rules.pro
)的定义不同?

神奇的
getDefaultProguardFile('proguard-android.txt')
从android SDK中的标准位置加载名为
proguard android.txt
的文件(位置为
${android\u SDK}/tools/proguard/

其他配置文件在本地解析,因此文件
proguard rules.pro
应位于当前Gradle模块的根目录下

为什么有两个独立的文件?那么
proguard android.txt
proguard rules.pro
之间的关系是什么呢?

ProGuard配置是可添加的。您可以在一个文件中定义一些规则,在其他文件中定义其他规则。这些规则在内部连接到单个规则列表中

文件
getDefaultProguardFile('proguard-android.txt')
包含所有android应用程序的几个一般规则(请自己在SDK中的文件中检查它们)。本地
proguard rules.pro
应包含特定于您自己的应用程序的规则。例如,当您仅通过反射使用某个类时,您希望确保该类不会被剥离(稍后我将对此进行讨论)

请注意,拥有多个本地文件非常有用。例如,您可以使用两个本地配置文件进行调试构建—一个包含应用程序的发布规则,另一个包含禁用模糊处理的规则

还要注意的是,配置的附加行为可能有点麻烦。如果在一个配置文件中添加规则,则无法在另一个配置文件中删除该规则。因此,请注意非常一般的规则(例如,想象添加
-keep class**{*;}

这些文件中的语句何时调用,顺序如何?

你可以按任何顺序定义它们,没有区别。您可以在多个文件中定义相同的规则,这并不重要。指定文件的顺序也不重要

ProGuard本身在Android构建中作为单个作业运行(准确地说是单个Gradle任务)。该任务由以下所有输入提供:

  • 要操纵的类
  • 要使用但不操纵的库类
  • 生成的已处理jar的输出路径
  • 指定操作的ProGuard规则
  • 各种输出信息的输出路径(删除的内容、映射等)
然后它处理这些文件并生成一个输出,该输出由Gradle构建进一步处理

ProGuard实际上是如何工作的?为什么我需要这些规则?

ProGuard遍历类/方法/字段/的整个调用图…。它从所提供的规则定义的类/方法/…开始。然后遍历调用图,根据需要标记类/方法/字段/…并将它们保留在输出中。因此,如果您在没有匹配keep规则的情况下调用它,它将生成一个空输出(或者它将抛出一个错误并告诉您定义一些,我现在不记得了)。ProGuard无法识别通过反射完成的调用,因此必须添加一些规则来处理。还有许多其他情况需要您添加一些规则,请检查

最终注释

如果您检查,您可以找到各种规则 你可以用。但并非所有规则都适合Android(ProGuard是一个通用Java工具)

有些规则是由Android构建本身生成的,您不必自己定义它们。此类规则有两种类型:

  • 常规配置规则,如
    -injars
    -libraryjars
  • AndroidManifest.xml
    和资源(布局)生成的规则。Android build(aapt工具)生成规则来保存清单中提到的类(活动、服务、接收者等)和布局中使用的自定义视图。您可以在
    build/intermediates/proguard rules/${PRODUCT\u FLAVOR}/${build\u TYPE}/aapt\u rules.txt
  • 一些规则可以来自aar库。库可以包含库工作所需的ProGuard配置(其中可以有
    ProGuard.txt
    文件)


    在自己编写Android库时,要特别小心要添加到aar中的规则。由于规则的累加性,它可能会给绑定库的应用程序带来问题。

    您应该看看Hi,谢谢您的回答!我们是否应该将build/intermediates/proguard rules/${PRODUCT\u FLAVOR}/${build\u TYPE}/aapt\u rules.txt中的规则显式添加到proguard ru
    android {
        buildTypes {
            release {
                minifyEnabled true
                proguardFiles getDefaultProguardFile(‘proguard-android.txt'),
                        'proguard-rules.pro'
            }
        }
        ...
    }