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

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

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

このガイドは、提供するゲーム エクスペリエンスの内容について、すでに決定していることを前提としています。高品質のゲームを開発するためのアイデアやおすすめの方法については、Google Play Instant 版ゲームの UX に関するおすすめの方法をご覧ください。

さらに、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>

このアクティビティは、ユーザーが Google Play ストアで [今すぐ試す] ボタンをタップするか、Google Play Games アプリで [クイックプレイ] ボタンをタップすると起動します。このアクティビティは、deep link API を使用して直接起動することもできます。

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

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

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

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

Instant Game とインストール版のゲームを 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 版のユーザーデータが内部ストレージから削除される場合があります。したがって、ユーザーの進行状況が保持されるように、ユーザーのデータをゲームのサーバーと定期的に同期させることをおすすめします。

アプリのサイズを削減する

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

ツール

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

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

手法

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

  • ゲームのロジックの一部を抽出し、機能モジュールに配置します。機能モジュールはサイズの上限にはカウントされません。
  • ゲームのテクスチャの解像度を下げます。
  • 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 版ゲームを最適化して単一の 15 MB の APK に収めることが難しい場合もあります。この問題に対処するために、ゲームを複数の APK に分割することができます。プレーヤーはまず、メインのベース APK をダウンロードします。その後、ゲームのプレイ中に残りの「分割 APK」 がバックグラウンドで使用できるようになります。

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

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

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

64 ビット アーキテクチャのサポート

Google Play で公開するアプリは、64 ビット アーキテクチャをサポートする必要があります。64 ビット版のアプリを追加することで、パフォーマンスを向上させ、64 ビット ハードウェアのみで構成されたデバイスに対応できるようになります。64 ビット サポートの詳細

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

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

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

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

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

プレーヤーにインストールを促す方法やタイミングについて詳しくは、Google Play Instant 版ゲームの UX に関するおすすめの方法をご覧ください。

インストール版にデータを移行する

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

ゲームで targetSandboxVersion2 に指定している場合は、プレーヤーの進行状況が完全版のゲームに自動的に移行されます。それ以外の場合は、プレーヤーの進行状況に関連するデータを手動で移行する必要があります。そのためには、Cookie API - サンプルアプリを使用します。

参考情報

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

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