あなたの Androidゲームでの問題をトラブルシューティングする



  • この記事は、Google Playゲームサービスに関する記事を和訳したものです。
  • 原文: Troubleshooting Issues in Your Android Game
  • 元記事のライセンスは CC-BYで、この和訳記事のライセンスは CC-BYです。
  • 自己責任でご利用ください。
  • 和訳した時期は 2019年7月ころです。

このページは、Play Game SDKを用いて Androidゲームを開発中に遭遇するかもしれない問題をトラブルシューティングする方法について説明しています。

サインインできない

もしプレイヤーがあなたのゲームにサインインできないならば、まず、あなたのクライアント IDを作成する、および、ゲームサービスを構成するための手順に従っていることを確認してください。 もし、まだサインインエラーに遭遇するならば、あなたのゲームが正しくセットアップされていることを確認するために次の項目を確認してください。

あなたのメタデータタグをチェックする

あなたの AndroidManifest.xmlは、ゲームのメタデータタグを含んでいなければなりません。 あなたのメタデータタグが正しくセットアップされていることを確認するには:

  1. AndroidManifest.xmlを開き、以下に示すように meta-dataタグを含んでいることを確認します:

    <meta-data android:name="com.google.android.gms.games.APP_ID"
        android:value="@string/app_id" />
    
  2. あなたの @string/app_idリソースの定義を探します。 これは普通 res/xmlディレクトリにある XMLファイル、例えば、res/xml/strings.xmlあるいは res/xml/ids.xmlに定義されています。

  3. @string/app_idリソースの値があなたのアプリケーションの数字 IDと一致することを確認します。 このリソースの値は数字のみを含む必要があります。 例えば:

    <string name="app_id">123456789012</string>
    

あなたのパッケージ名をチェックする

あなたのゲームのパッケージ名は、あなたのクライアント ID上のパッケージ名と一致しなければなりません。 パッケージ名を確認するには:

  1. AndroidManifest.xmlを開き、あなたのゲームのパッケージ名が正しいことを確認します。 パッケージ名は manifestタグの package属性の値です。
  2. あなたのクライアント IDを作成するときに指定したパッケージ名を確認します。 Google Play Consoleにてパッケージ名を確認するには、Google Play Consoleに移動し、あなたのゲームに対応するエントリをクリックします。 Linked Appsタブに移動し、クライアント IDのリストを調べます。 このリストに、そのパッケージ名があなたの AndroidManifest.xmlのパッケージ名と一致する、リンクされた Androidアプリがある必要があります。
  3. もし不一致があるならば、正しいパッケージ名をもつ新しいクライアント IDを作成し、もう一度サインインしてみてます。

証明書のフィンガープリントをチェックする

あなたのゲームに署名している証明書は、あなたのクライアント IDに関連づけられた証明書のフィンガープリントと一致する必要があります。 これを確認するには、まず、証明書の SHA1フィンガープリントをチェックします:

  1. あなたの証明書ファイルを検索し、その SHA1フィンガープリントを取得します。 SHA1フィンガープリントを取得するには、次のコマンドを実行します:

    keytool -exportcert -alias your-key-name -keystore /path/to/your/keystore/file -list -v
    
  2. 出力にある SHA1:とラベルされた 16進数の列をメモします。 それがあなたの証明書のフィンガープリントです。

次に、あなたのビルドツールがこの証明書を使用していることをチェックします:

  1. あなたのビルドツールからあなたのゲームの APKを生成し、希望する証明書を用いてそれに署名します。 生成された APKを一時ディレクトリにコピーします。
  2. 一時ディレクトリにて、あなたの APKを展開するために次のコマンドを実行します。

    unzip YourGame.apk
    
  3. RSA証明書ファイルを使用して、秘密鍵を生成します:

    keytool -printcert -file META-INF/CERT.RSA
    

    あるいは、DSA証明書ファイルを使用して秘密鍵を生成することもできます。

    keytool -printcert -file META-INF/CERT.DSA
    
  4. SHA1:とラベルされたライン上の 16進数の列をメモします。

    この数字の列は、前のステップからのあなたの証明書のフィンガープリントと一致する必要があります。 もし不一致があるならば、あなたのビルドツールあるいはシステムは、あなたの証明書を用いてあなたのアプリケーションに署名するように構成されていません。 この場合は、それを正しく設定するための方法を決定するには、あなたのビルド環境のドキュメントを参照し、もう一度サインインします。

