缩减免安装应用的大小

Google Play 免安装体验可通过点按网页链接提供丰富的原生体验。用户无需事先安装即可体验您的应用,从而提高了互动水平和质量。不过,为了让免安装应用能够像普通移动网页一样快速加载,您需要创建一个结构完善、高效运行的免安装应用。免安装应用的二进制文件越小,加载速度越快,用户体验也越流畅。

本文档介绍了在管理应用结构和二进制文件大小时应遵循哪些最佳做法,以实现流畅的免安装应用体验。您也可以采用相同的做法来改进您的安装版应用。

重构为多个功能模块

将应用重构为多个功能模块后,应用的二进制文件大小将获得最大的改进。先从基础功能模块开始,然后将主题相关的工作流提取到各自的功能模块中。为每个功能模块分配一个起始 Activity 和唯一网址,以便用户可以成功完成该模块的工作流。

创建功能模块时,应尽量缩小基础功能模块,尤其要注意应用中需要访问依赖库的部分。如果某个特定的库只供一个功能模块使用,应将该库导入功能模块本身,而非基础功能模块。请注意,要为特定功能模块发布免安装应用,该功能模块和基础功能模块的大小必须小于 4 MB

最佳做法

在重构您的应用时,请牢记以下最佳做法:

两种应用类型均使用相同的代码库
创建安装版应用和免安装应用时使用相同的模块化代码库,这样可以简化应用的项目管理流程。
采用多个功能模块的设计
即使您的应用目前只有一个工作流且只需要一个功能模块,也最好采用多个功能模块的设计。这样的话,如果要在应用中添加现有模块,就不会影响原始功能模块的大小。
一开始不要关注功能模块的大小限制
功能模块大小限制不适用于本地构建的二进制文件。您还可以通过内部测试轨道发布免安装应用,该轨道对功能模块大小实行的限制为 10 MB。只有 Alpha正式版轨道实行 4 MB 的限制。

更新应用资源

某些应用(尤其是代码库历史较长的应用)包含应用二进制文件不再使用的资源。要设法缩小应用模块,可考虑以下常见的多余代码来源。

缩减图片的文件大小

您可以使用 WebP 文件格式代替 PNG 格式,从而大幅缩减应用的可绘制对象总大小。Google Play 免安装体验会提供完整的 WebP 支持,包括透明度和无损压缩,因此图片质量会保持不变。

如果可能,请移除对使用其他 PNG 图片的所有向后兼容性要求。如果您必须使用 PNG 图片,请将它们放在用于构建和安装应用的模块中。

移除多余语言

如果您的应用支持多种语言,请尽可能减少本地化资源的数量。如果您使用“app compat”库(例如 android.support.v7.appcompat),这一步就特别有用。此库包含多种语言的消息,其中一些可能不受您的应用支持。

要了解详情,请查看如何移除未使用的备用资源(尤其是未使用的语言)。

移除多余文件

您的应用可能不再使用已导入到项目中的部分资源。为帮助移除这些资源,Android Studio 会针对这种特定情况提供 Lint 检查功能。要使用该工具,请完成以下步骤:

  1. Control+Alt+Shift+I(在 Mac OS 上按 Command+Alt+Shift+I)。
  2. 在显示的对话框中,输入 "unused resources"
  3. 选择 Unused resources 选项以启动资源使用情况检查流程。

如果应用中仍存在大型资源,请考虑是否可以在用户开始与您的应用互动之后,将其从应用中解压缩并作为独立文件下载。这种图片加载延迟通常需要更改代码,但由于这种方式只会下载用户明确请求的资源,因此可以大幅缩减免安装应用的文件大小。

移除未使用的库

随着应用范围的扩大,其采用的依赖项数量可能会非常惊人,特别是以下类型之一:

  • 原生库:包含免安装应用从不运行的原生代码的库。
  • 传递依赖项:应用中已导入的库所依赖的库。

Android Studio 提供了几个有用的工具,用于识别应用项目中的任何无关依赖项:

外部库

Android Studio 的 Project 视图包含一个 External Libraries 部分。

此部分包含您的应用使用的所有库,包括本机代码和所有传递依赖项。在此视图中,查找您的应用不需要的未使用或重复的库。

APK 分析器

您可以使用 APK 分析器工具来比较不同的版本,包括免安装应用版本。

在确定您的应用不需要的库之后,请在 Gradle 构建文件中添加如下所示的行来排除它们:

<feature_module>/build.gradle

dependencies {
        implementation('some-important-but-large-library') {
            exclude group: 'com.example.imgtools', module: 'native'
        }
    }
    

有关缩减应用依赖项的总导入大小的详情,请参阅 Gradle 的依赖项管理指南。