创建即时启用的应用包

您可以通过将 Google Play 免安装体验作为 Android 应用包的一部分来创建它。这样的应用包称为*即时启用的应用包*。本文档将向您展示如何为即时启用的应用包设置开发环境,以及如何配置、构建、测试和发布即时启用的应用包。

如果您有使用已弃用的功能插件 (com.android.feature) 的现有免安装应用项目,请了解如何迁移您的免安装应用以支持 Android 应用包

设置开发环境

要在应用包中提供免安装体验,您需要访问 Google Play 免安装开发 SDK。您可以使用以下方法之一安装 SDK

  • 安装 Android Studio 3.6 或更高版本。打开 Android Studio 后,从SDK 管理器中的SDK 工具标签页下载 Google Play 免安装开发 SDK。
  • 从命令行安装

    cd path/to/android/sdk/tools/bin && \
      ./sdkmanager 'extras;google;instantapps'
    

此外,如果您想在本地测试您的免安装体验,请获取物理或虚拟设备的访问权限。

了解所需的执行条件

Google Play 免安装体验在一种特殊的 SELinux 沙盒中运行即时启用的应用包,以增强安全性。此沙盒允许部分权限,以及与其他应用的有限交互类型。以下部分将更详细地解释此沙盒的特征。

支持的权限和操作

即时启用的应用包只能使用以下列表中的权限

处理常见的不受支持的权限

以下是您必须从应用中移除的常见、不受支持的权限列表,以及每种权限的建议迁移路径

  • ACCESS_WIFI_STATE: 使用 ACCESS_NETWORK_STATE,它应该提供与 ACCESS_WIFI_STATE 类似的信息。
  • BILLING: 这是已弃用的权限。请使用Google Play Billing Library,它不再需要 com.android.vending.BILLING 权限。
  • READ/WRITE_EXTERNAL_STORAGE: 免安装应用无法访问外部存储;请改用内部存储。
  • com.google.android.c2dm.permission.RECEIVEpermission.C2D_MESSAGE: C2DM 已弃用。请迁移到 Firebase Cloud Messaging (FCM)。FCM 无需任何额外权限即可工作。

此外,即时启用的应用包不能执行以下操作

访问已安装的应用

开发免安装体验时,请记住,除非满足以下条件之一,否则它无法与设备上已安装的应用交互

  • 已安装应用中的一个或多个 activity 已将其 android:visibleToInstantApps 元素设置为 true此元素适用于运行 Android 8.0 (API 级别 26) 或更高版本的应用。
  • 已安装应用包含一个 intent 过滤器,其中包含 CATEGORY_BROWSABLE
  • 免安装体验正在使用 ACTION_SENDACTION_SENDTOACTION_SEND_MULTIPLE 操作发送 intent。

为免安装体验配置您的项目

为了与 Google Play 免安装体验兼容,您必须仔细配置即时启用的应用包的多个方面。以下部分将介绍这些注意事项。

声明项目依赖项

要在应用中使用 Google Play 免安装 API,请在应用模块的 build.gradle 配置文件中包含以下声明

Groovy

implementation "com.google.android.gms:play-services-instantapps:17.0.0"

Kotlin

implementation("com.google.android.gms:play-services-instantapps:17.0.0")

定义正确的版本代码

您的应用的免安装体验版本代码需要小于可安装应用的版本代码。期望是用户从 Google Play 免安装体验转向在设备上下载和安装应用。Android 框架将此过渡视为应用更新。

为确保您遵循用户期望的版本控制方案,请遵循以下策略之一

  • 将 Google Play 免安装体验的版本代码从 1 开始重新启动。
  • 将可安装 APK 的版本代码大幅增加,例如 1000,以确保您的免安装体验的版本号有足够的增长空间。

您可以在两个独立的 Android Studio 项目中开发免安装应用和可安装应用。但是,如果您这样做,则必须执行以下操作才能在 Google Play 上发布您的应用

  1. 在两个 Android Studio 项目中使用相同的软件包名称。
  2. 在 Google Play 管理中心,将两个变体上传到同一个应用。

有关设置应用版本的更多详细信息,请参阅应用版本控制

更新目标沙盒版本

