Устранение неполадок игровых сервисов Play в играх для Android

На этой странице описано, как устранять неполадки, которые могут возникнуть при разработке игр для Android с использованием сервисов Google Play Games.

Ведение журнала

Для устранения неполадок в игре вы можете включить подробное логирование на своем устройстве с помощью команды adb shell . Затем вы можете просмотреть сообщения журнала Google Play Games Services с помощью команды logcat.

Включить ведение журнала

Чтобы включить ведение журнала на тестовом устройстве:

  1. Подключите устройство к компьютеру, на котором установлен Android SDK.

  2. Откройте терминал и выполните следующую команду:

    adb shell setprop log.tag.Games VERBOSE
  3. Запустите игру на устройстве и воспроизведите проблему, которую пытаетесь отладить.

  4. Просмотреть журналы:

    adb logcat

Отключить ведение журнала

Чтобы отключить подробное логирование для сервисов Play Games на вашем устройстве и вернуться к исходному режиму логирования, выполните следующую команду:

adb shell setprop log.tag.Games INFO

Не удалось выполнить аутентификацию.

Если вам не удаётся авторизовать игроков в игре, сначала убедитесь, что вы выполнили инструкции по созданию идентификаторов клиентов и настройке игровых сервисов . Если ошибки аутентификации сохраняются, проверьте следующие пункты, чтобы убедиться в правильной настройке игры.

Проверьте свои метаданные.

В вашем 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 . Обычно оно находится в XML-файле, расположенном в каталоге res/xml , например, res/xml/strings.xml или res/xml/ids.xml .

  3. Убедитесь, что значение ресурса @string/app_id совпадает с числовым идентификатором вашего приложения. Значение этого ресурса должно содержать только цифры. Например:

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

Проверьте название вашей посылки.

Название пакета вашей игры должно совпадать с названием пакета в вашем клиентском идентификаторе. Чтобы проверить название пакета:

  1. Откройте файл AndroidManifest.xml и убедитесь, что имя пакета вашей игры указано правильно. Имя пакета — это значение атрибута package в теге manifest .

  2. Проверьте имя пакета, которое вы указали при создании идентификатора клиента. Чтобы проверить имя пакета в Google Play Console, перейдите в Play Console и щелкните запись, соответствующую вашей игре.

  3. Перейдите на вкладку «Связанные приложения» и изучите список идентификаторов клиентов. В этом списке должно быть связанное приложение Android, имя пакета которого совпадает с именем пакета в вашем файле AndroidManifest.xml . Если есть несоответствие, создайте новый идентификатор клиента с правильным именем пакета и попробуйте пройти аутентификацию снова.

Проверьте отпечаток сертификата.

Сертификат, с помощью которого вы аутентифицируете свою игру, должен совпадать с отпечатком сертификата, связанным с вашим идентификатором клиента. Для проверки этого сначала проверьте отпечаток 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: .

    Эта последовательность цифр должна совпадать с отпечатком вашего сертификата, полученным на предыдущем шаге. Если есть несоответствие, значит, ваш инструмент или система сборки не настроены для подписи вашего приложения с помощью вашего сертификата. В этом случае обратитесь к документации вашей среды сборки, чтобы узнать, как правильно ее настроить, и попробуйте пройти аутентификацию снова.

Далее проверьте, совпадает ли отпечаток сертификата с отпечатком, настроенным в вашем идентификаторе клиента. Для этого:

  1. Откройте Play Console и найдите свою игру.
  2. На странице с подробной информацией об игре прокрутите страницу вниз и щелкните ссылку на соответствующий проект Google Cloud Platform.
  3. Выберите свой проект.
  4. В боковой панели слева выберите «API и аутентификация» . Убедитесь, что в отображаемом списке API сервисов Google Play Games статус «ВКЛ. ».
  5. В боковой панели слева выберите «Зарегистрированные приложения» .
  6. Разверните раздел «Идентификатор клиента OAuth 2.0» и запишите отпечаток сертификата (SHA1).

Если этот отпечаток не совпадает с отпечатком вашего сертификата, полученным на предыдущих шагах, необходимо создать новый идентификатор клиента с правильным отпечатком сертификата. Новый идентификатор клиента следует создавать в консоли Play, а не в проекте Google Cloud Platform.

Убедитесь, что тестовые учетные записи включены.

Перед публикацией игры необходимо также активировать учетную запись, создавшую игру в Play Console, в качестве тестировщика. Чтобы проверить правильность настройки:

  1. Откройте Play Console и найдите свою игру.
  2. Откройте вкладку «Тестирование» .
  3. Убедитесь, что учетная запись, с помощью которой вы пытаетесь пройти аутентификацию, находится в списке тестировщиков.

Если учетная запись, с помощью которой вы пытаетесь пройти аутентификацию, отсутствует в списке, добавьте ее, подождите несколько минут и попробуйте пройти аутентификацию снова.

Проблемы Proguard

Если вы используете Proguard и видите ошибки в обфусцированном APK-файле, проверьте уровень целевого API в файле AndroidManifest.xml . Убедитесь, что он установлен на 17 или выше.

Другие причины проблем с настройкой

Проверьте наличие других распространенных причин ошибок:

  • If your game is published, check that the game settings are also published (it is possible to publish the application without publishing the games settings). To do this, go to Google Play Console and navigate to your app, and check that the box next to the game's name indicates that it's published. If indicates that it is in another state, such as "Ready to Publish" or "Ready to Test", click the box and select Publish Game .
  • Если вы не можете опубликовать свою игру, убедитесь, что хотя бы у одного из идентификаторов клиента включена опция «Это приложение предпочтительно для новых установок» .

Анонимные слушатели

Не используйте анонимные обработчики событий. Анонимные обработчики событий — это реализации интерфейса обработчика событий, определенные непосредственно в коде, как показано ниже.

    ImageManager im = ...;

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

Анонимные обработчики событий ненадежны, поскольку SDK Play Games поддерживает их как слабые ссылки, а это значит, что они могут быть удалены сборщиком мусора до того, как будут вызваны. Вместо этого следует реализовывать обработчик событий с помощью персистентного объекта, такого как 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...
        }
    }