Google Play 即时应用提供丰富的原生体验,只需点击网页链接即可。用户无需预先安装即可体验您的应用,从而提升参与度和质量。但是,为了让即时应用的加载速度像典型的移动网页一样快,您需要创建一个结构良好、高效的即时应用。即时应用的二进制文件越小,加载速度越快,用户体验也越流畅。
本文档介绍了管理应用结构和二进制文件大小以实现流畅即时应用体验的最佳实践。您也可以应用这些相同的实践来改善您的可安装应用。
重构为多个功能模块
将应用重构为多个功能模块后,对应用二进制文件大小的改进最大。从基础功能模块开始,然后将主题相关的流程提取到它们自己的功能模块中。为每个功能模块分配一个起始活动和唯一的 URL,以便用户能够成功完成模块的工作流程。
创建功能模块时,请尽可能缩小基础功能模块的大小。特别是,请密切注意应用中需要访问相关库的那些部分。如果只有一个功能模块使用给定的库,则在功能模块本身导入该库,而不是在基础功能模块中导入。请记住,为了为特定功能模块发布即时应用,该功能模块和基础功能模块的**总**大小必须小于15 MB。
最佳实践
重构应用时,请记住以下最佳实践
- 对两种应用类型使用相同的代码库
- 您可以使用相同的模块化代码库创建**已安装应用**和**即时应用**,从而简化应用的项目管理流程。
- 为多个功能模块设计
- 即使您的应用目前只有一个工作流程,并且只需要一个功能模块,设计多个功能模块仍然是一个好主意。这样,您就可以将现有模块添加到您的应用中,而不会影响原始功能模块的大小。
- 一开始不要关注功能模块大小限制
- 功能模块大小限制不适用于本地构建的二进制文件。您还可以通过**内部测试**轨道发布即时应用,该轨道对功能模块大小强制执行15 MB的限制。只有**Alpha**和**生产**轨道才强制执行15 MB的限制。
更新应用资源
某些应用(特别是那些具有较长代码库历史记录的应用)包含应用的二进制文件不再使用的资源。在寻找缩小应用模块大小的方法时,请考虑以下常见的无用代码来源。
减小图像文件大小
您可以通过使用WebP文件格式代替 PNG 来显著减小应用的可绘制对象的总大小。Google Play 即时应用完全支持 WebP,包括透明度和无损压缩,因此图像质量保持不变。
如果可能,请删除使用其他 PNG 图像的所有向后兼容性要求。如果必须使用 PNG 图像,请将它们放在用于构建和安装应用的模块中。
删除未使用的语言
如果您的应用支持多种语言,请尽可能减少本地化资源的数量。如果您使用“应用兼容”库(例如android.support.v7.appcompat
),则此步骤特别有用。此库包含多种语言的消息,其中一些语言您的应用可能不支持。
要了解更多信息,请查看如何删除未使用的替代资源,特别是未使用的语言。
删除多余的文件
您的应用可能不再使用已导入项目中的一些资源。为了帮助移除这些资源,Android Studio 提供了一个针对此特定情况的 Lint 检查。要使用此工具,请完成以下步骤:
- 按Ctrl+Alt+Shift+I(Mac OS 系统上按Command+Alt+Shift+I)。
- 在出现的对话框中,输入
"unused resources"
。 - 选择Unused resources 选项以启动资源使用检查过程。
如果您的应用中仍有大量资源,请考虑是否可以将它们从应用中解包,并在用户开始与您的应用交互后将其作为独立文件下载。这种图像加载延迟通常需要更改代码,但它可以通过仅下载用户明确请求的资源来大幅减少即时应用的文件大小。
移除未使用的库
随着应用范围的扩大,它可能会包含大量依赖项,尤其是以下几种类型:
- 原生库:包含即时应用从未运行的原生代码的库。
- 传递依赖项:应用导入的库所依赖的库。
Android Studio 提供了一些实用工具,用于识别应用项目中任何多余的依赖项。
- 外部库
Android Studio 的Project 视图包含一个External Libraries 部分。
此部分包含应用使用的所有库,包括原生代码和所有传递依赖项。在此视图中,查找应用不需要的未使用或重复的库。
- APK 分析器
您可以使用APK 分析器工具比较不同的构建版本,包括即时应用构建版本。
确定应用不需要哪些库后,通过向您的 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 的依赖项管理指南。
实现云端资源交付
如果需要进一步缩小大小,您可能需要依赖于云端资源交付。