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 检查。要使用该工具,请完成以下步骤
- 按下 Control+Alt+Shift+I(在 Mac OS 上是 Command+Alt+Shift+I)。
- 在出现的对话框中,输入
"unused resources"
。 - 选择Unused resources(未使用的资源)选项,开始资源使用情况检查过程。
如果您的应用中仍有大型资源,请考虑是否可以将其从应用中解压出来,并在用户开始与应用互动后将其下载为独立文件。这种图像加载延迟通常需要更改代码,但通过仅下载用户明确请求的资源,可以大幅减小即时应用的文件大小。
移除未使用的库
随着应用范围的扩大,它可能会引入数量惊人的依赖项,尤其是以下类型之一
- 原生库:包含您的即时应用从不运行的原生代码的库。
- 传递性依赖项:您的应用导入的库所依赖的库。
Android Studio 提供了几个有用的工具,用于识别应用项目中任何多余的依赖项
- 外部库
Android Studio 的 Project(项目)视图包含 External Libraries(外部库)部分。
此部分包含您的应用使用的每个库,包括原生代码和所有传递性依赖项。在此视图中,查找您的应用不需要的未使用或重复库。
- APK 分析器
您可以使用 APK 分析器工具来比较不同的构建,包括即时应用构建。
确定您的应用不需要哪些库后,通过在 Gradle 构建文件中添加类似以下内容来排除它们
<功能模块>/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 的依赖管理指南。
实现资源的云端交付
如果您需要进一步缩小大小,可能需要依赖资源的云端交付。