我一直在做Android开发了一点点,我得到一个点在我的项目,我想用Proguard的缩小我的APK的大小,并与DEX极限帮助之一.不幸的是,我收到了一些错误,堆栈溢出有答案,但它们似乎是针对那些有更多经验的人.
我的问题是你proguard-android.txt和你的关系是什么proguard-rules.pro?为什么有两个单独的文件,为什么它们是单独的格式?这些文件中的语句何时被调用,顺序是什么?我只是在寻找在开发环境中使用Progurad的整体背景的解释.
先感谢您.
ProGuard以您使用配置文件及其包含的规则告诉它的方式操作Java字节码.ProGuard可以做很多事情.它可以完全破坏您的应用程序,因此您必须确保添加正确的规则.
我假设你为你的应用程序使用基于Gradle的构建.然后你可能会遇到这个片段,它使ProGuard能够发布你的应用程序(或Android库)的版本:
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt'),
'proguard-rules.pro'
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
在配置中,列表proguardFiles告诉构建包含必须使用的ProGuard规则的文件.该列表可以包含任意数量的文件.
为什么文件(proguard-android.txt和proguard-rules.pro)的定义不同?
魔术getDefaultProguardFile(‘proguard-android.txt')加载文件以proguard-android.txtAndroid SDK中的标准位置命名(位置为${ANDROID_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任务).任务提供所有输入:
然后它处理文件并生成一个输出,该输出由Gradle构建进一步处理.
ProGuard如何实际工作?为什么我需要这些规则?
ProGuard遍历类/方法/字段/ ...的整个调用图.它从提供的规则定义的classes/methods/...开始.然后遍历调用图并根据需要标记classes/methods/fields/...并保留它们用于输出.因此,如果你调用它没有匹配的保持规则,它将生成一个空输出(或者它可能会抛出一个错误并告诉你定义一些,我现在不记得了).ProGuard无法识别通过反射完成的调用,因此您必须添加一些规则来处理它.还有许多其他情况需要您添加一些规则,请检查文档.
最后的笔记
如果您查看ProGuard文档,您可以找到可以使用的各种规则.但并非所有规则都适用于Android(ProGuard是一种通用的Java工具).
有些规则是由Android构建本身生成的,您不必自己定义它们.这种规则有两种类型:
-injars,-libraryjars...AndroidManifest.xml和资源(布局).Android构建(aapt工具)生成规则以保持清单中提到的类(活动,服务,接收器......)和布局中使用的自定义视图.您可以在中检查这些生成的规则build/intermediates/proguard-rules/${PRODUCT_FLAVOR}/${BUILD_TYPE}/aapt_rules.txt一些规则可以来自aar库.这些库可以包含库工作所需的ProGuard配置(proguard.txt内部可以有 文件).
在编写Android库时,要特别注意要添加到aar的规则.由于规则的附加性,它可能会导致捆绑库的应用程序出现问题.
| 归档时间: |
|
| 查看次数: |
687 次 |
| 最近记录: |