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

📅  最后修改于: 2021-05-13 14:03:28             🧑  作者: Mango

如果您要构建任何应用程序,并且想要将该应用程序定位于大量受众,那么在构建应用程序时,您应该考虑很多因素。构建任何应用程序时,最重要的因素是其大小。应用程序的大小很重要。如果您的应用程序很大,那么用户就不喜欢下载需要如此巨大存储空间和数据费用的大型应用程序。因此,在构建任何Android应用程序时,保持用户的应用程序大小非常重要。在本文中,我们将介绍使用R8减小应用程序大小的方法。

以下是我们将在本文中介绍的一些主题

  • 什么是R8?
  • 如何在您的应用程序中使用R8收缩?
  • R8中的缩小如何工作?

使用R8应用缩小所需的配置

  • 要在您的应用程序中启用R8,您必须使用Android Studio版本(例如3.4或更高版本)。
  • 您项目中的Gradle版本应具有3.4.0左右的版本

什么是R8?

什么是R8

R8是一个应用程序缩小工具,用于减小应用程序的大小。 Android Studio中提供的此工具符合Proguard的规则。 R8会将您应用程序的代码转换为优化的Dalvik代码。在此转换过程中,R8将删除应用程序内部未使用的类和方法。与此应用一起,Android应用程序中有很多未使用的文件,我们不需要这些文件,因此R8会删除这些文件并有助于减小应用程序的大小。使用R8的好处是它将使您的应用程序更加安全,并且难以进行反向工程。因此,这将有助于我们提高应用程序的安全性。

R8使用不同的技术来减小APK大小:

  • 优化代码:在此过程中,R8实际上将优化代码以减小应用程序大小。因此,在优化过程中,它将删除应用程序中存在的未使用的类,方法和无效代码。
  • 标识符重命名:在此过程中,R8实际上将重命名我们的类名和变量名。在编写代码时,我们使用一些标识符模式,以便我们可以正确地理解我们的代码。但是在此过程中,R8会将所有类重命名为较小的变量名,这也将有助于减小APK的大小。例如,您已经生成了一个名为“ Constant”的新类,用于存储一些在我们应用程序的不同部分中使用的常量。 R8将使用更小的名称(例如“ a”)或任何其他格式来重命名该类。
  • 收缩:在编写代码时,我们在应用程序内部创建了许多方法。创建此方法时,某些方法未在我们的应用程序内部使用,这些方法称为不可达方法,这些方法在我们的应用程序内的任何地方均未使用。因此,R8将删除此类无法访问的方法以减小APK的大小。
  • 第三方库的优化:为了在我们的应用程序中实现许多外部功能,开发人员通常更喜欢在其应用程序中使用外部库。但是,在使用这些库时,它将安装许多我们的应用程序不需要的文件。因此,R8将优化该库的代码,并仅保留应用程序中所需的代码,并删除未使用的文件。

现在,我们将着手在我们的应用程序中实际实现R8。

如何在应用程序中使用R8收缩?

R8收缩的实现是一个单步过程。首先,在Android Studio中创建一个具有空活动的“新建项目”。用于在Android Studio中创建新项目。查看有关如何在Android Studio中创建新项目的链接。创建这个新项目之后。导航到Gradle脚本> build.gradle(:app) ,您将看到buildTypes部分。在此更改中,将minifyEnabled从false更改为true以启用R8。以下是我们必须进行更改的部分。

更改为true后,请同步您的项目,并在应用程序中添加R8。现在,您可以通过构建APK来测试APK的大小。您还可以通过添加一些外部库来测试APK的大小。使用R8测试APK大小,而无需使用R8,您将看到APK大小之间的差异。

R8中的缩小将如何工作?

R8用于减小应用程序大小的算法将跟踪应用程序中未使用的方法和无法访问的代码,并删除这些方法。因此,R8将开始从我们必须为任何类声明的入口点开始跟踪您的代码,并且R8将从该入口点开始跟踪未使用的代码。例如,我们将看一下下面创建的类:

Java
/*package whatever //do not write package name here */
  
import java.io.*;
  
// entry point for R8 
class GFG {
  // Method one is used 
  // inside our main method. 
  private void methodone(){
            System.out.println("Method 1 ");
  }
  // Method two is not being
  // used in our main method. 
  private void methodtwo(){
            System.out.println("Method 2 ");
  }
        
      // Our main method 
    public static void main (String[] args) {
      methodone();
    }
}


Java
/*package whatever //do not write package name here */
  
import java.io.*;
  
class GFG {
    public static void main (String[] args) {
            System.out.println("Method 1 ");
    }
}


在proguard内,我们将为其遵循以下规则:

在上面的示例中,proguard将开始从main方法扫描您的应用程序,并且在该方法内部,将首先调用methodone(),并在打印一个方法后停止跟踪。然后,R8将在我们的应用程序中查找未使用的方法,未使用的方法是methodtwo() ,我们在主方法中未使用该方法。因此,R8将在我们的应用程序中删除该methodtwo() 。然后将methodone()重命名为一些较小的名称,并正确对齐代码。对齐后,代码将类似于以下示例。

Java

/*package whatever //do not write package name here */
  
import java.io.*;
  
class GFG {
    public static void main (String[] args) {
            System.out.println("Method 1 ");
    }
}

因此,在Android Studio中的应用程序内部,R8会跟踪太多文件。因此,为了跟踪这些文件并确定每个文件的入口点,使用了aapt2工具。将以下行添加到启用了proguard的行的下面。

但是,在使用此功能时,gson文件会存在一些问题。当您的代码中包含一些反射文件时,它将删除该代码,但我们必须将该代码保留在项目中。为了实现这一点,在minifyEnabled true下添加以下行。

因此,为了克服这些问题,Android中的Gson会在build.gradle文件中添加上面显示的行。因此,通过这种方式,我们实现了在应用程序内部缩小R8应用程序,这将有助于减小应用程序的大小。

想要一个节奏更快,更具竞争性的环境来学习Android的基础知识吗?
单击此处前往由我们的专家精心策划的指南,以使您立即做好行业准备!