📜  如何在Android中使用Proguard减小APK大小?

📅  最后修改于: 2021-05-09 18:21:37             🧑  作者: Mango

构建任何应用程序时,应用程序大小都很重要。如果应用程序尺寸较大,则由于其尺寸太大,大多数用户将不会下载您的应用程序。大型应用程序将使您的用户花费大量数据,并且他还将需要磁盘空间才能安装您的应用程序。因此,减小APK的大小proguard是用于减小APK大小的重要Java工具之一。在本文中,我们将介绍以下主题:

  • 什么是Proguard?
  • Proguard的用途是什么?
  • 如何在您的应用程序内使用Proguard?
  • 使用Proguard的缺点是什么?
  • Proguard中的自定义规则。

什么是Proguard?

Proguard是Android中提供的Java工具,用于减小应用程序大小。这是一个免费工具,可帮助您将应用程序大小减少8.5%。 Proguard会将您应用程序的代码转换为优化的Dalvik字节码。转换过程如下:

什么是Proguard?

Proguard的用途是什么?

  • Proguard会混淆您的代码并重命名您的代码。在此过程中,它将重命名不同Java类的文件。这将使您的应用程序更加安全,并且难以进行反向工程。
  • 它将删除代码中未使用的代码段并优化代码。
  • 使用proguard将使您的应用程序大小减少8.5%。
  • Proguard会缩小应用程序内部未使用的资源。
  • 使用proguard会减少您的应用程序大小,并使您的代码内联。这将使您的应用更快,更小。

如何在您的应用程序内使用Proguard?

要在您的应用程序内启用proguard,请导航至应用程序> gradle脚本>打开build.gradle文件。在该gradle文件中,您会在发布部分的文件中看到以下代码行。将minifyEnabled从false更改为true。这将使用proguard文件激活您的proguard。

您将在发行版块中找到这组代码。这意味着仅将为您的发布应用程序激活Proguard。

Proguard中的自定义规则

当我们在应用程序内部使用proguard时,它将自动删除应用程序内部所需的一些模式类。因此,为避免删除这些文件,我们必须在应用程序内添加一些自定义规则。

1.保持我们的课堂

在使用库进行联网时或在实现RecyclerView或ListView时。我们必须创建一个Data类来存储所有数据。因此,在使用Proguard时,它将删除没有用的类变量。因此,为避免删除此类的变量,我们必须向该类添加@Keep批注。例如,我们正在创建一个数据类,用于在我们的类中存储studentName和StudentId,我们不希望proguard对我们的类进行混淆。因此,在这种情况下,我们将向其添加@Keep注释。因此,在下面的代码片段中,@ Keep将防止此类混淆。除了“ @keep”,我们还可以使用-keep来防止类混淆。如果必须保留类的任何变量,则将使用“ @SerializableName”注释该变量。当我们必须从JSON文件或服务器解析数据时,通常使用这种类型的注释。

Java
/*package whatever //do not write package name here */
  
import java.io.*;
@Keep
class GFG {
   string StudentName;
     int studentID;
}


Java
/*package whatever //do not write package name here */
  
import java.io.*;
  
-keepnames class GFG {
   string studentName;
  int studentId;
}


Java
/*package whatever //do not write package name here */
  
import java.io.*;
  
-keepclassmembers  class GFG {
   string studentName;
  int studentId;
}


Java
/*package whatever //do not write package name here */
  
import java.io.*;
  
-keepattributes @GET
class GFG {
   string studentName;
  int studentID;
}


2.保留班级及其成员的名字

假设如果我们必须保留类的名称及其成员变量,那么我们将使用注释作为“ -keepnames”。该注释将保留该类的名称及其成员变量。尽管proguard会缩减此类课程,但不会混淆您的课程。下面的代码片段将告诉我们如何使用“ -keepnames”保留类成员。

Java

/*package whatever //do not write package name here */
  
import java.io.*;
  
-keepnames class GFG {
   string studentName;
  int studentId;
}

3.保持我们班级的成员

如果我们只想让班级成员而不是班级成员不被Proguard混淆。然后,我们将使用“ -keepclassmembers”注释该类。此注释将防止混淆我们的班级成员。下面是代码片段,我们将在其中查看此方法的实现。

Java

/*package whatever //do not write package name here */
  
import java.io.*;
  
-keepclassmembers  class GFG {
   string studentName;
  int studentId;
}

4.保留注释

使用Proguard时,它将删除我们在库提供的类中添加的所有注释。无论如何,此代码都可以正常工作而不会出现任何问题。但是,如果将其卸下,可能会导致问题。如果您正在使用Retrofit库从应用程序中的Web服务器获取数据,那么您将使用许多注释,例如“ @GET”,“ @ POST”,“ @ PUSH”等等。如果这些注释将被删除,则翻新可能会导致从服务器获取数据的问题。因此,为避免删除这些注释,我们将使用“ -keepattributes”关键字。下面是其用法的代码片段。

Java

/*package whatever //do not write package name here */
  
import java.io.*;
  
-keepattributes @GET
class GFG {
   string studentName;
  int studentID;
}

5.使用外部库

当我们使用一些外部库时。它们提供了可以添加到我们的保障规则中的特定规则。但是,如果库中没有任何规则。然后,在这种情况下,我们可以在日志中看到警告。为了避免对该库发出警告,我们必须在proguard中添加带有“ -dontwarn”注释的库。

使用Proguard的缺点

有时,在使用Proguard时,它将删除大量所需的代码,这可能会导致应用程序崩溃。因此,请避免从我们的应用程序代码中删除此代码。我们必须在Proguard中添加一些自定义规则以保留该特定文件,以便避免删除该文件,即使使用proguard后,我们的应用程序也不会崩溃。

结论

因此,Proguard在减小我们应用程序的大小方面非常有帮助,这也将使我们的应用程序更安全且难以进行反向工程。因此,我们应该使用它来优化应用程序的大小。