将现有游戏转换为即时游戏

Google Play Instant 中运行应用的设置步骤,如 创建你的第一个即时应用 中所述,也适用于游戏。本指南重点介绍了一些特定于游戏的设置步骤。

你可以使用 Unity(使用或不使用 Google Play Instant Unity 插件)、Cocos2DAndroid Studio 或你自己的自定义引擎来开发 Google Play Instant 游戏。

本指南假设你已经知道想要提供的游戏体验类型。如果你想了解制作高质量游戏的理念和最佳实践,请阅读 Google Play Instant 上游戏的 UX 最佳实践

此外,在发布可在 Google Play Instant 上运行的游戏之前,请查看 技术要求清单

包含以下 Intent 过滤器的活动将成为 Google Play Instant 体验的入口点

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

当用户点击 Play 商店中的“立即试用”按钮或 Google Play 游戏应用中的 “即时玩” 按钮时,会启动此活动。你也可以使用 深度链接 API 直接启动此活动。

定义正确的版本代码

游戏的即时体验的版本代码需要小于可安装游戏的版本代码。以这种方式对应用进行版本控制,允许玩家从 Google Play Instant 体验过渡到将游戏下载并安装到设备上。Android 框架将此过渡视为应用更新。

为了确保您遵循推荐的版本控制方案,请遵循以下策略之一

  • 将 Google Play Instant 体验的版本代码从 1 开始。
  • 将可安装应用的版本代码增加一个较大的数字,例如 1000,以确保您的即时体验版本号有足够的增长空间。

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

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

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

支持执行环境

与其他应用一样,Google Play Instant 上的游戏在设备上的有限沙箱中运行。要支持此执行环境,请完成以下部分中显示的步骤。

选择退出明文流量

Google Play Instant 上的游戏不支持 HTTP 流量。如果您的游戏面向 Android 9(API 级别 28)或更高版本,则 Android 默认情况下会在您的游戏中禁用明文支持。

但是,如果您的游戏面向 Android 8.1(API 级别 27)或更低版本,则必须创建 网络安全配置 文件。在此文件中,将 cleartextTrafficPermitted 设置为 false,如以下代码片段所示

res/xml/network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="false">
        <domain includeSubdomains="true">secure.example.com</domain>
    </domain-config>
</network-security-config>

更新目标沙箱版本

更新您的即时游戏的 AndroidManifest.xml 文件,使其面向 Google Play Instant 支持的沙箱环境。您可以通过将 android:targetSandboxVersion 属性添加到游戏的 <manifest> 元素中来完成此更新,如以下代码片段所示

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

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

不要依赖于缓存或应用数据的存在

您的即时体验将保留在用户的设备上,直到即时体验缓存被清除,这种情况会在以下情况之一中发生

  • 由于设备可用内存不足,即时体验缓存被垃圾回收。
  • 用户重新启动设备。

如果发生上述任一过程,用户必须重新下载您的即时体验才能与之交互。

如果系统存储空间非常低,则您的即时体验的用户数据可能会从内部存储中删除。因此,建议定期将用户数据与游戏的服务器同步,以保存用户的进度。

减小应用大小

与其他类型的应用不同,Google Play Instant 上的游戏有 15 MB 的下载大小限制。要创建这种大小的游戏,您可能需要重构游戏的逻辑。本节介绍了一些工具和技术,可以帮助优化游戏的大小。

工具

以下工具列表可以帮助您确定是什么导致了游戏的大小

  • APK 分析器:提供已编译 APK 内容的整体视图。使用此视图,您可以确定每个元素对整体大小的贡献字节数。使用此工具快速检查游戏使用的资源、资产、逻辑和本机库的大小。
  • Bloaty McBloatface:显示二进制文件的尺寸配置文件。
  • Android GPU 检查器:查看减少纹理大小而不必重新编译游戏的文件大小影响。

技术

以下是一些您可以用来减小游戏大小的技术列表

  • 提取部分游戏的逻辑,并将其放置在一个或多个 功能模块 中,这些模块不会计入大小限制。
  • 降低游戏纹理的分辨率。
  • 考虑使用 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 文件。
  • 实现 资产云交付

将大型游戏分成多个 APK

即使应用了有关 减小 APK 大小 的建议,也很难优化 Google Play Instant 体验,使您的游戏适合单个 15 MB 的 APK。为了应对这一挑战,您可以将游戏分成多个 APK。玩家首先下载主要的基础 APK;在他们玩游戏时,剩余的拆分 APK 会在后台提供给游戏。

例如,基础 APK 可以包含核心游戏引擎和显示加载屏幕所需的资产。当基础 APK 启动时,它会显示加载屏幕并立即请求包含游戏和关卡数据的另一个拆分 APK。该拆分 APK 可用后,它可以将它的资产加载到游戏引擎中,并为玩家提供开始游戏所需的内容。

采用 UX 最佳实践

在您配置游戏以支持即时体验后,添加以下部分中显示的逻辑以提供良好的用户体验。

支持 64 位架构

在 Google Play 上发布的应用需要支持 64 位架构。添加应用的 64 位版本可以提供性能改进,并为仅支持 64 位硬件的设备做好准备。 详细了解 64 位支持

检查游戏是否正在运行即时体验

如果游戏的某些逻辑取决于用户是否参与了您的即时体验,请调用 isInstantApp() 方法。如果当前运行的进程是即时体验,则此方法将返回 true

通过执行此检查,您可以确定您的应用是否需要在 有限的执行环境 中运行,或者是否可以利用平台功能。

显示安装提示

如果您构建了试用版 Google Play Instant 体验,那么游戏应该在某个时刻提示玩家将完整版本安装到他们的设备上。为此,请在 showInstallPrompt() 方法中使用 Google API for Android

要详细了解何时以及如何提示玩家安装,请参阅 Google Play Instant 上游戏的 UX 最佳实践

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

如果玩家喜欢您的试用体验,他们可能会决定安装游戏的完整版本。为了提供良好的用户体验,将玩家的进度从您的即时体验转移到游戏的完整版本非常重要。

如果您的游戏 指定了 targetSandboxVersion2,则玩家的进度将自动传输到游戏的完整版本。否则,您必须手动传输与玩家进度相关的数据。为此,请使用 Cookie API - 示例应用

其他资源

从以下其他资源中详细了解 Google Play Instant

Codelab:构建您的第一个即时应用
在现有应用中添加对 Google Play Instant 的支持。
Codelab:构建多功能即时应用
将多功能应用模块化。