既存のゲームを Instant Game に変換する

初めての Instant App を作成するで説明した Google Play Instant で動作するアプリのセットアップ手順は、ゲームにも適用されます。このガイドでは、ゲームに固有のセットアップ手順について重点的に説明します。

Google Play Instant 対応のゲームを開発する際には、UnityGoogle Play Instant Unity プラグインの有無を問わない)、Cocos2DAndroid Studio、または独自のカスタム エンジンを使用できます。

このガイドは、提供するゲーム体験の内容について、すでに決定されている方を対象としています。高品質のゲームを開発するためのアイデアやおすすめの方法については、Google Play Instant 版ゲームのユーザー エクスペリエンスに関するベスト プラクティスをご覧ください。

また、Google Play Instant 上で稼働可能なゲームを公開する前に、技術要件のチェックリストを確認する必要があります。

次のインテント フィルタを含むアクティビティが、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 を使用して直接起動することもできます。

正しいバージョン コードを定義する

ゲームの Instant 版のバージョン コードは、インストール版ゲームのバージョン コードよりも小さくする必要があります。この方法でアプリをバージョニングすると、プレーヤーは Google Play Instant 版から移行してゲームをダウンロードし、デバイスにインストールできます。Android フレームワークは、この移行をアプリのアップデートと見なします。

推奨されるバージョニング スキームに準拠するには、次のいずれかの方法を採用してください。

  • Google Play Instant 版のバージョン コードを 1 から再開します。
  • インストール版 APK のバージョン コードを大きな数値の単位(たとえば 1000 単位)で増加するように設定して、Instant 版のバージョン番号を増やすための余地を確保します。

Instant 版のゲームとインストール版のゲームを 2 つの別々の Android Studio プロジェクトで開発することもできます。ただしその場合、ゲームを Google Play で公開するには、次の手順を行う必要があります。

  1. 両方の Android Studio プロジェクトで同じパッケージ名を使用します。
  2. Google Play Console で、両方のバリエーションを同じアプリにアップロードします。

ゲームのバージョン設定の詳細については、アプリのバージョニングをご覧ください。

実行環境をサポートする

Google Play Instant 版のゲームは他のアプリと同様に、デバイス上の制限付きサンドボックス内で稼働します。この実行環境をサポートするには、次のセクションに示す手順を実行します。

クリアテキスト トラフィックをオプトアウトする

Google Play Instant 版のゲームは HTTP トラフィックをサポートしていません。Android 9(API レベル 28)以降を対象にしているゲームの場合は、ゲームのクリアテキストのサポートはデフォルトで無効になります。

ただし、Android 8.1(API レベル 27)以前を対象とするゲームの場合は、ネットワーク セキュリティ構成ファイルを作成する必要があります。 このファイルで、次のコードスニペットに示すように、cleartextTrafficPermittedfalse に設定します。

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>
    

ターゲット サンドボックス バージョンを更新する

Instant 版ゲームの AndroidManifest.xml ファイルは、Google Play Instant でサポートされているサンドボックス環境をターゲットとするように更新する必要があります。この更新を行うには、次のコード スニペットに示すように、android:targetSandboxVersion 属性をゲームの <manifest> 要素に追加します。

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

詳細については、targetSandboxVersion 属性に関するドキュメントをご覧ください。

キャッシュまたはアプリのデータが存在することに依存しない

Instant 版は、Instant 版のキャッシュがクリアされるまで、ユーザーのデバイスにダウンロードされたまま残ります。キャッシュのクリアは次のいずれかの状況で発生します。

  • デバイスの空きメモリが不足しているために、Instant 版のキャッシュがガベージ コレクトされている。
  • ユーザーがデバイスを再起動する。

いずれかのプロセスが発生した場合、ユーザーは Instant 版を操作するために再度ダウンロードする必要があります。

システムの保存容量が非常に少なくなっている場合は、Instant 版のユーザーデータが内部ストレージから削除されている可能性があります。したがって、ユーザーの進行状況が保持されるように、ユーザーのデータをゲームのサーバーと定期的に同期することをおすすめします。

APK サイズを縮小する

他の種類のアプリとは異なり、Google Play Instant 版のゲームには、15 MB のダウンロード サイズの上限が設定されています。このサイズのゲームを作成するうえで、ゲームのロジックのリファクタリングが必要になることがあります。このセクションでは、ゲームのサイズを最適化するうえで有用なツールと手法について説明します。

ツール

ゲームのサイズにかかわる要因を判断するには、以下のツールを使用します。

  • APK Analyzer: コンパイル済み APK のコンテンツに関して包括的なビューを表示できます。このビューでは、全体のサイズに占める各要素のバイト数を確認できます。このツールを使用すると、ゲームが使用しているリソース、アセット、ロジック、ネイティブ ライブラリのサイズを簡単にチェックすることができます。
  • Bloaty McBloatface: バイナリ ファイルのサイズ プロファイルを表示します。
  • GAPID: ゲームを再コンパイルすることなく、テクスチャ サイズを縮小した場合のファイルサイズに対する効果を確認できます。

