AndroidRuntime: FATAL EXCEPTION: androidmapsapi-ZoomTableManager


134

Meine App, die Google Maps SDK (v2) verwendet, stürzte gerade mit dieser Ausnahme ab:

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@201216081@20.12.16 (120400-0):9)
        at com.google.maps.api.android.lib6.gmm6.vector.cv.a(:com.google.android.gms.dynamite_mapsdynamite@201216081@20.12.16 (120400-0):23)
        at com.google.maps.api.android.lib6.gmm6.util.m.run(:com.google.android.gms.dynamite_mapsdynamite@201216081@20.12.16 (120400-0):14)
        at java.lang.Thread.run(Thread.java:919)

Im Beta-SDK der Version 3 lautet der Stack-Trace:

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)

Was ist die Ursache?


10
Vielleicht ist es Google Maps Problem
Eduardo Herzer

1
Ist das eine Produktions-App oder nur ein Test?
user961186

18
Hinweis: Veröffentlichen Sie keine "Ich auch" -Antworten auf diese Frage. Nur Antworten, die die Frage beantworten, sollten als Antworten veröffentlicht werden.
Wai Ha Lee

3
Updates werden hier sein: issuetracker.google.com/issues/154855417
lewkka

2
@MidnightGuest Wenn Sie das etwas erweitern, könnte es eine gute Frage sein.
Makyen

Antworten:


83

Bearbeiten : Folgendes ist die offizielle Lösung von Google ( Link )

Zusammenfassung

Google Maps SDK-Thread stürzt ab App (ArrayIndexOutOfBoundsException) - Lösung angeboten

Beschreibung

Am 23. April 2020, ab 11:30 Uhr PDT , stellte Google 4 Stunden lang ein Update für die Konfiguration einer mobilen Maps-Komponente bereit, das Abstürze in Maps SDKs für Android und iOS auslöste. Anwendungen auf Geräten, die diese Version der Konfiguration heruntergeladen haben (während des Ausfallzeitraums), waren für den Absturz anfällig. Problemumgehungslösungen werden für Maps SDKs für Android und iOS angeboten.

Karten SDK für Android

Karten SDK für Android v2 (in Google Play Services enthalten)

Die Updates für Google Play Services zur Behebung des Absturzes wurden auf allen Geräten mit Google Play Services Version 17.4.55 und neuer veröffentlicht. Nach der Installation des Updates wird die Versionsnummer von Google Play Services auf dem Gerät nicht geändert. Entwickler oder Endbenutzer müssen keine Maßnahmen ergreifen, um das aktualisierte Maps-Modul zu erhalten. Entwickler können jedoch mit dem folgenden Befehl adb überprüfen, ob das Modul auf einem bestimmten Gerät vorhanden ist:

adb shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider

Sie sollten die Module Set ID: mapsim Module SetsAbschnitt aufgeführte Zeile sehen .

Module Set ID: maps, Module Set Version: 2015120015120000

Die Absturzraten von Maps SDK für Android v2 sind wieder normal.

Wenn Sie Ihre App nicht mit den unten genannten clientseitigen Code-Problemumgehungen aktualisiert haben, müssen Sie ab sofort keine weiteren Maßnahmen ergreifen.

Wenn Sie Ihre App bereits mit den Problemumgehungen aktualisiert haben, können Sie die Problemumgehung in einem nachfolgenden Update Ihrer App entfernen (die Problemumgehung ist jedoch sicher).

Premium Plan Maps SDK für Android v2 oder Maps SDK für Android v3 Beta (statische Bibliotheken)

Wenn Ihre App das Premium Plan Maps SDK für Android v2 oder das Maps SDK für Android v3 Beta (statische Bibliotheken) verwendet und weiterhin Abstürze auftreten, empfehlen wir Ihnen dringend, die folgenden Problemumgehungen über ein Update Ihrer App einzuführen. Da Ihre Anwendung eine statische Version des SDK lädt, die für die auf einigen Geräten gespeicherten fehlerhaften Daten anfällig ist, kann das Problem nur durch ein Update Ihrer Anwendung behoben werden.

Genehmigungen für Play Store-Überprüfungen

