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

用于设置支持 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 商店中的立即体验或 Google Play 游戏应用中的立刻开玩按钮时,系统便会启动该 Activity。您也可使用深层链接 API 直接启动该 Activity。

定义正确的版本号

游戏的免安装体验版的版本号必须低于游戏的可安装版本的版本号。通过这种方式对应用进行版本控制,有助于让玩家从 Google Play 免安装体验过渡到在自己的设备上下载并安装游戏。Android 框架将这一过渡视为应用更新。

为确保遵循建议的版本控制方案,请遵循以下某种策略:

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

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

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

如需详细了解游戏版本设置,请参阅控制应用版本

支持执行环境

与其他应用一样,支持 Google Play 免安装体验的游戏也在设备上的受限沙盒内运行。要支持此执行环境,请完成以下各部分中所示的步骤。

选择停用明文流量

支持 Google Play 免安装体验的游戏不支持 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 免安装体验支持的沙盒环境为目标平台。您可以通过将 android:targetSandboxVersion 属性添加到游戏的 <manifest> 元素来完成此更新,如以下代码段所示:

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

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

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

已下载的免安装体验版内容会一直保留在用户的设备上,直到该内容的缓存被清除,此清除操作可能会在以下情况下发生:

  • 由于设备的可用内存不足,系统需要对免安装体验缓存进行垃圾回收。
  • 用户重启设备。

如果出现上述任一情况,用户必须重新下载免安装体验才能与之互动。

如果系统的存储空间很少,则可能会将免安装体验的用户数据从内部存储空间中移除。因此,建议您定期将用户数据与游戏服务器进行同步,以便保留用户的进度。

缩减 APK 的大小

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

工具

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

  • 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 文件。
  • 实现资源的云端分发

将大型游戏分割为多个 APK

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

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

采用用户体验最佳做法

将游戏配置为支持免安装体验后,您可以添加以下各部分中介绍的逻辑以提供良好的用户体验。

检查游戏是否在运行免安装体验

如果游戏的部分逻辑依赖于用户是否参与了免安装体验,请调用 isInstantApp() 方法。如果当前正在运行的进程是免安装体验,则此方法会返回 true

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

显示安装提示

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

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

将数据转移到安装版体验

如果玩家喜欢您的试玩体验,他们可能会决定安装完整版游戏。为了提供良好的用户体验,请务必将玩家的游戏进度从免安装体验转移到完整版游戏上。

如果玩家使用的设备搭载的是 Android 8.0(API 级别 26)或更高版本,并且您的游戏targetSandboxVersion 指定为 2,则玩家的游戏进度会自动转移到完整版游戏上。否则,您必须手动转移与玩家游戏进度相关的数据。要实现此操作,请使用以下 API 之一:

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

其他资源

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

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