缩减免安装应用的大小

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

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

重构为多个功能模块

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

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

最佳做法

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

两种应用类型均使用相同的代码库
您可以使用相同的模块化代码库同时创建安装式应用和免安装应用,从而简化应用的项目管理流程。
采用多个功能模块的设计
即使您的应用目前只有一个工作流且只需要一个功能模块,也最好采用多个功能模块设计。这样一来,在应用中添加现有模块就不会影响原始功能模块的大小。
一开始不要关注功能模块大小限制
功能模块大小限制不适用于本地构建的二进制文件。您也可以通过内部测试轨道发布免安装应用,该轨道会对功能模块大小实行 15 MB 的限制。只有 Alpha正式版轨道会实行 15 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 分析器工具比较不同的 build,包括免安装应用 build。

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

<feature_module>/build.gradle

Groovy

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

Kotlin

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

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

实现资源的云端分发

如果您需要进一步缩减应用大小,可能需要利用资源的云端分发