Wenn Sie Ihre App aktualisieren, aber Verzögerungen bei der Genehmigung von Play Store-Überprüfungen feststellen, reichen Sie bitte einen Support-Fall mit der Paket-ID Ihrer App ein: ⁠ Wenden Sie sich an das Support-Team . Unser Support-Team wird Ihre Anfrage intern eskalieren und die Genehmigung beschleunigen.

Negative Bewertungen im Google Play Store

Einige Anwendungsentwickler erkundigten sich nach 1-Stern-Bewertungen im Google Play Store, die Endbenutzer aufgrund von Abstürzen hinterlassen hatten. Nur Kommentare, die gegen die Richtlinien von Google Play [1] verstoßen, können entfernt werden. Sie können auch missbräuchliche Bewertungen in der Spielekonsole [2] markieren. Anwendungen werden aufgrund negativer Bewertungen nicht automatisch aus dem Google Play Store entfernt. Es ist auch erwähnenswert, dass die Berechnung Ihrer Gesamtbewertung für App-Bewertungen die jüngsten Bewertungen begünstigt, was bedeutet, dass sich Ihre Bewertung im Laufe der Zeit auf das Niveau vor dem Vorfall erholt.

[1] ⁠ Ratings & Review im Play Store

[2] ⁠ Unangemessene Bewertungen melden

Karten SDK für iOS

Die Absturzraten unter iOS sind wieder normal. Wenn Ihre Anwendung immer noch abstürzt, müssen Sie Ihre App mit den hier angegebenen Code-Problemumgehungen aktualisieren und veröffentlichen.

Bei Fragen zur Bereitstellung oder Beschleunigung Ihrer Anwendung im Apple App Store wenden Sie sich bitte direkt an Apple.


Mit diesem Update schließen wir dieses Problem. Vielen Dank an alle für Ihre Geduld. Unser Team führt eine eingehende interne Untersuchung dieses Vorfalls durch. Wir werden unsere Analyse so bald wie möglich veröffentlichen (in ungefähr einer Woche). Wenn Sie in der Zwischenzeit Fragen haben oder immer noch Probleme haben, ⁠ reichen Sie bitte einen Support-Fall ein .

Problemumgehungen:

  • Endbenutzer unter Android können die Daten der betroffenen App löschen (nicht nur den Cache).

  • Endbenutzer unter iOS können die betroffenen Apps deinstallieren und anschließend neu installieren.

  • App-Entwickler können die folgenden Code-Problemumgehungen anwenden, um das Problem für alle Endbenutzer zu lösen.

Code-Problemumgehung für iOS:

Die empfohlene Platzierung für den Code erfolgt vor der Initialisierung von GMSServices in der Anwendung (_: didFinishLaunchingWithOptions :) (Swift) oder der Anwendung: didFinishLaunchingWithOptions: (Objective-C) -Methode. Speziell:

Schnell:

let key = "GoogleMapsServerControlledParamsKey_bug_154855417"
if !UserDefaults.standard.bool(forKey: key) {
    let urls = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
    if urls.count > 0 {
        let paramUrl = urls[0].appendingPathComponent("com.google.GoogleMaps/ServerControlledParams", isDirectory: false)
        try? FileManager.default.removeItem(at: paramUrl)
    }
    UserDefaults.standard.set(true, forKey: key)
}

Ziel c:

NSString *key = @"GoogleMapsServerControlledParamsKey_bug_154855417";
BOOL keyExists = [[NSUserDefaults standardUserDefaults] boolForKey:key];
if (!keyExists) {
    NSArray<NSURL *> *array =
        [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory
                                               inDomains:NSUserDomainMask];
    if (array.count > 0) {
        NSURL *url =
            [array[0] URLByAppendingPathComponent:@"com.google.GoogleMaps/ServerControlledParams"
                                      isDirectory:NO];
        if (url) {
            [[NSFileManager defaultManager] removeItemAtURL:url error:NULL];
        }
    }
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:key];
}

Code-Problemumgehung für Android:

Die empfohlene Platzierung für den Code befindet sich in Application.onCreate ():

Java

