Passer au contenu

Résolution des conflits avec les Google Play Services

Bienvenue dans le cauchemar de la bibliothèque google-play-services :)

En résumé : différents plugins pour différents frameworks peuvent utiliser différentes versions de la bibliothèque google-play-services, ce qui empêche votre projet de compiler ou le fait planter car la version de la bibliothèque est obsolète.

La plupart du temps, c’est à vous de résoudre ces conflits. Heureusement, il existe une solution. Vous trouverez ci-dessous des solutions pour différents plugins.

Vous pouvez toujours trouver la bibliothèque Google Play Services dans <Android SDK>/extras/google
La bibliothèque est disponible sous la forme d’un gros fichier jar : sdk/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar
Ainsi que sous forme d’autres petits fichiers aar (qui signifie Android Archive) : sdk/extras/google/m2repository/com/google/android/gms/…

Un fichier aar peut être réduit à un fichier jar (tous les frameworks ne prennent pas en charge les fichiers aar pour le moment) en décompressant le fichier (un fichier aar est simplement une archive zip) et en extrayant classes.jar, qui contient le code de la bibliothèque.

1. Cordova

Anchor link to

Tous les conflits avec les Google Play Services sur Cordova sont résolus automatiquement à l’aide de Gradle. Cependant, il arrive que la résolution échoue (par exemple, lorsque différents plugins utilisent des versions majeures différentes de la bibliothèque) et que deux versions différentes de la même bibliothèque se retrouvent dans la version finale.

2. Unity, Appcelerator Titanium

Anchor link to

Vous trouverez la bibliothèque Google Play Services dans le plugin (ou dans le projet d’exemple). Il est facile de la mettre à jour, de la modifier ou de la supprimer pour résoudre d’éventuels conflits :

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

Prenez l’extension ANE, déconstruisez-la, puis reconstruisez-la.
Voici un exemple fonctionnel avec PushNotification.ane :

Terminal window
unzip PushNotification.ane -d tmp

La ligne de commande ci-dessus demande d’extraire le contenu du fichier .ane dans le répertoire tmp.

Dans tmp/META-INF/ANE/Android-ARM/ et tmp/META-INF/ANE/Android-x86/, vous trouverez toutes les bibliothèques (android-support_, play-services_) qui peuvent avoir été modifiées, mises à jour ou supprimées.

Si vous suivez toujours le lien vers le document ci-dessus, modifiez tmp/META-INF/ANE/Android-ARM/platform.xml et tmp/META-INF/ANE/Android-x86/platform.xml, puis compressez à nouveau l’extension et tout devrait fonctionner normalement.

eh bien…

PushNotification.ane n’est pas un fichier d’extension natif valide.

Il est un peu plus délicat de reconstruire l’extension :

  1. Supprimez tmp/META-INF/ANE/Android-ARM/platform.xml et tmp/META-INF/ANE/Android-x86/platform.xml
  2. Modifiez plutôt tmp/META-INF/ANE/Android-ARM/android-depends.xml et tmp/META-INF/ANE/Android-x86/android-depends.xml conformément au guide mentionné dans le lien ci-dessus.
  3. Exécutez les commandes bash suivantes :
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/ .

Vous pouvez trouver PushNotification.swc ici :
https://github.com/Pushwoosh/pushwoosh-adobe-air/blob/master/SWC-Pushwoosh/PushNotification.swc

4. Unreal Engine

Anchor link to

Unreal Engine et le plugin Pushwoosh entrent presque toujours en conflit. Cela s’explique par le fait qu’Unreal Engine contient par défaut les services Google Play et que les différentes versions du moteur utilisent différentes versions de ces bibliothèques. Le plugin Pushwoosh utilise également ces bibliothèques, mais un sous-ensemble légèrement différent. Vous devez toujours être prudent lors de l’intégration du plugin Pushwoosh pour Unreal Engine. Même si votre projet semble compiler et fonctionner correctement, vous devez vous assurer que Pushwoosh et Unreal Engine utilisent la même version des Google Play Services. L’utilisation de différentes versions des google-play-services dans un même projet est un “comportement indéfini” !

Pour résoudre un conflit, vous devez procéder comme suit :

1. Déterminez quelles bibliothèques Google Play Services sont déjà utilisées dans un projet. Vous pouvez le savoir en vérifiant les répertoires ${UNREAL_PROJECT}/Intermediate/Android/APK/JavaLibs et ${UNREAL_PROJECT}/Intermediate/Android/APK/libs. Par exemple, dans le projet d’exemple créé avec Unreal Engine 4.15, on trouve les bibliothèques suivantes :

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 // Ajouté par le plugin Pushwoosh

libs :

  • SystemUtils.jar
  • VrApi.jar
  • play-services-gcm-9.2.0.jar // Ajouté par le plugin Pushwoosh
  • play-services-iid-9.2.0.jar // Ajouté par le plugin Pushwoosh

2. Si les versions des bibliothèques play-services* utilisées dans Pushwoosh et Unreal Engine ne correspondent pas, supprimez ces bibliothèques du plugin Pushwoosh.

2.1 Déterminez quelles bibliothèques manquantes vous devez ajouter au plugin Pushwoosh. Le plugin nécessite les bibliothèques android-support-v4, play-services-base, play-services-basement, play-services-gcm et play-services-iid. Pour le projet d’exemple, seules play-services-gcm et play-services-iid ne se chevauchent pas ; ce sont donc les seules bibliothèques à ajouter dans ce cas particulier.

2.2 Pour ajouter la bibliothèque, il suffit de placer le fichier .jar du SDK Android dans https://github.com/Pushwoosh/pushwoosh-unreal-engine/tree/master/Plugins/Pushwoosh/lib/Android/libs. L’emplacement des bibliothèques Google Play est décrit au début de cet article.

Partagez vos retours avec nous

Anchor link to

Vos retours nous aident à créer une meilleure expérience, c’est pourquoi nous aimerions beaucoup avoir votre avis si vous rencontrez des problèmes lors du processus d’intégration du SDK. Si vous rencontrez des difficultés, n’hésitez pas à nous faire part de vos réflexions via ce formulaire.