在Android中掌握进程
在构建Android应用程序时,我们可能在项目中使用了Proguard。在此博客中,我们将了解所有功能以及如何在Android中有效使用Proguard。
最初出版在blog.mindorks.com
因此,让它在以下几点中分解,
- 什么是proguard?
- 对我们的应用有何帮助?
- 如何在我们的项目中使用它?
- 重要的事情要注意。
什么是proguard?
Proguard是Android中的免费Java工具,可帮助我们完成以下操作,
- 收缩(缩小)代码:删除项目中未使用的代码。
- 混淆代码:重命名类,字段等的名称。
- 优化代码:执行诸如插入函数之类的事情。
简而言之,Proguard对我们的项目产生以下影响,
- 它减少了应用程序的大小。
- 它删除了有助于64K方法计数Android应用程序限制的未使用类和方法。
- 它使应用程序难以通过混淆代码进行反向工程。
它对我们的应用程序有用?
在Android中,Proguard对于制作生产就绪应用非常有用。它可以帮助我们减少代码并更快地使应用程序。默认情况下,Proguard从Android Studio默认情况下出来,它在很多方面都有帮助,下面很少有人提及其中的几个。
- 它混淆了代码,这意味着它将名称更改为一些较小的名称,例如MAINVIEWMODEL它可能会将名称更改为一种。混淆应用程序后,您的应用程序的反向工程现在成为一项艰巨的任务。
- 它缩小了资源,即无视我们的类文件未调用的资源,而不是在我们的Android应用中使用,例如来自Drawables的图像等。这将使应用程序大小减少很多。您应该始终缩小应用程序,以使其保持轻巧和快速。
如何在我们的项目中使用它?
要在您的项目中启用Proguard,在应用程序的build.gradle添加中,
buildTypes {
发布 {
MinifyEnabled真的
proguardfilesgetDefaultProguardFile('proguard android.txt'),'proguard-rules.pro'}
}
在这里,我们有Minfyenable
如真实,它激活从文件中获取的proguard,
proguard android.txt
它在释放块下,这意味着它将仅应用于我们生成的构建的释放。
但是,当Proguard删除太多代码并且可能会破坏您的流程时,这可能会太多。
因此,配置代码我们必须添加一些自定义规则,以确保我们从混淆中删除一组代码。我们可以通过在我们的演奏中写出自定义规则来解决此问题,并且在生成构建时会尊重。
现在,让我们看看如何在Proguard中编写自定义规则。
1.保留班级文件
假设我们有一个数据类,某些API需要执行该类别,但是生成构建,我们使该类混淆。例如,我们有一个用户数据类,
数据类用户(Val ID:String =“”)
而且我们不想使生成构建的类混淆,然后忽略它,使我们无法使用@保持
注释和更新代码类似
@保持
数据类用户(Val ID:String =“”)
此注释有助于通过在缩小时使用proguard忽略全班。即使不使用,这也将保留类及其成员功能。
我们也可以使用,
-保持
在生成构建时保留课堂选项。使用-保持超过@保持我们可以更多地控制要保留的东西和不要保留的东西。
但是,我们也可以保留ID通过使用@SerializedName(使用GSON库)类似,在数据模型类中的字段类似
数据类用户(@SerializedName(“ ID”)
Val ID:String =“”)
如果您在这里注意到,我们不使用@keep。
2.让成员上课
假设我们只想在收缩时只保留班级成员而不是班级,然后我们使用,
- keepclassmembers
在Proguard规则文件中。这将帮助我们忽略特定班级的成员。
考虑上述用户类,我们希望保留其中的所有公共方法。我们写这样的规则,
- keepclassmembers班级com。注意。样本。用户{
民众*;
}
在这里,班级用户保留所有具有公共修饰符的成员。
3.保留班级和成员的名字
Let’s say we want to keep all the same names of the class and members of a class if it’s being used in the code i.e. if the class is not used it would be shrunk by proguard but not obfuscated because it has already been shrunk there is no need of obfuscation.
为了完成我们使用的上述任务,
- 保存
它看起来像是
- 保存班级com。注意。样本。glidemodule
在这里,如果GlideModule将保留其类的所有名称和成员函数。
4.使用Android中的任何库
使用任何库时,我们可能想为Proguard编写一些自定义规则。可能会有图书馆在logcat中发出警告,或者他们甚至没有自己的前进规则!!!
为了解决该问题,我们需要在应用程序方添加自定义规则。例如,如果我们开始从任何库中获取警告,那么我们补充说,
-dontwarn com.somelibrary.annotations。*
在我们的前进规则中,我们将看不到日志中出现任何警告。
为了为库编写自定义规则,您可以像您自己的班级一样编写它。
5.仅使您的项目混淆
考虑一个非常罕见的用例,您只想混淆代码而不收缩任何资源。这是一个非常罕见的用例,但对于某些小库可能很有用,然后我们编写旗帜,例如
-dontshrink
-Dontoptimize
这将有助于我们不缩小和优化代码,而只是混淆。
6.维护注释
在构建应用程序时,Proguard删除了所有注释,并且对于项目中的某些代码,它仍然可以正常工作。但是,假设如果我们需要注释不被删除,那么我们可以选择,例如
- keepattributes *注释 *
在这里,它保留了所有注释在您的应用中保存的属性。默认情况下,我们的规则中存在。
7.优化
在编写了Proguard的规则之后,我们可能需要为我们的应用提供额外的优化层。首先,我们更新build.gradle文件像
安卓 {
buildTypes {
发布 {
proguardfilesgetDefaultProguardFile('Proguard-android-optimize.txt')
}
}
}
现在,通常,我们不使用此选项,但是这里的用例是我们必须执行额外的优化水平。
为了增加优化中的周期数量,例如我们要检查优化是否正确完成,如果没有完成,则它将再次优化,直到我们使用的一定次数,
- 优化通行5
在这里,它将最多运行5次优化,以使其更加优化。
现在,考虑一个示例,我们想在粒状水平上优化最后一堂课,而我们使用以前的情况,我们使用,
- 精选班级/标记/最后
在这里,最终课程将最高优化5倍,或者如果已经完成了优化,则可能会尽早结束。
现在,如果我们现在要优化我们使用的私有字段,
- 选项字段/标记/私人的
大多数次优化是第一次进行。
如果我们根本不想优化我们使用,
-Dontoptimize
这就是我们可以以不同的方式工作的方式来使我们的应用程序使用Proguard更加安全和更轻。
要注意的重要事情:
- 不要使用类似的东西mainfragment.class.getSimplename()作为碎片标签。proguard可以在混淆时将相同的名称(A. class)分配给不同包装中的两个不同片段。在这种情况下,两个片段将具有相同的标签。它将导致您的应用程序中的错误。
- 保留您的proguard的映射文件,以追溯到原始代码。您可能必须在Playstore控制台(例如Playstore控制台)上上传它,以查看坠机的原始堆栈跟踪。
如果您想编写更好的Proguard规则,请查看提示以编写更好的规则的提示。
如果您正在准备下一次Android面试,加入我们的Android专业课程在顶级科技公司学习最新的Android和Land Job。
愉快的学习。
团队插道:)