try {
  SharedPreferences hasFixedGoogleBug154855417 = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
  if (!hasFixedGoogleBug154855417.contains("fixed")) {
    File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
    File corruptedSavedClientParameters = new File(getFilesDir(), "SavedClientParameters.data.cs");
    File corruptedClientParametersData =
        new File(
          getFilesDir(),
          "DATA_ServerControlledParametersManager.data."
              + getBaseContext().getPackageName());
    File corruptedClientParametersDataV1 =
        new File(
          getFilesDir(),
          "DATA_ServerControlledParametersManager.data.v1."
              + getBaseContext().getPackageName());
    corruptedZoomTables.delete();
    corruptedSavedClientParameters.delete();
    corruptedClientParametersData.delete();
    corruptedClientParametersDataV1.delete();
    hasFixedGoogleBug154855417.edit().putBoolean("fixed", true).apply();
  }
} catch (Exception e) {

}

Kotlin

try {
    val sharedPreferences = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
    if (!sharedPreferences.contains("fixed")) {
        val corruptedZoomTables = File(filesDir, "ZoomTables.data")
        val corruptedSavedClientParameters = File(filesDir, "SavedClientParameters.data.cs")
        val corruptedClientParametersData = File(filesDir, "DATA_ServerControlledParametersManager.data.${packageName}")
        val corruptedClientParametersDataV1 = File(filesDir, "DATA_ServerControlledParametersManager.data.v1.${packageName}")
        corruptedZoomTables.delete()
        corruptedSavedClientParameters.delete()
        corruptedClientParametersData.delete()
        corruptedClientParametersDataV1.delete()
        sharedPreferences.edit().putBoolean("fixed", true).apply()
    }
} catch (exception: Exception) {

}

Die hier bereitgestellten Problemumgehungen decken alle verfügbaren Varianten und Versionen unserer SDKs für Android ab. Weitere Erläuterungen (falls Sie eine frühere Version der Problemumgehung veröffentlicht haben, bei der nicht so viele Dateien gelöscht wurden):

  • Anwendungen, die Maps Android SDK v2 verwenden, müssen nur eine Datei löschen: ZoomTables.data.
  • Anwendungen, die Maps Android SDK v3 Beta verwenden, sollten auch nur eine Datei löschen müssen

    DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) oder

    DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())


1
Unsere App funktioniert auf dem Emulator, dem gleichen Code, aber nicht auf einem Produktionsgerät. Es begann beim Zoomen. FATALE AUSNAHME: androidmapsapi-ZoomTableManager
user961186

1
Der Fehler ist auf Android.
user961186

2
Gerade überprüft, dass viele Apps mit Map abstürzen, einschließlich Uber, Lyft usw. Google Maps scheint für mich zu funktionieren. Es muss auf einen anderen API-Endpunkt verweisen, der sich von der öffentlichen API unterscheidet.
AlexVPerl

16
Das eigentliche Verbrechen dabei ist, dass Google Maps Ihren Versuch, selbst wenn der Kartenaufruf in einer Try / Catch-Anweisung enthalten ist, irgendwie ersetzt und die App zum Absturz bringt, anstatt einen Fehler auszulösen. Karten sollten eine richtige Ausnahme auslösen, wenn sie nicht verfügbar sind, und nicht nur alles zum Absturz bringen.
Brettins

2
gleiches Problem in Pakistan
Syed Raza Mehdi

44

Scheint in jeder App Google Map erstellt ZoomTables.data-Datei.

Geben Sie hier die Bildbeschreibung ein

Diese Datei war fehlerhaft, eine fehlerhafte Version davon, die aus dem Kommentar heruntergeladen werden konnte . Um das Problem zu reproduzieren, entfernen Sie ZoomTables.data aus den App-Paketen auf dem Gerät und fügen Sie eine fehlerhafte ein. Die App sollte abstürzen.

Derzeit wurde das Problem auf Googles Seite behoben, aber die Apps enthalten immer noch eine zwischengespeicherte Version dieser Datendatei. Um das Problem zu beheben, sollten wir diese Datei direkt beim Start der App in Application onCreate Method entfernen.

private void fixGoogleMapBug() {
  try {
    SharedPreferences hasFixedGoogleBug154855417 = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
    if (!hasFixedGoogleBug154855417.contains("fixed")) {
      File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
      File corruptedSavedClientParameters = new File(getFilesDir(), "SavedClientParameters.data.cs");
      File corruptedClientParametersData =
          new File(
            getFilesDir(),
            "DATA_ServerControlledParametersManager.data."
                + getBaseContext().getPackageName());
      File corruptedClientParametersDataV1 =
          new File(
            getFilesDir(),
            "DATA_ServerControlledParametersManager.data.v1."
                + getBaseContext().getPackageName());
      corruptedZoomTables.delete();
      corruptedSavedClientParameters.delete();
      corruptedClientParametersData.delete();
      corruptedClientParametersDataV1.delete();
      hasFixedGoogleBug154855417.edit().putBoolean("fixed", true).apply();
    }
  } catch (Exception e) {

  }
}

