Устранение конфликтов 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
Section titled “1. Cordova”Все конфликты с google play services в Cordova разрешаются автоматически с помощью gradle. Но иногда (например, когда разные плагины используют разные мажорные версии библиотеки) разрешение может не сработать, и в итоговой сборке могут появиться две разные версии одной и той же библиотеки.
2. Unity, Appcelerator Titanium
Section titled “2. Unity, Appcelerator Titanium”Вы можете найти библиотеку Google Play Services в плагине (или в примере проекта). Их легко обновить/изменить/удалить для решения возможных конфликтов:
- Unity:
https://github.com/Wavesend/wavesend-unity/tree/master/WavesendUnitySample/Assets/Plugins/Android - Плагин Unity и Google Analytics:
Плагин Google Analytics использует устаревшую библиотеку Google Play, которую необходимо обновить. Подробнее здесь: https://github.com/Wavesend/wavesend-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/Wavesend/wavesend-appcelerator-titanium/tree/master/Module-Source/android/src/com/wavesend/module
3. Adobe Air
Section titled “3. Adobe Air”Возьмите расширение 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, затем снова заархивируйте расширение, и все должно работать нормально.
Что ж…
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-команды:
#переименовываем platform.xml на iOS, это понадобится нам, чтобы собрать расширение обратноmv tmp/META-INF/ANE/iPhone-ARM/platform.xml tmp/META-INF/ANE/iPhone-ARM/platform-iOS.xml
#упаковываем расширение обратно с помощью adtcd 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
4. Unreal Engine
Section titled “4. Unreal Engine”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. Если вы столкнулись с какими-либо трудностями, пожалуйста, не стесняйтесь поделиться с нами своими мыслями через эту форму.