您的免安装应用的 AndroidManifest.xml 文件需要更新,以定位 Google Play 免安装体验支持的沙盒环境。您可以通过将 android:targetSandboxVersion 属性添加到应用的 <manifest> 元素来完成此更新,如以下代码片段所示

<manifest
   xmlns:android="http://schemas.android.com/apk/res/android"
  ...
   android:targetSandboxVersion="2" ...>

有关更多信息,请参阅关于 targetSandboxVersion 属性的文档。

声明即时启用的应用模块

您可以使用以下方法之一声明您的应用包支持免安装体验

  • 如果您有只包含基础模块的现有应用包,您可以按如下方式启用其即时体验功能

    1. 通过菜单栏中选择视图 > 工具窗口 > 项目打开项目面板。
    2. 右键点击您的基础模块(通常命名为“app”),然后选择重构 > 启用即时应用支持
    3. 在出现的对话框中,从下拉菜单中选择您的基础模块。
    4. 点击确定

    Android Studio 会将以下声明添加到模块的 manifest 中

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
        <dist:module dist:instant="true" />
        ...
    </manifest>
    
  • 如果您有包含多个模块的现有应用包,您可以创建即时启用的功能模块。此过程还会即时启用您应用的基础模块,让您可以选择在应用内支持多个即时入口点

添加登录支持

如果您的免安装体验允许用户登录,您的即时启用的应用包必须支持 Android 上的 Smart Lock for Passwords。如果您正在构建“即时玩”游戏,则应改用Google Play 游戏服务登录。

支持执行环境

为了与免安装体验运行的 SELinux 沙盒兼容,在创建即时启用的应用包时请记住以下几点

  • 不要共享 myUid() 的值,这是您的应用进程由内核分配的 UID
  • 如果您的应用目标是 Android 8.1 (API 级别 27) 或更低版本,请创建 网络安全配置文件,并将 cleartextTrafficPermitted 设置为 false。免安装体验不支持 HTTP 流量。对于目标为 Android 9 或更高版本的应用,明文流量默认禁用。
  • 您的免安装体验会保留在用户设备上,直到免安装体验缓存被清除,这会在以下情况之一中发生

    • 由于设备可用内存不足,免安装体验缓存被垃圾回收。
    • 用户重新启动了他们的设备。

    如果发生任一过程,用户必须重新下载您的免安装体验才能与其交互。

  • 如果系统存储空间非常不足,您的免安装体验的用户数据可能会从内部存储中移除。因此,建议定期将用户数据与您的应用服务器同步,以保留用户的进度。

为免安装体验工作流程添加逻辑

配置应用包以支持免安装体验后,请添加以下部分中所示的逻辑。

检查应用是否正在运行免安装体验

如果您的应用逻辑的某些部分取决于用户是否正在使用您的免安装体验,请调用 isInstantApp() 方法。如果当前运行的进程是免安装体验,此方法将返回 true

显示安装提示

如果您正在构建应用或游戏的试用版,Google Play 免安装体验允许您在免安装体验中显示提示,邀请用户在设备上安装完整体验。要显示此提示,请使用 InstantApps.showInstallPrompt() 方法,如以下代码片段所示

Kotlin

class MyInstantExperienceActivity : AppCompatActivity {
    // ...
    private fun showInstallPrompt() {
        val postInstall = Intent(Intent.ACTION_MAIN)
                .addCategory(Intent.CATEGORY_DEFAULT)
                .setPackage(your-installed-experience-package-name)

        // The request code is passed to startActivityForResult().
        InstantApps.showInstallPrompt(this@MyInstantExperienceActivity,
                postInstall, request-code, /* referrer= */ null)
    }
}

Java

public class MyInstantExperienceActivity extends AppCompatActivity {
    // ...
    private void showInstallPrompt() {
        Intent postInstall = new Intent(Intent.ACTION_MAIN)
                .addCategory(Intent.CATEGORY_DEFAULT)
                .setPackage(your-installed-experience-package-name);

        // The request code is passed to startActivityForResult().
        InstantApps.showInstallPrompt(MyInstantExperienceActivity.this,
                postInstall, request-code, /* referrer= */ null);
    }
}

将数据传输到已安装的体验