Update 1

Ich habe die Problemumgehung basierend auf dem neuesten Kommentar der Google-Entwickler aktualisiert :

Die hier bereitgestellten Problemumgehungen decken alle verfügbaren Varianten und Versionen unserer SDKs für Android ab. Weitere Erläuterungen (falls Sie eine frühere Version der Problemumgehung veröffentlicht haben, bei der nicht so viele Dateien gelöscht wurden):

Anwendungen, die Maps Android SDK v2 verwenden, müssen nur eine Datei löschen: ZoomTables.data. Anwendungen, die Maps Android SDK v3 Beta verwenden, müssen nur eine Datei löschen, entweder DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) oder DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())


2
Das Ausschließen der Datei ZoomTables.data hat bei mir funktioniert. Vielen Dank! Jeder sollte dies verwenden und als Antwort markieren!
Eduardo Herzer

@ArthurAttout Ja, ich mache das jetzt lieber und repariere meine Produktions-Apps, die mehr als 16 Stunden abgestürzt sind, als mehr Zeit auf Googles Fix zu warten
Eduardo Herzer

@EduardoHerzer Googles ETA beträgt 48 Stunden und die vollständige Einführung der Produktion dauert mehr als 48 Stunden. (Update-Überprüfungszeit + Roll-out-Zeit)
Muhammad Saqib

Das hat bei mir funktioniert! Ich habe für meine Flutter-App nur wenig geändert: var dir = warte auf getApplicationSupportDirectory (); Datei korruptZoomTables = neue Datei (dir.path + "/ZoomTables.data");
csk

Warum entfernen wir die ZoomTables.data nur einmal? Was ist, wenn dies in Zukunft wieder beschädigt wird?
Jan Nepraš

11

Diese Lösung hat bei mir funktioniert

  1. Öffnen Sie zuerst "App Info"
  2. Wählen Sie "Speicher"
  3. Klicken Sie auf "Daten löschen".
  4. Öffnen Sie die App erneut und überprüfen Sie, ob das Problem behoben wurde.

    Nachfolgend finden Sie Vorschläge, um Ihren Kunden zu helfen.

  5. Senden Sie eine E-Mail an alle Benutzer für die Unannehmlichkeiten und beschreiben Sie ihnen das Problem, mit dem sie konfrontiert sind, und geben Sie ihnen die oben genannten Schritte, um das Problem zu beheben.

  6. Sie können Push-Benachrichtigungen auch mit Firebase-Push-Benachrichtigungen an alle Benutzer senden, wenn Ihre App über den Push-Benachrichtigungsdienst verfügt.

Screenshots Demonstration:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein


6

Für Android erwähnten mehrere Entwickler eine Problemumgehung, die darin bestand, die Datei ZoomTable.data direkt aus ihrer Anwendung zu löschen. Nach der Überprüfung scheint dieses Update sicher zu sein, und Sie können es in Ihrer Anwendung versuchen.

Weitere Informationen finden Sie unter https://issuetracker.google.com/154855417#comment179

Wenn Sie möchten, dass Ihre Benutzer Ihre App weiterhin verwenden, ohne sie erneut zu installieren, wird der Beispielcode hier zur Vereinfachung kopiert. In Application.onCreate () :

SharedPreferences googleBug = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
if (!googleBug.contains("fixed")) {
        File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
        corruptedZoomTables.delete();
        googleBug.edit().putBoolean("fixed", true).apply();
}

Referenz: Google Maps SDK stürzt ab - teilweise behoben



6

Nachteile der oben genannten Lösungen:

  • ZoomTables.data wird auf jedem Gerät gelöscht, unabhängig davon, ob das Gerät vom Absturz betroffen ist oder nicht
  • Problemumgehung funktioniert nur einmal. Ist es sicher, dass dieses Problem nie wieder auftritt?