手法

ゲームのサイズ縮小に使用できる手法を以下に示します。

  • ゲームのロジックの一部を抽出し、1 つ以上の動的機能モジュールに配置します。配置したロジックはサイズの上限にはカウントされません。
  • ゲームのテクスチャの解像度を下げます。
  • GPU で非圧縮テクスチャを使用している場合は特に、WebP 形式を使用することを検討してください。WebP 形式を使用すると、JPEG 画像と同じ品質の画像を 15~30% 小さいサイズで作成できます。WebP 画像の場合、解凍時間が長くなりますが、ゲームのテクスチャをダウンロードする時間に比べればごく短時間です。Google は、WebP 形式とオープンソース ゲームエンジンとの統合も進めています。
  • 音声や音楽を圧縮または再利用します。
  • 以下の各種コンパイル フラグを使用することで、バイナリ ファイルのサイズを縮小できます。
    • -fvisibility=hidden – 最も重要なフラグです。cmake で次のように指定できます。
      $ set_target_properties(your-target PROPERTIES CXX_VISIBILITY_PRESET hidden)
          
    • -Oz – サイズを縮小するうえで、このフラグも重要です。gcc を使用してコンパイルする場合は、代わりに -Os を使用してください。
    • -flto – ファイルサイズを縮小できる場合があります。
    • リンカーフラグ – --gc-sections-ffunction-sections-fdata-sections などのコンパイラ フラグと組み合わせて使用します。
  • コードやリソースを圧縮するには、ProGuard を使用します。
  • サイズの小さい DEX ファイルを生成するには、Gradle 4.4 以降を使用します。
  • アセットのクラウド配信を実装します。

大規模なゲームを複数の APK に分割する

APK サイズを縮小するためのおすすめの方法を適用しても、Google Play Instant 版ゲームを最適化して単一の 10 MB の APK に収めることが難しい場合もあります。この問題に対処するために、ゲームを複数の APK に分割することができます。プレーヤーはまず、メインのベース APK をダウンロードします。その後、ゲームのプレイ中に残りの分割 APK がバックグラウンドで使用できるようになります。

たとえば、ベース APK には、核となるゲームエンジンと、ロード画面の表示に必要なアセットだけを含めます。ベース APK が起動すると、ロード画面が表示され、ゲームとレベルのデータを格納した追加の分割 APK がすぐにリクエストされます。分割 APK が利用可能になると、そのアセットがゲームエンジンにロードされ、ゲームを開始するのに必要なコンテンツがプレーヤーに提供されます。

UX に関するおすすめの方法を採用する

Instant 版をサポートするようにゲームを構成したら、次のセクションに示すロジックを追加して、優れたユーザー エクスペリエンスを提供できるようにします。

ゲームが Instant 版を実行しているかどうかを確認する

ゲームのロジックの一部が、ユーザーが Instant 版を使用中かどうかに依存している場合は、isInstantApp() メソッドを呼び出します。現在実行中のプロセスが Instant 版である場合、このメソッドは true を返します。

このチェックを行うことで、アプリを制限付きの実行環境で実行する必要があるかどうか、またはプラットフォーム機能を利用できるかどうかを判断できます。

インストール プロンプトを表示する

Google Play Instant の体験版を作成した場合は、ある時点で、完全版をデバイスにインストールするようプレーヤーに促すプロンプトを表示する必要があります。プロンプトを表示するには、Android 用 Google APIshowInstallPrompt() メソッドを使用します。

プレーヤーにインストールを促す方法やタイミングについて詳しくは、Google Play Instant 版ゲームのユーザー エクスペリエンスに関するベスト プラクティスをご覧ください。

インストール版にデータを転送する

プレーヤーが体験版を楽しむことができれば、ゲームの完全版をインストールしてもらえる可能性があります。優れたユーザー エクスペリエンスを提供するには、プレーヤーの進行状況を Instant 版からゲームの完全版に移行することが重要です。

プレーヤーが Android 8.0(API レベル 26)以降を搭載するデバイスを使用しており、ゲームで targetSandboxVersion2 に指定している場合は、プレーヤーの進行状況が完全版のゲームに自動転送されます。それ以外の場合は、プレーヤーの進行状況に関連するデータを手動で転送する必要があります。そのためには、次のいずれかの API を使用します。

  • プレーヤーが Android 8.0(API レベル 26)以降を搭載したデバイスを使用している場合は、Cookie API を使用します(サンプルアプリ)。
  • プレーヤーが Android 7.1(API レベル 25)以前を搭載したデバイスで Instant 版を操作できる場合は、Storage API のサポートを追加します(サンプルアプリ)。

参考情報

Google Play Instant の詳細については、以下の参考リンクをご覧ください。

コードラボ: 初めての Instant App を作成する
Google Play Instant に対するサポートを既存のアプリに追加します。
コードラボ: マルチ機能 Instant App を作成する
マルチ機能アプリをモジュール化します。