Перейти к содержанию

Разрешение конфликтов с Google Play Services

Добро пожаловать в кошмар с библиотекой google-play-services :)

В двух словах: разные плагины для разных фреймворков могут использовать разные версии библиотеки google-play-services, и ваш проект либо не компилируется, либо падает из-за того, что версия библиотеки устарела.

В большинстве случаев разрешение этих конфликтов ложится на вас. К счастью, это можно исправить. Ниже приведены решения для различных плагинов.

Вы всегда можете найти библиотеку Google Play Services по пути <Android SDK>/extras/google
Библиотека доступна как один большой jar-файл: sdk/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar
А также в виде небольших aar-файлов (что означает Android Archive): sdk/extras/google/m2repository/com/google/android/gms/…

aar-файл можно преобразовать в jar-файл (на данный момент не все фреймворки поддерживают aar), разархивировав его (aar — это обычный zip-архив) и взяв файл classes.jar — код библиотеки.

1. Cordova

Anchor link to

Все конфликты с google play services в Cordova разрешаются автоматически с помощью gradle. Но иногда (например, когда разные плагины используют разные мажорные версии библиотеки) разрешение может не сработать, и в итоговой сборке могут появиться две разные версии одной и той же библиотеки.

2. Unity, Appcelerator Titanium

Anchor link to

Вы можете найти библиотеку Google Play Services в плагине (или в примере проекта), их легко обновить/изменить/удалить для разрешения возможных конфликтов:

Terminal window
rm -rf Assets/Plugins/Android/google-play-services_lib/libs
rm -rf Assets/Plugins/Android/google-play-services_lib/res
cp ${ANDROID_HOME}/extras/google/m2repository/com/google/android/gms/play-services-analytics/8.4.0/play-services-analytics-8.4.0.aar Assets/Plugins/Android/
cp ${ANDROID_HOME}/extras/google/m2repository/com/google/android/gms/play-services-ads/8.4.0/play-services-ads-8.4.0.aar Assets/Plugins/Android/

3. Adobe Air

Anchor link to

Возьмите расширение ANE, разберите его и соберите заново.
Вот рабочий пример с PushNotification.ane:

Terminal window
unzip PushNotification.ane -d tmp

Приведенная выше команда извлекает содержимое .ane-файла в директорию tmp.

Теперь в tmp/META-INF/ANE/Android-ARM/ и tmp/META-INF/ANE/Android-x86/ вы можете найти все библиотеки: android-support_, play-services_, которые можно было изменить/обновить/удалить.

Если вы все еще следуете по ссылке на документ выше, измените tmp/META-INF/ANE/Android-ARM/platform.xml и tmp/META-INF/ANE/Android-x86/platform.xml, затем снова запакуйте расширение в zip-архив, и все должно работать нормально.

Однако…

PushNotification.ane is not a valid native extension file.

Собрать расширение обратно немного сложнее:

  1. Удалите tmp/META-INF/ANE/Android-ARM/platform.xml и tmp/META-INF/ANE/Android-x86/platform.xml
  2. Вместо этого измените tmp/META-INF/ANE/Android-ARM/android-depends.xml и tmp/META-INF/ANE/Android-x86/android-depends.xml согласно руководству по ссылке выше.
  3. Выполните следующие bash-команды:
Terminal window
#rename platform.xml on iOS, we'll need this to get the extension back together
mv tmp/META-INF/ANE/iPhone-ARM/platform.xml tmp/META-INF/ANE/iPhone-ARM/platform-iOS.xml
#pack the extension back with adt
cd tmp/META-INF/ANE/
“${flex.sdk}/bin/adt" -package -target ane PushNotification.ane extension.xml -swc ../../../../SWC-Pushwoosh/PushNotification.swc -platform iPhone-ARM -platformoptions iPhone-ARM/platform-iOS.xml -C iPhone-ARM/ . -platform Android-ARM -platformoptions Android-ARM/android-depends.xml -C Android-ARM/ . -platform Android-x86 -C Android-x86/ . -platformoptions Android-x86/android-depends.xml -platform default -C default/ .

Вы можете найти PushNotification.swc здесь:
https://github.com/Pushwoosh/pushwoosh-adobe-air/blob/master/SWC-Pushwoosh/PushNotification.swc

4. Unreal Engine

Anchor link to

Unreal Engine и плагин Pushwoosh почти всегда будут конфликтовать друг с другом. Это объясняется тем, что Unreal Engine по умолчанию содержит сервисы Google Play, и разные версии движка используют разные версии этих библиотек. Плагин Pushwoosh также использует эти библиотеки, но немного другой их набор. Вы всегда должны быть осторожны при интеграции плагина Pushwoosh для Unreal Engine. Даже если ваш проект, кажется, компилируется и работает хорошо, вы должны убедиться, что и Pushwoosh, и Unreal Engine используют одну и ту же версию Google Play Services. Использование разных версий google-play-services в одном проекте является «неопределенным поведением» (undefined behaviour)!

Чтобы разрешить конфликт, выполните следующие действия:

1. Определите, какие библиотеки Google Play Services уже используются в проекте. Вы можете выяснить это, проверив директории ${UNREAL_PROJECT}/Intermediate/Android/APK/JavaLibs и ${UNREAL_PROJECT}/Intermediate/Android/APK/libs. Например, в примере проекта, созданном с использованием Unreal Engine 4.15, есть следующие библиотеки:

JavaLibs:

  • downloader_library
  • play-services-ads-lite-9.2.0
  • play-services-auth-base-9.2.0
  • play-services-basement-9.2.0
  • play-services-drive-9.2.0
  • play-services-gass-9.2.0
  • play-services-plus-9.2.0
  • support-v4-23.0.0
  • play-services-ads-9.2.0
  • play-services-auth-9.2.0
  • play-services-base-9.2.0
  • play-services-clearcut-9.2.0
  • play-services-games-9.2.0
  • play-services-nearby-9.2.0
  • play-services-tasks-9.2.0
  • pushwoosh-ue-plugin // Добавлено плагином Pushwoosh

libs:

  • SystemUtils.jar
  • VrApi.jar
  • play-services-gcm-9.2.0.jar // Добавлено плагином Pushwoosh
  • play-services-iid-9.2.0.jar // Добавлено плагином Pushwoosh

2. Если версии библиотек play-services*, используемых в Pushwoosh и Unreal Engine, не совпадают, удалите эти библиотеки из плагина Pushwoosh.

2.1 Определите, какие недостающие библиотеки следует добавить в плагин Pushwoosh. Плагину требуются библиотеки android-support-v4, play-services-base, play-services-basement, play-services-gcm, play-services-iid. Для примера проекта не пересекаются только play-services-gcm и play-services-iid, поэтому в данном конкретном случае следует добавить только их.

2.2 Чтобы добавить библиотеку, просто поместите .jar-файл из Android SDK в https://github.com/Pushwoosh/pushwoosh-unreal-engine/tree/master/Plugins/Pushwoosh/lib/Android/libs. Расположение библиотек Google Play описано в начале этой статьи.

Поделитесь с нами своим мнением

Anchor link to

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