将现有游戏转换为免安装应用

设置支持 Google Play 免安装体验的应用的步骤(如创建您的第一个免安装应用中所述)也适用于游戏。本指南着重介绍专用于游戏的一些设置步骤。

您可以使用 Unity(无论是否带有 Google Play Instant Unity 插件)、Cocos2DAndroid Studio 或自己的自定义引擎,开发支持 Google Play 免安装体验的游戏。

本指南假定您已了解自己想要提供的游戏体验。如果您想了解制作高品质游戏的理念和最佳做法,请参阅支持 Google Play 免安装体验的游戏的用户体验最佳做法

此外,在发布支持 Google Play 免安装体验的游戏前,您还应查阅技术要求核对清单

包含以下 intent 过滤器的 activity 将作为 Google Play 免安装体验的入口点:

<activity android:name=".GameActivity">
       <intent-filter>
          <action android:name="android.intent.action.MAIN" />
          <category android:name="android.intent.category.LAUNCHER" />
       </intent-filter>
    </activity>
    

当用户点按 Play 商店或 Play 游戏应用中的立即体验按钮时,将启动该 Activity。您也可使用深层链接 API 来直接启动该 Activity。

如果希望玩家使用您的 URL 来访问您的游戏,您也可以添加应用链接。不过,如果要添加这些应用链接,您还需要添加一个默认 URL,该 URL 需要与其中一个应用链接 URL 完全匹配。

以下代码段展示了应用链接和默认 URL 的示例组合:

<activity
       android:name=".GameActivity" ... >

       <!-- App links (HTTP and HTTPS) -->
       <intent-filter android:autoVerify="true">
           <action android:name="android.intent.action.VIEW" />

           <category android:name="android.intent.category.BROWSABLE" />
           <category android:name="android.intent.category.DEFAULT" />

           <data android:scheme="http" />
           <data android:scheme="https" />
           <data android:host="example.com" />
           <data android:pathPrefix="/instant" />
       </intent-filter>

       <!-- Default URL -->
       <meta-data
           android:name="default-url"
           android:value="https://example.com/instant" />
    </activity>
    

版本号

游戏的免安装应用的版本号需要小于游戏的可安装版本的版本号。这样做的目的是希望玩家从 Google Play 免安装体验过渡到在自己的设备上下载并安装游戏。Android 框架将这一过渡视为应用更新。

为确保遵循此版本控制方案,您可以采用以下策略之一:

  • 从 1 开始重新设置 Google Play 免安装体验的版本号。
  • 将可安装式 APK 的版本号提高一个较大的数值(如 1000),以确保有足够的空间来提高免安装应用的版本号。

如需了解有关应用版本设置的更多详情,请参阅控制应用版本

目标沙盒版本

与其他应用一样,支持 Google Play 免安装体验的游戏也在设备上的受限沙盒内运行。需要更新免安装应用的 AndroidManifest.xml 文件,以便将此沙盒作为目标运行位置。您可以通过将 android:targetSandboxVersion 属性添加到 <manifest> 元素来完成此更新,如以下代码段所示:

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

如果您使用 Gradle 3.0 或更高版本来构建游戏的 Android 版本,则可以将 com.android.featurecom.android.instantapps 插件应用到您的功能模块中。这两个插件会自动将必要的属性添加到模块的清单文件中。

如需了解详情,请参阅 targetSandboxVersion 属性文档。

缩减 APK 大小

与其他类型的应用不同,支持 Google Play 免安装体验的游戏具有 10MB 的下载大小限制。要创建此大小的游戏,您可能需要重构游戏的逻辑。本节将介绍一些可以帮助您优化游戏大小的工具和技巧。

工具

下面的工具可以帮助您确定哪些内容构成了游戏的大小:

  • APK 分析器:提供关于已编译的 APK 所含内容的完整视图。通过这个视图,您可以了解各个元素在总体大小中所占的字节数。此工具可以快速检查游戏所用的资源、素材资源、逻辑和原生库的大小。
  • Bloaty McBloatface:显示二进制文件的大小配置文件。
  • GAPID:在不重新编译游戏的情况下,查看缩减纹理大小对文件大小的影响。

技巧

下面列出的技巧可以帮助您缩减游戏的大小:

  • 降低游戏纹理的分辨率。
  • 考虑使用 WebP,特别是在 GPU 上使用未压缩的纹理时。以 WebP 格式创建的图像的质量与 JPEG 图像的质量相同,但大小会缩减 15% 到 30%。虽然解压缩 WebP 图像需要花费更长的时间,但此时间仍然比下载游戏纹理所需的时间要短得多。

    Google 也将此格式整合到了开源游戏引擎中。

  • 仅使用游戏的可安装版本提供的声音的一部分。

  • 使用不同的编译标记来帮助缩小二进制文件:

    • -fvisibility=hidden 是最重要的一个。在 cmake 中,您可以按照如下方式来指定它:
      $ set_target_properties(your-target PROPERTIES CXX_VISIBILITY_PRESET hidden)
          
    • -Oz 对缩减大小也很重要。如果使用 gcc 进行编译,请改用 -Os
    • -flto 有时可以缩减文件大小。
    • 连接器标记:将 --gc-sections 和编译器标记(如 -ffunction-sections-fdata-sections)搭配使用。
  • 使用 Proguard 压缩您的代码和资源

  • 使用 Gradle 4.4 或更高版本生成更小的 DEX 文件。

Play 核心拆分安装 API

即使采用了缩减 APK 大小的建议,也可能很难通过优化 Google Play 免安装体验来使游戏容纳到单个 10MB 的 APK 中。为克服这一困难,您可以将游戏分割为多个 APK。玩家可以先下载主要的基本 APK,在他们玩游戏的过程中,游戏可从后台调用其他拆分 APK。

例如,基本 APK 可以包含核心游戏引擎以及显示加载屏幕所需的资源。基本 APK 启动后,它会显示加载屏幕,并立即请求包含游戏和关卡数据的其他拆分 APK。在这个拆分 APK 可用后,它可以将其资源加载到游戏引擎中,并向玩家提供开始游戏所需的内容。

安装提示

在 Google Play 免安装体验过程中的某个时刻,游戏应提示玩家在其设备上安装游戏的完整版本。要实现此操作,请使用 Google APIs for Android 中的 showInstallPrompt() 方法。

要进一步了解应如何以及何时提示玩家安装游戏,请参阅支持 Google Play 免安装体验的游戏的用户体验最佳做法

其他资源

如需详细了解 Google Play 免安装体验,请参阅下面列出的其他资源:

Codelab:构建您的第一个免安装应用
在现有的应用中添加对 Google Play 免安装体验的支持。
Codelab:构建多功能免安装应用
模块化处理多功能应用。