减小即点即玩应用的大小

Google Play 即点即玩通过点击网页链接即可提供丰富的原生体验。用户无需预先安装即可体验您的应用,从而提升参与度和质量。但是,为了使即点即玩应用的加载速度与典型的移动网页一样快,您需要创建一个结构良好且高效的即点即玩应用。即点即玩应用的二进制文件越小,加载速度越快,用户体验也越流畅。

本文档介绍了管理应用结构和二进制文件大小以实现流畅的即点即玩应用体验的最佳实践。您也可以应用这些相同的实践来改善您的可安装应用。

重构为多个功能模块

将应用重构为多个功能模块是改善应用二进制文件大小的最大改进。从一个基本功能模块开始,然后将主题相关的流程提取到它们自己的功能模块中。为每个功能模块分配一个起始活动和唯一的 URL,以便用户能够成功完成模块的工作流程。

在创建功能模块时,请尽可能减小基本功能模块的大小。尤其要注意应用中需要访问依赖库的部分。如果只有一个功能模块使用给定的库,请在功能模块本身中导入该库,而不是在基本功能模块中导入。请记住,为了发布特定功能模块的即点即玩应用,该功能模块和基本功能模块的**总**大小必须小于15 MB

最佳实践

重构应用时,请牢记以下最佳实践

对两种应用类型使用相同的代码库
您可以使用相同的模块化代码库来创建**已安装应用**和**即点即玩应用**,从而简化应用的项目管理流程。
设计用于多个功能模块
即使您的应用目前只有一个工作流程并且只需要一个功能模块,设计用于多个功能模块仍然是一个好主意。这样,您就可以将现有模块添加到应用中,而不会影响原始功能模块的大小。
一开始不要关注功能模块的大小限制
功能模块的大小限制不适用于本地构建的二进制文件。您还可以通过**内部测试**渠道发布即点即玩应用,该渠道对功能模块的大小限制为15 MB。只有**Alpha**和**生产**渠道才会执行15 MB的限制。

更新应用资源

某些应用,尤其是代码库历史较长的应用,包含您的应用二进制文件不再使用的资源。在寻找缩减应用模块大小的方法时,请考虑以下常见的不必要代码来源。

减少图像文件大小

您可以通过使用WebP文件格式而不是PNG,显著减少应用的可绘制对象总大小。Google Play Instant完全支持WebP,包括透明度和无损压缩,因此图像质量保持不变。

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

删除未使用的语言

如果您的应用支持多种语言,请尽可能减少本地化资源。如果您使用“应用兼容性”库(例如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

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关于依赖项管理的指南。

实现资源的云端交付

如果需要进一步缩减大小,您可能需要依赖云端交付资产