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

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

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

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

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

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

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

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

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

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

    adb logcat

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

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

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 статус API сервисов игр Google Play — «ВКЛ» .
  5. На боковой панели слева выберите Зарегистрированные приложения .
  6. Разверните раздел «Идентификатор клиента OAuth 2.0» и запишите отпечаток сертификата (SHA1).

Если этот отпечаток не совпадает с отпечатком вашего сертификата, полученным на предыдущих этапах, необходимо создать новый идентификатор клиента с правильным отпечатком сертификата. Новый идентификатор клиента необходимо создать в Play Console, а не в проекте 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...
        }
    }

Анонимные прослушиватели ненадёжны, поскольку 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...
        }
    }