Nachteile meiner Lösung:

  • Bei der ersten Ausführung der Karten ist die Aktivität auf der betroffenen Gerätekarte leer. Nach Drehung des Geräts oder der zweiten Ausführung wird die Karte angezeigt

Meine Lösung fängt die vom Maps SDK ausgelöste Ausnahme ab. Rufen Sie dies in onCreate der Application-Klasse auf:

public static void catchGoogleMapsException(final Context context)
{
  final Thread.UncaughtExceptionHandler defaultHandler =
    Thread.getDefaultUncaughtExceptionHandler();
  Thread.setDefaultUncaughtExceptionHandler(
    (@NonNull final Thread thread, @NonNull final Throwable ex) ->
    {
      if (thread.getName().contains("ZoomTableManager"))
      {
        new File(context.getFilesDir(), "ZoomTables.data").delete();
        Log.w("Maps Bug 154855417", "Caught exception and deleted ZoomTables.data");
      }
      else
        if (defaultHandler!=null)
          defaultHandler.uncaughtException(thread, ex);
        else
          throw new RuntimeException(
            "No default uncaught exception handler.", ex);
    });
}

Ich habe gerade eine ähnliche Problemumgehung herausgebracht. Da ich in meiner App alternative Zuordnungsquellen zu Google habe, ändere ich die Standardquelle so, dass sie nicht Google ist, und gebe dem Nutzer eine Nachricht, in der erklärt wird, was getan wurde. Hoffentlich schützt es mich, wenn Google in Zukunft etwas Ähnliches schafft. Ich erwarte jedoch, dass sich die Tests dort verbessern werden.
Ifor

Ich musste den Speicher löschen, um dieses Problem zu beheben. Aus irgendeinem Grund reichte das Löschen von ZoomTables.data nicht aus, um dies für mich zu beheben. Ich habe das Löschen in meiner Startaktivität onCreate () durchgeführt. Ich denke, ich sollte in den Anwendungsbereich Exception Handler schauen.
ShellDude

3

Wir glauben, dass die Hauptursache für die Abstürze des Google Maps SDK behoben wurde. Der Fix wird an die betroffenen Anwendungen weitergegeben und in Richtung der erwarteten Auflösung fortgesetzt. Die vollständige Auflösung wird voraussichtlich bis Donnerstag, 23.04.2020, 19:45 Uhr (USA / Pazifik) abgeschlossen sein.

Die produktive Version wurde behoben (auf Googles Seite), aber wenn Sie immer noch Probleme mit Ihrem Emulator haben, müssen Sie den folgenden Code nur einmal ausführen.

MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    fixGoogleMapBugTemp()   //TODO: Then clean this line

//  ...  

}

/**
 * Observation: Invoke this method only once
 */
private fun fixGoogleMapBugTemp() {
    val googleBug = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
    if (!googleBug.contains("fixed")) {
        val corruptedZoomTables = File(filesDir, "ZoomTables.data");
        corruptedZoomTables.delete();
        googleBug.edit().putBoolean("fixed", true).apply();
    }
}

Problemumgehung : Löschen Sie Anwendungsdaten (nicht nur den Cache).

Hinweis : Eine Kopie der problematischen Datei aus den App-Paketen auf dem Gerät, falls jemand sie für die Repro benötigt.

Block

Quelle

GL


3

Vollständige und offizielle Antwort für alle:

Diagnose: Absturz der mobilen SDKs der Google Maps Platform (iOS & Android) beim Laden.

Problemumgehung: * Löschen Sie die Daten der betroffenen App (nicht nur den Cache) oder deinstallieren Sie die betroffenen Apps und installieren Sie sie erneut.

  • Code-Problemumgehung für iOS:

Die empfohlene Platzierung für den Code erfolgt vor der Initialisierung von GMSServices in der Anwendung (_: didFinishLaunchingWithOptions :) (Swift) oder der Anwendung: didFinishLaunchingWithOptions: (Objective-C) -Methode. Speziell:

Schnell:

let key = "GoogleMapsServerControlledParamsKey_bug_154855417"
if !UserDefaults.standard.bool(forKey: key) {
    let urls = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
    if urls.count > 0 {
        let paramUrl = urls[0].appendingPathComponent("com.google.GoogleMaps/ServerControlledParams", isDirectory: false)
        try? FileManager.default.removeItem(at: paramUrl)
    }
    UserDefaults.standard.set(true, forKey: key)
}

