Android 游戏中 Play 游戏服务的故障排除

此页面介绍了如何在使用 Google Play 游戏服务开发 Android 游戏时遇到问题时进行故障排除。

日志记录

要对游戏中的问题进行故障排除,可以使用 adb shell 命令在设备上启用详细日志记录。然后,您可以使用 logcat 查看 Google Play 游戏服务的日志消息。

启用日志记录

要在测试设备上启用日志记录

  1. 将设备连接到安装了 Android SDK 的计算机。

  2. 打开终端并运行此命令

    adb shell setprop log.tag.Games VERBOSE
  3. 在设备上运行游戏并重现您尝试调试的问题。

  4. 查看日志

    adb logcat

禁用日志记录

要禁用设备上 Play 游戏服务的详细日志记录并恢复到原始日志记录行为,请运行以下命令

adb shell setprop log.tag.Games INFO

无法登录

如果您无法将玩家登录到您的游戏,请首先确保您已按照说明创建客户端 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.xmlres/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 中的包名,请转到 Play Console 并点击对应于您游戏的条目。

  3. 转到“已链接的应用”选项卡并检查客户端 ID 列表。此列表中应该有一个 Android 已链接的应用,其包名与 AndroidManifest.xml 中的包名匹配。如果存在不匹配,请使用正确的包名创建一个新的客户端 ID 并尝试再次登录。

检查证书指纹

您用来签署游戏的证书应与与您的客户端 ID 关联的证书指纹匹配。要验证这一点,请首先检查证书的 SHA1 指纹,如下所示

  1. 找到您的证书文件并获取其 SHA1 指纹。要获取 SHA1 指纹,请运行此命令

    keytool -exportcert -alias your-key-name -keystore /path/to/your/keystore/file -list -v
    
  2. 记下输出中标记为 SHA1: 的十六进制数字序列。那是您证书的指纹。

接下来,检查您的构建工具是否正在使用此证书

  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: 的行上的十六进制数字序列。

    此数字序列应与上一步中的证书指纹匹配。如果存在不匹配,则您的构建工具或系统未配置为使用您的证书对您的应用程序进行签名。在这种情况下,请参阅构建环境的文档以确定如何正确配置它,然后尝试再次登录。

接下来,检查证书指纹是否与客户端 ID 中配置的指纹匹配。为此

  1. 打开 Play Console 并导航到您的游戏。
  2. 在“游戏详情”页面上,滚动到底部并点击链接到已链接的 Google Cloud Platform 项目。
  3. 选择您的项目。
  4. 在左侧的边栏中,选择“API 和身份验证”。确保 Google Play 游戏服务 API 状态在显示的 API 列表中为“已启用”。
  5. 在左侧的边栏中,选择“已注册的应用”。
  6. 展开 OAuth 2.0 客户端 ID 部分并记下证书指纹 (SHA1)。

如果此指纹与上一步中的证书指纹不匹配,则必须使用正确的证书指纹创建新的客户端 ID。您必须在 Play Console 中创建新的客户端 ID,而不是在 Google Cloud Platform 项目中创建。

检查测试帐户是否已启用

在发布游戏之前,必须在 Play Console 中创建游戏的帐户也必须启用为测试人员。要检查此设置是否正确

  1. 打开 Play Console 并导航到您的游戏。
  2. 打开“测试”选项卡。
  3. 检查您尝试登录的帐户是否在测试人员列表中。

如果尝试登录的帐户未列出,请将其添加到列表中,等待几分钟,然后尝试再次登录。

Proguard 问题

如果您正在使用 Proguard 并看到混淆的 APK 上的错误,请检查 AndroidManifest.xml 上的目标 API 级别。确保将其设置为 17 或更高版本。

设置问题的其他原因

检查错误的其他常见原因

  • 如果您的游戏已发布,请检查游戏设置是否也已发布(可以在不发布游戏设置的情况下发布应用程序)。为此,请转到 Google Play Console 并导航到您的应用,并检查游戏名称旁边的框是否指示它已发布。如果指示它处于其他状态,例如“准备发布”或“准备测试”,请点击该框并选择“发布游戏”。
  • 如果无法发布游戏,请检查客户端 ID 中是否只有一个启用了“此应用是新安装的首选应用”选项。

匿名监听器

不要使用匿名监听器。匿名监听器是在行内定义的监听器接口实现,如下所示。

    ImageManager im = ...;

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

匿名监听器不可靠,因为 Play 游戏 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...
        }
    }