Mon application qui utilise le SDK Google Maps (v2) vient de commencer à planter avec cette exception:
Process: com.currentlocation.android, PID: 7328
java.lang.ArrayIndexOutOfBoundsException: length=1; index=12
at com.google.maps.api.android.lib6.gmm6.vector.ct.<init>(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (120400-0):9)
at com.google.maps.api.android.lib6.gmm6.vector.cv.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (120400-0):23)
at com.google.maps.api.android.lib6.gmm6.util.m.run(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (120400-0):14)
at java.lang.Thread.run(Thread.java:919)
Dans le SDK v3 beta, la trace de la pile est:
2020-04-23 15:59:06.064 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example, PID: 22717
java.lang.ArrayIndexOutOfBoundsException: length=1; index=12
at com.google.android.libraries.maps.bv.zzbs.<init>(ZoomTable.java:24)
at com.google.android.libraries.maps.bv.zzbv.zza(ZoomTableQuadTree.java:57)
at com.google.android.libraries.maps.br.zzd.zza(Unknown Source:4)
at com.google.android.libraries.maps.hi.zzas.zza(Suppliers.java:7)
at com.google.android.libraries.maps.br.zza.zzh(SharedMapComponentImpl.java:58)
at com.google.android.libraries.maps.gu.zzat.zza(RendererFactoryImpl.java:88)
at com.google.android.libraries.maps.it.zzav.zza(GoogleMapImpl.java:59)
at com.google.android.libraries.maps.it.zzci.zza(MapFragmentDelegateImpl.java:3)
at com.google.android.libraries.maps.it.zzcg.zza(MapFragmentDelegateImpl.java:15)
at com.google.android.libraries.maps.SupportMapFragment$zza.onCreateView(SupportMapFragment.java:15)
at com.google.android.gms.dynamic.zae.zaa(com.google.android.gms:play-services-base@@17.1.0:4)
at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaa(com.google.android.gms:play-services-base@@17.1.0:9)
at com.google.android.gms.dynamic.DeferredLifecycleHelper.onCreateView(com.google.android.gms:play-services-base@@17.1.0:25)
at com.google.android.libraries.maps.SupportMapFragment.onCreateView(SupportMapFragment.java:34)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:310)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1185)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)
at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:336)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1186)
at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2222)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1995)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1951)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1847)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2621)
at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:336)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1186)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)
at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1432)
at android.app.Activity.performStart(Activity.java:7848)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3294)
2020-04-23 15:59:06.064 E/AndroidRuntime: at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Quelle est la cause?
Réponses:
Modifier : voici la solution officielle de Google ( lien )
Sommaire
Le thread du SDK Google Maps bloque l'application (ArrayIndexOutOfBoundsException) - Solution proposée
La description
Le 23 avril 2020 à partir de 11h30 PDT , Google a servi pendant 4 heures une mise à jour de la configuration d'un composant mobile Maps, déclenchant des plantages dans les SDK Maps pour Android et iOS. Les applications sur les appareils qui ont téléchargé cette version de la configuration (pendant la période d'indisponibilité) étaient vulnérables au crash. Des solutions de contournement sont proposées pour les SDK Maps pour Android et iOS.
SDK Maps pour Android
SDK Maps pour Android v2 (inclus dans les services Google Play)
Les mises à jour des services Google Play pour corriger le plantage ont été publiées sur tous les appareils équipés des services Google Play version 17.4.55 et plus récente. Aucun changement n'a été apporté au numéro de version des services Google Play sur l'appareil après l'installation de la mise à jour. Aucune action n'est requise de la part des développeurs ou des utilisateurs finaux pour recevoir le module Maps mis à jour; cependant, les développeurs peuvent vérifier que le module est présent sur un appareil donné avec la commande adb suivante:
Vous devriez voir la ligne
Module Set ID: maps
répertoriée dans laModule Sets
section.Les taux de plantage de Maps SDK pour Android v2 sont de retour à la normale.
Pour l'instant, si vous n'avez pas mis à jour votre application avec les solutions de contournement de code côté client mentionnées ci-dessous, vous n'avez pas besoin de prendre d'autres mesures.
Si vous avez déjà mis à jour votre application avec les solutions de contournement, vous pouvez supprimer la solution de contournement dans une mise à jour ultérieure de votre application (mais conserver la solution de contournement est sûr).
Premium Plan Maps SDK pour Android v2 ou Maps SDK pour Android v3 beta (bibliothèques statiques)
Si votre application utilise le SDK Premium Plan Maps pour Android v2 ou Maps SDK pour Android v3 bêta (bibliothèques statiques) et continue de subir des plantages, nous vous recommandons vivement de déployer les solutions de contournement ci-dessous via une mise à jour de votre application. Comme votre application charge une version statique du SDK, vulnérable aux mauvaises données stockées sur certains appareils, seule une mise à jour de votre application peut résoudre le problème.
Approbations des avis sur Play Store
Si vous mettez à jour votre application mais que vous rencontrez des retards d'approbation des avis sur le Play Store, veuillez déposer un dossier d'assistance avec l'ID de package de votre application: Contactez l'équipe d'assistance . Notre équipe de support transmettra en interne votre demande et accélérera l'approbation.
Avis négatifs dans le Google Play Store
Certains développeurs d'applications se sont renseignés sur les avis 1 étoile dans le Google Play Store laissés par les utilisateurs finaux en raison de plantages. Seuls les commentaires enfreignant la politique de Google Play [1] peuvent être supprimés. Vous pouvez également signaler les avis abusifs dans la Play Console [2]. Les applications ne seront pas automatiquement supprimées du Google Play Store en raison d'avis négatifs. Il convient également de noter que le calcul de la note globale de votre avis sur l'application favorise les avis récents, ce qui signifie que votre note retrouvera son niveau d'avant l'incident au fil du temps.
[1] Notes et avis sur le Play Store
[2] Signaler des avis inappropriés
SDK Maps pour iOS
Les taux de crash sur iOS sont revenus à la normale. Si votre application connaît toujours des plantages, vous devez mettre à jour et publier votre application avec les solutions de contournement de code communiquées ici.
Pour toute question sur le déploiement ou l'accélération de votre application dans l'App Store d'Apple, veuillez contacter Apple directement.
Avec cette mise à jour, nous fermons ce problème. Merci à tous pour votre patience. Notre équipe effectue une enquête interne approfondie sur cet incident; dès que possible, nous publierons notre analyse (dans environ une semaine). En attendant, si vous avez des questions ou rencontrez toujours des problèmes, veuillez déposer un dossier d'assistance .
Solutions de contournement:
Les utilisateurs finaux sur Android peuvent effacer les données de l'application affectée (pas seulement le cache).
Les utilisateurs finaux sur iOS peuvent désinstaller puis réinstaller les applications concernées.
Les développeurs d'applications peuvent appliquer les solutions de contournement de code ci-dessous afin de résoudre le problème pour tous leurs utilisateurs finaux.
Solution de code pour iOS:
L'emplacement recommandé pour le code est avant l'initialisation de GMSServices dans la méthode application (_: didFinishLaunchingWithOptions :) (Swift) ou application: didFinishLaunchingWithOptions: (Objective-C). Plus précisément:
Rapide:
Objectif c:
Solution de code pour Android:
L'emplacement recommandé pour le code est dans Application.onCreate ():
Java
Kotlin
Les solutions de contournement fournies ici couvrent toutes les versions et versions disponibles de nos SDK pour Android. Pour clarifier davantage (au cas où vous auriez publié une version antérieure de la solution de contournement qui ne supprimait pas autant de fichiers):
Les applications qui utilisent Maps Android SDK v3 beta ne doivent supprimer qu'un seul fichier, soit
DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) ou
DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())
la source
Il semble que dans chaque application, Google Map crée un fichier ZoomTables.data.
Ce fichier était mal formé, une version malformée qui pouvait être téléchargée à partir du commentaire . Pour reproduire le problème, supprimez ZoomTables.data des packages d'application sur l'appareil et insérez-en un mal formé. L'application devrait se bloquer.
Actuellement, le problème a été résolu du côté de Google, mais les applications contiennent toujours une version en cache de ce fichier de données. Pour résoudre le problème, nous devons supprimer ce fichier dès le démarrage de l'application dans la méthode Application onCreate.
Mise à jour 1
J'ai mis à jour la solution de contournement, sur la base des derniers commentaires des développeurs Google :
la source
Cette solution a fonctionné pour moi
Ouvrez à nouveau l'application et vérifiez si le problème est résolu.
Vous trouverez ci-dessous des suggestions uniquement pour aider vos clients.
Envoyez un e-mail à tous vos utilisateurs pour les désagréments et décrivez-leur le problème qu'ils ont rencontré et donnez-leur les étapes mentionnées ci-dessus pour résoudre leur problème.
Vous pouvez également envoyer une notification push à tous vos utilisateurs avec les notifications push Firebase, si votre application dispose du service de notifications push.
Démonstration de captures d'écran:
la source
Pour Android, plusieurs développeurs ont mentionné une solution de contournement consistant à supprimer le fichier ZoomTable.data directement de leur application. Après examen, ce correctif semble sûr et vous pouvez l'essayer dans votre application.
Veuillez vous référer à https://issuetracker.google.com/154855417#comment179
Si vous souhaitez que vos utilisateurs continuent à utiliser votre application sans réinstaller, l'exemple de code est copié-collé ici pour votre commodité. Dans Application.onCreate () :
référence: Google Maps SDK plante - partiellement résolu
la source
Inconvénients des solutions ci-dessus:
Inconvénients de ma solution:
Ma solution intercepte l'exception levée par le SDK Maps, appelez ceci dans onCreate de la classe Application:
la source
La version productive a été corrigée (du côté de Google) mais si vous avez toujours des problèmes avec votre émulateur, vous ne devez exécuter le code suivant qu'une seule fois.
MainActivity.kt
Solution : effacez les données d'application (pas seulement le cache).
Remarque : Une copie du fichier problématique des packages d'application sur l'appareil si quelqu'un en a besoin pour une reproduction.
La source
GL
la source
Réponse complète et officielle pour tous:
Diagnostic: crash des SDK mobiles de la plate-forme Google Maps (iOS et Android) en charge.
Solution: * Effacez les données de l'application concernée (pas seulement le cache), ou désinstallez puis réinstallez la ou les applications concernées.
L'emplacement recommandé pour le code est avant l'initialisation de GMSServices dans la méthode application (_: didFinishLaunchingWithOptions :) (Swift) ou application: didFinishLaunchingWithOptions: (Objective-C). Plus précisément:
Rapide:
Objectif c:
Une fois que vous l'avez déployé dans votre application, vous pouvez déposer un dossier d'assistance Maps si vous souhaitez que nous accélérions son approbation. Veuillez vous assurer d'inclure l'ID de votre application, l'ID de l'ensemble et la version que vous souhaitez consulter dans votre cas.
Solution de code pour Android:
L'emplacement recommandé pour le code est dans Application.onCreate ():
Java
Kotlin
Source: https://issuetracker.google.com/issues/1548554
la source
Il s'agit du code de travail pour Xamarin. Vous devez installer le package de nuget Xamarin.Essentials.
la source
Vous devez appeler la méthode suivante sur le onCreate de votre application Android pour éviter le plantage.
la source