次に、証明書のフィンガープリントがあなたのクライアント IDにて構成されたフィンガープリントと一致するかどうかをチェックします。 これを行うには:

  1. Goole Play Consoleを開き、あなたのゲームに移動します。
  2. Game Detailsページで、一番下までスクロールし、リンクされた Google API Consoleプロジェクトへのリンクをクリックします。
  3. Google API Consoleにて、あなたのプロジェクトを選択します。
  4. 左側のサイドバーで APIs & authを選択します。 表示された APIのリストにて、Google Playゲームサービス APIのステータスが ONになってることを確認してください。
  5. 左側のサイドバーで Registered appsを選択します。
  6. OAuth 2.0 クライアント IDセクションを展開し、証明書のフィンガープリント(SHA1)をメモします。

もしこのフィンガープリントが前のステップからのあなたの証明書のフィンガープリントと一致しなければ、正しい証明書のフィンガープリントを使用して新しいクライアント IDを作成しなければなりません。 Google API Consoleではなく、Google Play Consoleにて新しいクライアント IDを作成しなければなりません。

テストアカウントが有効になっていることをチェックする

また、ゲームが公開される前には、Google Play Consoleにてゲームを作成したアカウントは、テスターとして有効にされなければなりません。 これが正しく構成されていることをチェックするには:

  1. Goole Play Consoleを開き、あなたのゲームに移動します。
  2. Testingタブを開きます。
  3. サインインしようとしているアカウントがテスターのリストにあることをチェックします。

もしサインインしようとしているアカウントがリストになければ、それをリストに追加し、数分待ち、もう一度サインインしてみます。

Proguardの問題

もし Proguardを使用していて、難読化された APKのエラーを見ているならば、あなたの AndroidManifest.xml上のターゲット APIレベルをチェックします。 それを 17以上にセットします。

セットアップの問題の他の原因

他の一般的なエラーの原因をチェックします:

  • もしあなたのゲームがマルチプレイヤーゲームであるならば、マルチプレイヤーサポートがあなたのクライアント ID用に有効となっていることをチェックします。
  • もしあなたのゲームが公開されているならば、ゲーム設定も公開されていることをチェックします(ゲーム設定を公開することなく、アプリケーションを公開することは可能です)。 これを行うには、Google Play Consoleに移動し、あなたのアプリに移動して、ゲーム名に隣接したボックスがそれが公開されていることを示していることをチェックしてください。 もし、それが "Ready to Publish" あるいは "Ready to Test" といった、別の状態にあることを示しているならば、ボックスをクリックして Publish Gameを選択します。
  • もしあなたのゲームを公開することができなければ、クライアント IDのひとつが正確に This app is preferred for new installationsオプションを有効にしていることをチェックします。

リスナーが呼び出されない

マルチプレイヤーのリスナーが見当たらない

マルチプレイヤーゲームは、典型的に RoomUpdateListenerRoomStatusUpdateListenerRealTimeMessageReceivedListenerといったリスナーをセットアップする必要があります。

このリスナーを使用するときによくある間違いは、マルチプレイヤーゲームをセットアップしたすべてのコードパス上の RoomConfigオブジェクトにそれらを追加し忘れていることです。

私たちは、適切なコールバックを用いて RoomConfig.Builderを生成するヘルパーメソッドを記述することをお勧めします。

    private RoomConfig.Builder makeBasicRoomConfigBuilder() {
        RoomConfig.Builder builder = RoomConfig.builder(this);
        builder.setMessageReceivedListener(this);
        builder.setRoomStatusUpdateListener(this);

        // ...add other listeners as needed...

        return builder;
    }

それから、コールバックメソッドを手動でセットアップする代わりに、マルチプレイヤーゲームをセットアップするときは常にこのメソッドを使用します。 ルームを作成しているか参加しているかに関係なく、マルチプレイヤーゲームを開始するすべてのシナリオ上でこれをしなければなりません。

無名リスナー

無名リスナーを使用しないでください。 無名リスナーは、以下で示すような、インラインで定義されているリスナインタフェイスの実装です。

    ImageManager im = ...;

    // Anonymous listener -- dangerous:
    im.loadImage(new ImageManager.OnImageLoadedListener() {
        @Override
        public void onImageLoaded(Uri uri, Drawable drawable) {
            // ...code...
        }
    }

無名リスナーは信頼できません、なぜなら Play Game SDKはそれらを弱い参照として維持するからです、それは、それらが呼び出される前にガベージコレクタによって再利用されるかもしれないことを意味します。 代わりに、Activityといった永続的なオブジェクトを使用してリスナーを実装する必要があります。

    public class MyActivity extends Activity
            implements ImageManager.OnImageLoadedListener {

        private void loadOurImages() {
            ImageManager im = ...;
            im.loadImage(this);
        }

        @Override
        public void onImageLoaded(Uri uri, Drawable drawable) {
            // ...code...
        }
    }