如果用户喜欢您的免安装体验,他们可能会决定安装您的应用。为了提供良好的用户体验,将用户数据从您的免安装体验传输到应用的完整版本非常重要。

如果用户使用的是运行 Android 8.0 (API 级别 26) 或更高版本的设备,并且您的应用指定了 targetSandboxVersion2,则用户数据会自动传输到应用的完整版本。否则,您必须手动传输数据。为此,请使用以下 API 之一

  • 对于使用运行 Android 8.0 (API 级别 26) 及更高版本的设备的用户,请使用 Cookie API - 示例应用
  • 如果用户可以在运行 Android 7.1 (API 级别 25) 及更低版本的设备上与您的体验交互,请添加对 Storage API 的支持 - 示例应用

构建应用包

您可以使用 Android Studio 或命令行界面构建即时启用的应用包。

Android Studio

使用 Android Studio,您可以通过选择构建 > 构建 Bundle(s) / APK(s) > 构建 Bundle(s)来构建您的应用包。有关构建项目的更多信息,请参阅构建您的项目

命令行界面

您还可以使用 Gradle 从命令行构建应用包

支持 64 位架构

在 Google Play 上发布的应用程序需要支持 64 位架构。添加应用的 64 位版本可以提高性能,并为仅支持 64 位硬件的设备做好准备。了解更多关于 64 位支持的信息

测试免安装体验

在发布即时启用的应用包之前,您可以从以下位置之一测试免安装体验以验证功能

Android Studio

要在本地计算机上使用 Android Studio 测试您的应用的免安装体验,请完成以下步骤

  1. 如果您的测试设备上已安装了您的应用版本,请将其卸载。
  2. 在 Android Studio 中,从运行/调试配置对话框常规标签页中显示的安装选项中,启用部署为免安装应用复选框。
  3. 在菜单栏中选择运行 > 运行,或点击工具栏中的运行 ,然后选择您想要测试应用免安装体验的设备。您应用的免安装体验将在您选择的测试设备上加载。

命令行界面

要在本地计算机上使用命令行测试您的应用的免安装体验,请完成以下步骤

  1. 如果您的测试设备上已安装了您的应用版本,请将其卸载。
  2. 通过输入以下命令在测试设备上侧载并运行您的免安装应用
ia run output-from-build-command

内部测试轨道

要从 Play 商店或您网站上的横幅测试您的应用的免安装体验,请将应用发布到 Play 管理中心上的内部测试轨道

要将您的应用发布到内部测试轨道,请完成以下步骤

  1. 按照将您的应用包上传到 Play 管理中心指南中的步骤上传您的应用包。
  2. 准备上传的应用包以发布到内部测试轨道。有关更多信息,请参阅关于如何准备并发布版本的支持文章。
  3. 在设备上登录内部测试人员帐户,然后从以下界面之一启动您的免安装体验

    • 您应用 Play 商店商品详情中的立即试用按钮。
    • 您应用网站上横幅中的链接。

将应用包发布到生产轨道

要发布即时启用的应用包,请完成以下步骤

  1. 如果您尚未使用发布密钥签署您的应用包将应用包上传到 Play 管理中心,请立即完成。
  2. 在 Play 管理中心中,打开发布管理 > Android 免安装应用,然后导航到免安装应用生产轨道。
  3. 选择从库中更新,然后选择您已上传的即时启用的应用包。

选择发布免安装体验的位置

您可以在用户可以安装您应用的国家和地区子集中推出您应用的免安装体验。当您希望向居住在特定国家和地区的用户推广您应用的免安装体验时,此功能非常有用。

其他资源

要了解有关创建免安装体验和 Android 应用包的更多信息,请参阅以下资源

视频:即时打包应用
在此 Android Dev Summit '18 会议中,了解如何将免安装体验添加到 Android 应用包。
视频:使用 Android 应用包发布更小的应用
了解应用包如何帮助您更快地开发应用并为用户创建更小的 APK。
Codelab:您的第一个 Android 应用包
创建 Android 应用包并为其添加功能的循序渐进指南。
Android 应用包格式
了解更多关于 bundletool 命令行程序如何从您的应用代码和资源中组织应用包的信息。