Featured image of post 优化资源压缩提升Android应用性能

优化资源压缩提升Android应用性能

本文介绍了Android Gradle Plugin 8.12.0引入的优化资源压缩功能,通过将资源压缩与代码优化流程完全集成,可显著减小应用体积,提升启动速度和渲染性能,并减少ANR现象。

通过优化资源压缩提升应用性能

作者:Johan Bay - 软件工程师

小巧快速的应用是提供出色用户体验的关键。这就是我们构建R8应用优化器的原因,它通过移除未使用的代码和资源、重写代码以优化运行时性能等方式来精简您的应用。

随着Android Gradle Plugin(AGP)8.12.0版本的发布,我们推出了优化资源压缩功能,这是一种使用R8缩小应用的更好方法。通过启用此功能,您可以让应用变得更小,这意味着更小的下载量、更快的安装速度以及用户设备上更少的内存占用。最终结果是更快的启动速度、改进的渲染效果和更少的ANR现象。

工作原理

Android应用的资源压缩功能已经存在很长时间,期间经历了多次改进——例如,压缩资源表(resources.arsc)现在已成为默认优化项。

新方法通过将资源压缩与现有代码优化流程完全集成来改进资源压缩。在新方法中,R8同时优化代码和资源引用,确保所有仅从未使用代码引用的资源都被识别为未使用并被移除。这完全消除了对AAPT2(Android资源打包工具)生成的无条件保留规则的需求,并为丢弃未使用代码和资源提供了更细粒度和精确的信息。

这相较于现有流程是一个改进,在现有流程中代码和资源优化是分开的。在现有流程中,AAPT2生成无条件保留从资源引用的类的保留规则。然后,R8优化使用这些保留规则运行。在R8完成代码优化和压缩后,它会扫描剩余代码以构建直接或间接引用的所有资源的图。然而,无条件的AAPT2规则通常会保留原本未使用的代码,这反过来导致R8保留未使用的代码以及由其引用的未使用资源。

使用方法

首先,通过在build.gradle.kts文件中使用以下配置来开启带有资源压缩的R8优化:

1
2
3
4
5
6
7
8
9
android {
  buildTypes {
    release {
      isMinifyEnabled = true
      isShrinkResources = true
      
    }
  }
}

通过在gradle.properties文件中添加以下内容来开启新的优化资源压缩流程:

1
android.r8.optimizedResourceShrinking=true

优势

优化资源压缩流程相较于现有实现显示出显著改进。对于在不同外形尺寸垂直领域共享大量资源和代码的应用,我们测量到应用大小改善了超过50%。较小的应用也能看到改进——例如,在Androidify中我们看到以下收益:

该表格显示了随着额外优化的启用,从无压缩到优化资源压缩,应用大小的逐步改进。标有星号(*)的单元格表示相较于前一行的改进数字。启用R8会修剪DEX的大小,而启用资源压缩会移除res文件夹和资源表中的未使用资源,但不会进一步改变DEX大小,最后,优化资源压缩通过移除资源和DEX代码进一步减小大小,因为它可以追踪跨DEX和资源边界的引用。

后续步骤

从AGP 9.0.0开始,优化资源压缩将成为任何开启资源压缩器的项目的标准行为。

查看新更新的文档以尝试优化资源压缩,如果您在问题跟踪器中遇到任何问题,请告知我们。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计