Разрешение конфликтов с 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 в плагине (или в примере проекта), их легко обновить/изменить/удалить для разрешения возможных конфликтов:
- Unity:
https://github.com/Pushwoosh/pushwoosh-unity/tree/master/PushwooshUnitySample/Assets/Plugins/Android - Unity и плагин Google Analytics:
Плагин Google Analytics использует устаревшую библиотеку google play, которую необходимо обновить. Подробнее здесь: https://github.com/Pushwoosh/pushwoosh-unity/issues/5
rm -rf Assets/Plugins/Android/google-play-services_lib/libsrm -rf Assets/Plugins/Android/google-play-services_lib/rescp ${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/
- Appcelerator Titanium (обратите внимание, что версия модуля может меняться быстрее, чем этот документ!): https://github.com/Pushwoosh/pushwoosh-appcelerator-titanium/tree/master/Module-Source/android/src/com/pushwoosh/module
3. Adobe Air
Anchor link toВозьмите расширение ANE, разберите его и соберите заново.
Вот рабочий пример с PushNotification.ane:
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.
Собрать расширение обратно немного сложнее:
- Удалите tmp/META-INF/ANE/Android-ARM/platform.xml и tmp/META-INF/ANE/Android-x86/platform.xml
- Вместо этого измените tmp/META-INF/ANE/Android-ARM/android-depends.xml и tmp/META-INF/ANE/Android-x86/android-depends.xml согласно руководству по ссылке выше.
- Выполните следующие bash-команды:
#rename platform.xml on iOS, we'll need this to get the extension back togethermv tmp/META-INF/ANE/iPhone-ARM/platform.xml tmp/META-INF/ANE/iPhone-ARM/platform-iOS.xml
#pack the extension back with adtcd 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 toUnreal 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. Если вы столкнетесь с какими-либо трудностями, пожалуйста, не стесняйтесь поделиться своими мыслями с нами через эту форму.