Skip to content

Устранение конфликтов 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 — код библиотеки.

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

Вы можете найти библиотеку 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/

Возьмите расширение 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, затем снова заархивируйте расширение, и все должно работать нормально.

Что ж…

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
#переименовываем platform.xml на iOS, это понадобится нам, чтобы собрать расширение обратно
mv tmp/META-INF/ANE/iPhone-ARM/platform.xml tmp/META-INF/ANE/iPhone-ARM/platform-iOS.xml
#упаковываем расширение обратно с помощью adt
cd tmp/META-INF/ANE/
“${flex.sdk}/bin/adt" -package -target ane PushNotification.ane extension.xml -swc ../../../../SWC-Wavesend/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/Wavesend/wavesend-adobe-air/blob/master/SWC-Wavesend/PushNotification.swc

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

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

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
  • wavesend-ue-plugin // Добавлено плагином Wavesend

libs:

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

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

2.1 Выясните, какие недостающие библиотеки следует добавить в плагин Wavesend. Плагину требуются библиотеки 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/Wavesend/wavesend-unreal-engine/tree/master/Plugins/Wavesend/lib/Android/libs. Расположение библиотек Google Play описано в начале этой статьи.

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

Section titled “Поделитесь с нами своим мнением”

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