Ziel c:

NSString *key = @"GoogleMapsServerControlledParamsKey_bug_154855417";
BOOL keyExists = [[NSUserDefaults standardUserDefaults] boolForKey:key];
if (!keyExists) {
    NSArray<NSURL *> *array =
        [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory
                                               inDomains:NSUserDomainMask];
    if (array.count > 0) {
        NSURL *url =
            [array[0] URLByAppendingPathComponent:@"com.google.GoogleMaps/ServerControlledParams"
                                      isDirectory:NO];
        if (url) {
            [[NSFileManager defaultManager] removeItemAtURL:url error:NULL]);
        }
    }
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:key];
}

Sobald Sie es in Ihrer App bereitgestellt haben, können Sie einen Maps Support-Fall einreichen, wenn Sie möchten, dass wir die Genehmigung beschleunigen. Stellen Sie sicher, dass Sie die ID Ihrer Anwendung, die Bundle-ID und die Version angeben, die Sie in Ihrem Fall überprüfen möchten.

  • Code-Problemumgehung für Android:

    Die empfohlene Platzierung für den Code befindet sich in Application.onCreate ():

    Java

    try {
      SharedPreferences hasFixedGoogleBug154855417 = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
      if (!hasFixedGoogleBug154855417.contains("fixed")) {
        File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
        File corruptedSavedClientParameters = new File(getFilesDir(), "SavedClientParameters.data.cs");
        File corruptedClientParametersData =
            new File(
              getFilesDir(),
              "DATA_ServerControlledParametersManager.data.v1."
                  + getBaseContext().getPackageName());
        corruptedZoomTables.delete();
        corruptedSavedClientParameters.delete();
        corruptedClientParametersData.delete();
        hasFixedGoogleBug154855417.edit().putBoolean("fixed", true).apply();
      }
    } catch (Exception e) {
    
    }

    Kotlin

    try {
        val sharedPreferences = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
        if (!sharedPreferences.contains("fixed")) {
            val corruptedZoomTables = File(filesDir, "ZoomTables.data")
            val corruptedSavedClientParameters = File(filesDir, "SavedClientParameters.data.cs")
            val corruptedClientParametersData = File(filesDir, "DATA_ServerControlledParametersManager.data.v1.${packageName}")
            corruptedZoomTables.delete()
            corruptedSavedClientParameters.delete()
            corruptedClientParametersData.delete()
            sharedPreferences.edit().putBoolean("fixed", true).apply()
        }
    } catch (exception: Exception) {
    
    }

Quelle: https://issuetracker.google.com/issues/1548554


2

Dies ist Arbeitscode für Xamarin. Sie müssen das Nuget-Paket Xamarin.Essentials installieren.

if (!Preferences.Get("google_bug_fixed", false))
{
    var corruptedZoomTables = new File(FileSystem.AppDataDirectory, "ZoomTables.data");
    corruptedZoomTables.Delete();
    Preferences.Set("google_bug_fixed", true);
}

1
Sollte nicht die letzte Zeile Preferences.SET lauten (.....
AndyM

1
Du hast Recht. Ich habe es repariert.
Jan Nepraš

1

Sie sollten die folgende Methode auf onCreate Ihrer Android-App aufrufen, um den Absturz zu vermeiden.

private fun clearCorruptedGMapsPreference() {
        try {
            val sharedPreferences = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
            if (!sharedPreferences.contains("fixed")) {
                val corruptedZoomTables = File(filesDir, "ZoomTables.data")
                val corruptedSavedClientParameters = File(filesDir, "SavedClientParameters.data.cs")
                val corruptedClientParametersData = File(filesDir, "DATA_ServerControlledParametersManager.data.${packageName}")
                val corruptedClientParametersDataV1 = File(filesDir, "DATA_ServerControlledParametersManager.data.v1.${packageName}")
                corruptedZoomTables.delete()
                corruptedSavedClientParameters.delete()
                corruptedClientParametersData.delete()
                corruptedClientParametersDataV1.delete()
                sharedPreferences.edit().putBoolean("fixed", true).apply()
            }
        } catch (exception: Exception) {
            LogUtil.e(this@CourierApplication::class.java.name, "An error has happened. Error: ".plus(exception.cause?.message
                    ?: ""))
        }
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.