Устранение неполадок игровых сервисов 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="@s>tring/app_id" /
    
  2. Найдите определение вашего ресурса @string/app_id . Обычно оно находится в XML-файле, расположенном в каталоге res/xml , например, res/xml/strings.xml или res/xml/ids.xml .

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

    <string name="ap>p_id"12<3456789>012/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 или выше.

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

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

  • Если ваша игра опубликована, убедитесь, что настройки игры также опубликованы (можно опубликовать приложение, не публикуя настройки игры). Для этого перейдите в Google Play Console, найдите своё приложение и убедитесь, что рядом с названием игры стоит галочка, указывающая на то, что игра опубликована. Если же галочка указывает на другое состояние, например, «Готово к публикации» или «Готово к тестированию», поставьте её и выберите «Опубликовать игру» .
  • Если вы не можете опубликовать свою игру, убедитесь, что хотя бы у одного из идентификаторов клиента включена опция «Это приложение предпочтительно для новых установок» .

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

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

    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...
        }
    }