Moja aplikacja korzystająca z Google Maps SDK (v2) właśnie zaczęła się zawieszać z tym wyjątkiem:
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)
W v3 beta SDK, ślad stosu to:
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)
Jaka jest przyczyna?
Odpowiedzi:
Edycja : poniżej znajduje się oficjalne rozwiązanie od Google ( link )
Podsumowanie
Wątek zestawu SDK Map Google zawiesza się Aplikacja (ArrayIndexOutOfBoundsException) - oferowane rozwiązanie
Opis
W dniu 23 kwietnia 2020 r., O godzinie 11:30 PDT , Google przez 4 godziny aktualizował konfigurację komponentu mobilnego Maps, powodując awarie w pakietach SDK do map na Androida i iOS. Aplikacje na urządzeniach, które pobrały tę wersję konfiguracji (w okresie wyłączenia) były podatne na awarię. Rozwiązania obejścia są oferowane dla Maps SDKs dla Androida i iOS.
Maps SDK dla Androida
Maps SDK dla Androida v2 (zawarte w usługach Google Play)
Aktualizacje usług Google Play w celu naprawienia awarii zostały opublikowane na wszystkich urządzeniach z usługami Google Play w wersji 17.4.55 i nowszych. Po zainstalowaniu aktualizacji w urządzeniu nie ma zmiany numeru wersji usług Google Play. Programiści ani użytkownicy końcowi nie muszą podejmować żadnych działań, aby otrzymać zaktualizowany moduł Map; programiści mogą jednak sprawdzić, czy moduł jest obecny na danym urządzeniu za pomocą następującego polecenia adb:
Powinieneś zobaczyć linię
Module Set ID: maps
wymienioną wModule Sets
sekcji.Częstotliwość awarii Maps SDK dla Androida v2 wróciła do normy.
Na razie, jeśli nie zaktualizowałeś swojej aplikacji o opisane poniżej obejścia kodu po stronie klienta, nie musisz podejmować dalszych działań.
Jeśli aplikacja została już zaktualizowana za pomocą obejść, możesz usunąć to obejście w kolejnej aktualizacji aplikacji (ale zachowanie tego obejścia jest bezpieczne).
Pakiet abonamentowy Maps SDK dla Androida v2 lub Maps SDK dla Androida v3 beta (biblioteki statyczne)
Jeśli Twoja aplikacja korzysta z pakietu Premium Plan Maps SDK dla systemu Android v2 lub Maps SDK dla systemu Android v3 w wersji beta (biblioteki statyczne) i nadal występują awarie, nadal zalecamy wdrożenie poniższych obejść poprzez aktualizację aplikacji. Ponieważ aplikacja ładuje statyczną wersję zestawu SDK, która jest podatna na złe dane przechowywane na niektórych urządzeniach, tylko aktualizacja aplikacji może rozwiązać problem.
Zatwierdzenia recenzji w Sklepie Play
Jeśli aktualizujesz aplikację, ale występują opóźnienia w zatwierdzaniu recenzji w Sklepie Play, prześlij zgłoszenie do pomocy technicznej, podając identyfikator aplikacji: Skontaktuj się z zespołem pomocy technicznej . Nasz Zespół Wsparcia wewnętrznie eskaluje twoją prośbę i przyspieszy zatwierdzenie.
Negatywne recenzje w sklepie Google Play
Niektórzy twórcy aplikacji pytali o recenzje 1-gwiazdkowe w Sklepie Google Play pozostawione przez użytkowników końcowych z powodu awarii. Tylko komentarze naruszające zasady Google Play [1] można usunąć. Możesz także oflagować obraźliwe recenzje w konsoli Play [2]. Aplikacje nie zostaną automatycznie usunięte ze sklepu Google Play z powodu negatywnych recenzji. Warto również zauważyć, że obliczenie ogólnej oceny recenzji aplikacji faworyzuje ostatnie recenzje, co oznacza, że z czasem twoja ocena powróci do poziomu sprzed incydentu.
[1] Oceny i przegląd w Sklepie Play
[2] Zgłoś nieodpowiednie recenzje
Maps SDK dla iOS
Awarie w systemie iOS wróciły do normy. Jeśli w aplikacji nadal występują awarie, musisz zaktualizować i opublikować aplikację, korzystając z przedstawionych tutaj obejść kodu.
W przypadku pytań dotyczących wdrażania lub przyspieszania aplikacji w Apple App Store skontaktuj się bezpośrednio z Apple.
Dzięki tej aktualizacji zamykamy ten problem. Dziękujemy wszystkim za cierpliwość. Nasz zespół przeprowadza dogłębne wewnętrzne dochodzenie w sprawie tego incydentu; tak szybko, jak to możliwe, opublikujemy naszą analizę (za około tydzień). W międzyczasie, jeśli masz jakieś pytania lub nadal masz problemy, złóż zgłoszenie do pomocy technicznej .
Obejścia:
Użytkownicy końcowi na Androidzie mogą wyczyścić dane aplikacji, której dotyczy problem (nie tylko pamięć podręczną).
Użytkownicy końcowi w systemie iOS mogą odinstalować, a następnie ponownie zainstalować aplikacje, których dotyczy problem.
Programiści aplikacji mogą zastosować poniższe obejścia kodu, aby rozwiązać problem dla wszystkich swoich użytkowników końcowych.
Obejście kodu dla systemu iOS:
Zalecane umieszczenie kodu jest przed inicjalizacją GMSServices w aplikacji (_: didFinishLaunchingWithOptions :) (Swift) lub aplikacji: didFinishLaunchingWithOptions: (Objective-C). Konkretnie:
Szybki:
Cel C:
Obejście kodu dla Androida:
Zalecane miejsce dla kodu znajduje się w Application.onCreate ():
Jawa
Kotlin
Przedstawione tutaj obejścia obejmują wszystkie dostępne smaki i wersje naszych zestawów SDK dla Androida. W celu dalszego wyjaśnienia (w przypadku zwolnienia wcześniejszej wersji obejścia, które nie usunęło tylu plików):
Aplikacje korzystające z aplikacji Android Android SDK v3 w wersji beta powinny również wymagać usunięcia tylko jednego pliku
DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) lub
DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())
źródło
Wygląda na to, że w każdej aplikacji Google Map tworzy plik ZoomTables.data.
Ten plik miał zniekształconą, zniekształconą wersję, którą można pobrać z komentarza . Aby odtworzyć problem, usuń ZoomTables.data z pakietów aplikacji na urządzeniu i wstaw zniekształcony. Aplikacja powinna ulec awarii.
Obecnie problem został rozwiązany po stronie Google, ale aplikacje nadal zawierają buforowaną wersję tego pliku danych. Aby rozwiązać ten problem, powinniśmy usunąć ten plik bezpośrednio z poziomu aplikacji uruchamianej w aplikacji Application onCreate Method.
Aktualizacja 1
Zaktualizowałem obejście na podstawie najnowszego komentarza programistów Google :
źródło
To rozwiązanie działało dla mnie
Otwórz aplikację ponownie i sprawdź, czy problem został rozwiązany.
Poniżej znajdują się sugestie, które mają pomóc Twoim klientom.
Wyślij wiadomość e-mail do wszystkich użytkowników w związku z niedogodnościami i opisz im napotkany problem, podając wyżej wymienione kroki w celu rozwiązania problemu.
Możesz również wysyłać powiadomienia wypychane do wszystkich użytkowników za pomocą powiadomień push Firebase, jeśli Twoja aplikacja ma usługę powiadomień wypychanych.
Demonstracja zrzutów ekranu:
źródło
W przypadku Androida wielu programistów wspomniało o obejściu polegającym na usunięciu pliku ZoomTable.data bezpośrednio z ich aplikacji. Po sprawdzeniu poprawka wydaje się bezpieczna i można ją wypróbować w aplikacji.
Należy zapoznać się https://issuetracker.google.com/154855417#comment179
Jeśli chcesz, aby użytkownicy nadal korzystali z Twojej aplikacji bez ponownej instalacji, przykładowy kod jest wklejany tutaj dla Twojej wygody. W Application.onCreate () :
odniesienie: Google Maps SDK ulega awarii - częściowo rozwiązany
źródło
Wady powyższych rozwiązań:
Wady mojego rozwiązania:
Moje rozwiązanie wychwytuje wyjątek zgłoszony przez Maps SDK, nazwij to w onCreate klasy Application:
źródło
Wersja produkcyjna została naprawiona (po stronie Google), ale jeśli nadal masz problemy ze swoim emulatorem, musisz uruchomić następujący kod tylko raz.
MainActivity.kt
Obejście : Wyczyść dane aplikacji (nie tylko pamięć podręczną).
Uwaga : kopia problematycznego pliku z pakietów aplikacji na urządzeniu, jeśli ktoś potrzebuje go do repro.
Źródło
GL
źródło
Pełna i oficjalna odpowiedź dla wszystkich:
Diagnoza: awaria przy ładowaniu mobilnych zestawów SDK platformy Google Maps (iOS i Android).
Obejście: * Wyczyść dane aplikacji, której dotyczy problem (nie tylko pamięć podręczną), lub odinstaluj, a następnie ponownie zainstaluj aplikację, której dotyczy problem.
Zalecane umieszczenie kodu jest przed inicjalizacją GMSServices w aplikacji (_: didFinishLaunchingWithOptions :) (Swift) lub aplikacji: didFinishLaunchingWithOptions: (Objective-C). Konkretnie:
Szybki:
Cel C:
Po wdrożeniu go w aplikacji możesz złożyć zgłoszenie do pomocy technicznej Maps, jeśli chcesz, abyśmy przyspieszyli jego zatwierdzenie. Pamiętaj, aby podać identyfikator aplikacji, identyfikator pakietu oraz wersję, którą chcesz sprawdzić w swojej sprawie.
Obejście kodu dla Androida:
Zalecane miejsce dla kodu znajduje się w Application.onCreate ():
Jawa
Kotlin
Źródło: https://issuetracker.google.com/issues/1548554
źródło
To działa kod dla Xamarin. Musisz zainstalować pakiet nuget Xamarin.Essentials.
źródło
Aby uniknąć awarii, należy wywołać następującą metodę w aplikacji onCreate aplikacji na Androida.
źródło