このページでは、Google Play Games サービスを使用して Android ゲームを開発する際に生じる可能性がある問題のトラブルシューティングの方法について説明します。
ロギング
ゲームに関する問題をトラブルシューティングするには、adb shell
コマンドを使用して、デバイスの詳細ログをオンにします。その後、logcat を使用して Google Play Games サービスのログメッセージを確認できます。
ログを有効にする
テストデバイスでログを有効にする手順は次のとおりです。
Android SDK がインストールされているマシンにデバイスを接続します。
ターミナルを開いて、次のコマンドを実行します。
adb shell setprop log.tag.Games VERBOSE
デバイスでゲームを実行して、デバッグしようとしている問題を再現します。
ログを表示します。
adb logcat
ログを無効にする
デバイスで Play ゲームサービスの詳細ログを無効にして、ロギングの動作を元に戻すには、次のコマンドを実行します。
adb shell setprop log.tag.Games INFO
ログインできません
プレーヤーがゲームにログインできない場合は、まず、クライアント ID の作成とゲームサービスの構成の手順を遵守していることを確認します。ログインのエラーが解消されない場合は、次の項目をチェックして、ゲームが正しく設定されていることを確認してください。
メタデータタグをチェックする
AndroidManifest.xml
にゲームのメタデータタグを設定する必要があります。メタデータタグが正しく設定されていることを確認するには、次の手順を行います。
AndroidManifest.xml
を開いて、次のようにmeta-data
タグが設定されていることを確認します。<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/app_id" />
@string/app_id
リソースの定義を見つけます。通常は、res/xml/strings.xml
やres/xml/ids.xml
など、res/xml
ディレクトリにある XML ファイルで定義されます。@string/app_id
リソースの値がアプリケーションの数値 ID と一致していることを確認します。このリソースの値には、数字のみを使用してください。例:<string name="app_id">123456789012</string>
パッケージ名を確認する
ゲームのパッケージ名がクライアント ID のパッケージ名と一致している必要があります。パッケージ名を確認するには、次の手順を行います。
AndroidManifest.xml
を開いて、ゲームのパッケージ名が正しいことを確認します。パッケージ名は、manifest
タグのpackage
属性の値です。クライアント ID の作成時に指定したパッケージ名を確認します。Google Play Console でパッケージ名を確認するには、Google Play Console にアクセスして、ゲームに対応するエントリをクリックします。
[リンク済みアプリ] タブに移動して、クライアント ID のリストを調べます。このリストに、
AndroidManifest.xml
内のものと同じパッケージ名を持つ Android リンク済みアプリが含まれている必要があります。パッケージ名が一致していない場合は、正しいパッケージ名で新しいクライアント ID を作成し、再度ログインを試行します。
証明書フィンガープリントをチェックする
ゲームの署名に使用する証明書が、クライアント ID に関連付けられている証明書フィンガープリントと一致している必要があります。これを確認するには、まず証明書の SHA1 フィンガープリントを次のようにチェックします。
証明書ファイルを探して、SHA1 フィンガープリントを取得します。SHA1 フィンガープリントを取得するには、次のコマンドを実行します。
keytool -exportcert -alias your-key-name -keystore /path/to/your/keystore/file -list -v
出力内で
SHA1:
というラベルが付加されている 16 進数のシーケンスをメモします。これが証明書のフィンガープリントです。
次に、ビルドツールがこの証明書を使用していることを確認します。
- ビルドツールでゲームの APK を生成し、必要な証明書を使用して署名します。生成された APK を一時ディレクトリにコピーします。
一時ディレクトリで、次のコマンドを実行して APK を解凍します。
unzip YourGame.apk
RSA 証明書ファイルを使用して秘密鍵を生成します。
keytool -printcert -file META-INF/CERT.RSA
または、DSA 証明書ファイルを使用して秘密鍵を生成することもできます。
keytool -printcert -file META-INF/CERT.DSA
SHA1:
というラベルが付加されている行の 16 進数のシーケンスをメモします。この数字のシーケンスが、前のステップでメモした証明書フィンガープリントと一致する必要があります。一致しない場合は、ビルドツールまたはシステムが、証明書を使用してアプリに署名するように構成されていません。その場合は、ビルド環境のマニュアルを参照して証明書の正しい構成方法を確認した後、再度ログインを試みてください。
次に、証明書フィンガープリントが、クライアント ID で構成されているフィンガープリントと一致するかどうかをチェックします。手順は次のとおりです。
- Google Play Console を開き、ゲームに移動します。
- [ゲームの詳細] ページで、下部までスクロールして、リンク済み Google Cloud Platform プロジェクトへのリンクをクリックします。
- プロジェクトを選択します。
- 左側にあるサイドバーで、[API と認証] を選択します。表示された API のリストで Google Play Games サービス API のステータスが [オン] になっていることを確認します。
- 左側にあるスライドバーで [登録済みアプリケーション] を選択します。
- [OAuth 2.0 クライアント ID] セクションを展開し、証明書フィンガープリント(SHA1)をメモします。
このフィンガープリントが、前の手順でメモした証明書のフィンガープリントと一致しない場合は、正しい証明書のフィンガープリントを使用して新しいクライアント ID を作成する必要があります。新しいクライアント ID は、Google Cloud Platform プロジェクトではなく、Google Play Console で作成する必要があります。
テスト アカウントが有効になっていることを確認する
ゲームを公開する前に、Google Play Console でゲームの作成に使用したアカウントを、テスト アカウントとしても有効にする必要があります。正しく構成されていることを確認するには:
- Google Play Console を開き、ゲームに移動します。
- [テスト] タブを開きます。
- ログインに使用するアカウントが、テスト アカウントのリストに含まれているかチェックします。
ログインに使用するアカウントがリストに含まれていない場合は、リストに追加し、数分待ってから再度ログインしてみてください。
Proguard の問題
Proguard を使用して難読化した APK でエラーが発生する場合は、AndroidManifest.xml
のターゲット API レベルをチェックしてください。レベルは 17 以上に設定する必要があります。
その他の原因による設定関連の問題
その他のよくあるエラー原因がないか、次の項目をチェックします。
- ゲームが公開されている場合は、ゲームの設定も公開されているかチェックします(ゲームの設定を公開せずにアプリが公開されている可能性があります)。これを行うには、Google Play Console に移動して、アプリに移動し、ゲーム名の横にあるボックスが公開済みであることを示しているか確認します。別の状態([公開の準備完了] や [テストの準備完了] など)になっている場合は、このボックスをクリックして [ゲームを公開する] を選択します。
- ゲームを公開できない場合は、クライアント ID のいずれか 1 つのみで [このアプリは新たなインストールにおすすめです] オプションが有効となっているかチェックします。
匿名リスナー
匿名リスナーは使用しないでください。匿名リスナーは、以下に示すように、インラインで定義されるリスナー インターフェースの実装です。
ImageManager im = ...;
// Anonymous listener -- dangerous:
im.loadImage(new ImageManager.OnImageLoadedListener() {
@Override
public void onImageLoaded(Uri uri, Drawable drawable) {
// ...code...
}
}
匿名リスナーは、Play Games 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...
}
}