AndroidRuntime: PENGECUALIAN FATAL: androidmapsapi-ZoomTableManager

135

Aplikasi saya yang menggunakan Google Maps SDK (v2) baru saja mulai mogok dengan pengecualian ini:

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)

Di v3 beta SDK, jejak tumpukan adalah:

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)

Apa penyebabnya?

Prem Chand
sumber
10
Mungkin itu masalah Google Maps
Eduardo Herzer
1
Apakah ini aplikasi produksi atau hanya tes?
user961186
18
Catatan: Jangan memposting jawaban "saya juga" untuk pertanyaan ini. Hanya jawaban yang menjawab pertanyaan yang harus diposting sebagai jawaban.
Wai Ha Lee
3
pembaruan ada di sini: issuetracker.google.com/issues/154855417
lewkka
2
@ Midnightuest Jika Anda sedikit memperluas, itu bisa menjadi pertanyaan yang bagus.
Makyen

Jawaban:

84

Sunting : berikut ini adalah solusi resmi dari Google ( tautan )

Ringkasan

Aplikasi Google Maps SDK crash (ArrayIndexOutOfBoundsException) - Solusi Ditawarkan

Deskripsi

Pada 23 April 2020 mulai pukul 11:30 PDT , Google melayani pembaruan selama 4 jam untuk konfigurasi komponen seluler Maps, memicu gangguan pada Maps SDK untuk Android dan iOS. Aplikasi pada perangkat yang mengunduh versi konfigurasi ini (selama periode pemadaman) rentan terhadap kerusakan. Solusi pemecahan masalah ditawarkan untuk Maps SDKs untuk Android dan iOS.

Maps SDK untuk Android

Maps SDK untuk Android v2 (termasuk dalam Layanan Google Play)

Pembaruan untuk Layanan Google Play untuk memperbaiki kerusakan telah dipublikasikan ke semua perangkat dengan Layanan Google Play versi 17.4.55 dan yang lebih baru. Tidak ada perubahan pada nomor versi Google Play Services di perangkat setelah pembaruan diinstal. Tidak diperlukan tindakan dari pengembang atau pengguna akhir untuk menerima modul Maps yang diperbarui; namun, pengembang dapat memverifikasi bahwa modul hadir pada perangkat yang diberikan dengan perintah adb berikut:

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

Anda harus melihat baris yang Module Set ID: mapstercantum di Module Setsbagian ini.

Module Set ID: maps, Module Set Version: 2015120015120000

Tingkat kerusakan Maps SDK untuk Android v2 kembali normal.

Sampai sekarang, jika Anda belum memperbarui aplikasi Anda dengan solusi kode sisi klien yang disebutkan di bawah, Anda tidak perlu mengambil tindakan lebih lanjut.

Jika Anda telah memperbarui aplikasi Anda dengan solusinya, Anda dapat menghapus solusinya di pembaruan aplikasi Anda berikutnya (tetapi menjaga solusinya aman).

Premium Plan Maps SDK untuk Android v2 atau Maps SDK untuk Android v3 beta (perpustakaan statis)

Jika aplikasi Anda menggunakan Premium Plan Maps SDK untuk Android v2 atau Maps SDK untuk Android v3 beta (perpustakaan statis), dan masih mengalami crash, kami masih sangat menyarankan Anda untuk meluncurkan solusi di bawah ini melalui pembaruan ke aplikasi Anda. Karena aplikasi Anda memuat versi statis SDK yang rentan terhadap data buruk yang disimpan pada beberapa perangkat, hanya pembaruan ke aplikasi Anda yang dapat menyelesaikan masalah.

Persetujuan ulasan Play Store

Jika Anda memperbarui aplikasi tetapi mengalami keterlambatan peninjauan ulasan Play Store, harap ajukan kasasi dengan ID Paket aplikasi Anda: ⁠ Hubungi tim dukungan . Tim Dukungan kami akan meningkatkan permintaan Anda secara internal dan mempercepat persetujuan.

Ulasan negatif di Google Play Store

Beberapa pengembang aplikasi bertanya tentang ulasan 1 bintang di Google Play Store yang ditinggalkan oleh pengguna akhir karena macet. Hanya komentar yang melanggar kebijakan Google Play [1] yang dapat dihapus. Anda juga dapat menandai ulasan kasar di Play Console [2]. Aplikasi tidak akan dihapus secara otomatis dari Google Play store karena ulasan negatif. Perlu juga dicatat bahwa perhitungan peringkat ulasan aplikasi Anda secara keseluruhan mendukung ulasan terbaru, yang berarti bahwa peringkat Anda akan pulih ke tingkat pra-insiden seiring waktu.

[1] ⁠ Peringkat & Tinjauan di Play Store

[2] ⁠ Laporkan ulasan yang tidak pantas

Maps SDK untuk iOS

Tingkat kerusakan pada iOS kembali normal. Jika aplikasi Anda masih mengalami crash, Anda perlu memperbarui dan menerbitkan aplikasi Anda dengan pemecahan kode yang dikomunikasikan di sini.

Untuk pertanyaan tentang menyebarkan atau mempercepat aplikasi Anda di Apple App Store, silakan hubungi Apple secara langsung.


Dengan pembaruan ini, kami menutup masalah ini. Terima kasih untuk semuanya atas kesabaran Anda. Tim kami sedang melakukan penyelidikan internal mendalam atas insiden ini; sesegera mungkin, kami akan mempublikasikan analisis kami (dalam sekitar satu minggu). Sementara itu, jika Anda memiliki pertanyaan, atau masih mengalami masalah, harap ⁠ mengajukan kasus dukungan .

Penanganan masalah:

  • Pengguna akhir di Android dapat menghapus data aplikasi yang terpengaruh (bukan hanya cache).

  • Pengguna akhir di iOS dapat menghapus instalasi lalu menginstal ulang aplikasi yang terpengaruh.

  • Pengembang Aplikasi dapat menerapkan solusi kode di bawah ini untuk menyelesaikan masalah bagi semua pengguna akhir mereka.

Penanganan masalah kode untuk iOS:

Penempatan kode yang disarankan adalah sebelum inisialisasi GMSServices dalam aplikasi (_: didFinishLaunchingWithOptions :) (Swift) atau aplikasi: didFinishLaunchingWithOptions: (Objective-C) metode. Secara khusus:

Cepat:

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)
}

Tujuan-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];
}

Penanganan kode untuk Android:

Penempatan kode yang disarankan ada di Application.onCreate ():

Jawa

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) {

}

Solusi yang disediakan di sini mencakup semua rasa dan versi SDK yang tersedia untuk Android. Untuk memperjelas lebih lanjut (jika Anda merilis versi sebelumnya dari solusi yang tidak menghapus banyak file):

  • Aplikasi yang menggunakan Maps Android SDK v2 hanya perlu menghapus satu file: ZoomTables.data.
  • Aplikasi yang menggunakan Maps Android SDK v3 beta hanya perlu menghapus satu file

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

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

jon
sumber
1
Aplikasi kami bekerja pada emulator, kode yang sama, tetapi tidak pada perangkat produksi. Itu mulai terjadi saat zoom. PENGECUALIAN FATAL: androidmapsapi-ZoomTableManager
user961186
1
Kesalahan ada di Android.
user961186
2
Baru saja memeriksa banyak aplikasi yang menggunakan Peta mogok, termasuk Uber, Lyft, dll. Google Maps tampaknya berfungsi untuk saya, pasti menunjuk ke titik akhir API lain yang berbeda dari API publik.
AlexVPerl
16
Kejahatan sebenarnya di sini adalah bahwa bahkan ketika panggilan peta dienkapsulasi dalam pernyataan coba-coba, entah bagaimana Google Maps melampaui panggilan panggilan Anda dan membuat aplikasi mogok bukannya membuat kesalahan. Peta harus membuang pengecualian yang tepat ketika tidak tersedia, tidak hanya merusak semuanya.
Brettins
2
masalah yang sama di Pakistan
Syed Raza Mehdi
44

Tampak di setiap aplikasi Google Map membuat file ZoomTables.data.

masukkan deskripsi gambar di sini

File ini cacat, versi cacat itu yang dapat diunduh dari komentar . Untuk mereproduksi masalah, hapus ZoomTables.data dari paket aplikasi pada perangkat dan masukkan yang salah. Aplikasi seharusnya macet.

Saat ini, masalah diselesaikan di sisi google, tetapi aplikasi masih berisi versi cache dari file data tersebut. Untuk memperbaiki masalah ini, kita harus menghapus file itu tepat di awal aplikasi di Metode onCreate Aplikasi.

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) {

  }
}

Perbarui 1

Saya telah memperbarui solusinya, berdasarkan komentar pengembang google terbaru :

Solusi yang disediakan di sini mencakup semua rasa dan versi SDK yang tersedia untuk Android. Untuk memperjelas lebih lanjut (jika Anda merilis versi sebelumnya dari solusi yang tidak menghapus banyak file):

Aplikasi yang menggunakan Maps Android SDK v2 hanya perlu menghapus satu file: ZoomTables.data. Aplikasi yang menggunakan Maps Android SDK v3 beta hanya perlu menghapus satu file, baik DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) atau DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())

Andrey T
sumber
2
Tidak termasuk file ZoomTables.data bekerja untuk saya. Terima kasih banyak! Semua orang harus menggunakan ini dan tandai sebagai jawaban!
Eduardo Herzer
@ArthurAttout Ya, saya lebih suka melakukan ini untuk saat ini dan memperbaiki aplikasi produksi saya yang lebih dari 16 jam mogok daripada menunggu lebih banyak waktu untuk perbaikan Google
Eduardo Herzer
@EduardoHerzer ETA Google adalah 48 jam dan produksi penuh akan memakan waktu lebih dari 48 jam. (Perbarui waktu ulasan + waktu peluncuran)
Muhammad Saqib
Ini berhasil untuk saya! Saya hanya mengubah sedikit untuk aplikasi Flutter saya: var dir = menunggu getApplicationSupportDirectory (); File corruptedZoomTables = File baru (dir.path + "/ZoomTables.data");
csk
Mengapa kita menghapus ZoomTables.data hanya sekali? Bagaimana jika ini rusak lagi di masa depan?
Jan Nepraš
11

Solusi ini berhasil untuk saya

  1. Pertama buka "Info App"
  2. Pilih "Penyimpanan"
  3. Klik "Hapus data"
  4. Buka aplikasi lagi dan periksa apakah masalah telah diperbaiki.

    Di bawah ini adalah saran untuk membantu pelanggan Anda.

  5. Kirim email ke semua pengguna Anda untuk ketidaknyamanan ini dan jelaskan masalah yang mereka hadapi dan berikan mereka langkah-langkah yang disebutkan di atas untuk menyelesaikan masalah mereka.

  6. Anda juga dapat mengirim Pemberitahuan Push ke semua pengguna Anda dengan Firebase Push Notification, jika aplikasi Anda memiliki layanan pemberitahuan push.

Peragaan tangkapan layar:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Muhammed Irfan
sumber
6

Untuk Android, beberapa pengembang menyebutkan solusi yang terdiri dari menghapus file ZoomTable.data langsung dari aplikasi mereka. Setelah ditinjau, perbaikan ini tampaknya aman, dan Anda bisa mencobanya di aplikasi Anda.

Silakan merujuk ke https://issuetracker.google.com/154855417#comment179

Jika Anda ingin pengguna Anda terus menggunakan aplikasi Anda tanpa menginstal ulang, Kode sampel disalin-tempel di sini untuk kenyamanan Anda. Di 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();
}

referensi: Google Maps SDK mogok - sebagian diselesaikan

Mahmoud Zaher
sumber
6

Kerugian dari solusi di atas:

  • ZoomTables.data dihapus pada setiap perangkat, terlepas dari apakah perangkat terpengaruh oleh crash atau tidak
  • Penyelesaian hanya berfungsi sekali, apakah yakin bahwa masalah ini tidak pernah terjadi lagi?

Kerugian dari solusi saya:

  • pada pelaksanaan pertama aktivitas peta pada peta perangkat yang terpengaruh kosong. Setelah rotasi perangkat atau peta eksekusi kedua ditampilkan

Solusi saya menangkap Pengecualian yang dilemparkan oleh Maps SDK, sebut ini di onCreate dari kelas Aplikasi:

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);
    });
}
Werner Harnisch
sumber
Saya baru saja mendorong solusi serupa. Karena saya memiliki sumber pemetaan alternatif untuk Google di Aplikasi saya, saya mengubah sumber default untuk tidak menjadi Google juga memberikan pengguna pesan yang menjelaskan apa yang telah dilakukan. Semoga itu akan membuat saya tetap aman jika Google berhasil melakukan hal serupa di masa depan. Saya berharap ada pengujian untuk meningkatkan.
Ifor
Saya harus menghapus penyimpanan untuk menyelesaikan masalah ini. Untuk alasan apa pun, menghapus ZoomTables.data tidak cukup untuk menyelesaikan ini untuk saya. Saya melakukan penghapusan di aktivitas startup saya diCreate (). Saya kira saya harus melihat ke dalam lingkup aplikasi Exception Handler.
ShellDude
3

Kami yakin akar penyebab crash Google Maps SDK telah diperbaiki. Perbaikan sedang disebarkan ke aplikasi yang terkena dampak dan sedang menuju resolusi pada kecepatan yang diharapkan. Resolusi penuh diharapkan selesai pada Kamis, 2020-04-23 19:45 AS / Pasifik.

Versi produktif diperbaiki (di sisi google) tetapi jika Anda masih memiliki masalah dengan emulator Anda, Anda harus menjalankan kode berikut hanya sekali.

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();
    }
}

Penanganan masalah : Bersihkan data aplikasi (bukan hanya cache).

Catatan : Salinan file bermasalah dari paket aplikasi pada perangkat jika ada yang membutuhkannya untuk repro.

Blok

Sumber

GL

CORONEL Braian
sumber
3

Lengkap & jawaban resmi untuk semua:

Diagnosis: Kecelakaan SDK seluler Platform Google Maps (iOS & Android) saat dimuat.

Penanganan masalah: * Bersihkan data aplikasi yang terpengaruh (bukan hanya cache), atau hapus instalan lalu instal ulang aplikasi yang terpengaruh.

  • Penanganan masalah kode untuk iOS:

Penempatan kode yang disarankan adalah sebelum inisialisasi GMSServices dalam aplikasi (_: didFinishLaunchingWithOptions :) (Swift) atau aplikasi: didFinishLaunchingWithOptions: (Objective-C) metode. Secara khusus:

Cepat:

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)
}

Tujuan-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];
}

Setelah Anda menempatkannya di aplikasi Anda, Anda dapat mengajukan kasus Dukungan Peta jika Anda ingin kami membantu mempercepat persetujuannya. Pastikan untuk memasukkan ID aplikasi Anda, Bundle ID, dan versi yang ingin Anda tinjau dalam kasus Anda.

  • Penanganan kode untuk Android:

    Penempatan kode yang disarankan ada di Application.onCreate ():

    Jawa

    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) {
    
    }

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

Zhar
sumber
2

Ini adalah kode yang berfungsi untuk Xamarin. Anda perlu menginstal paket nuget Xamarin.Essentials.

if (!Preferences.Get("google_bug_fixed", false))
{
    var corruptedZoomTables = new File(FileSystem.AppDataDirectory, "ZoomTables.data");
    corruptedZoomTables.Delete();
    Preferences.Set("google_bug_fixed", true);
}
Jan Nepraš
sumber
1
Seharusnya baris terakhir tidak membaca Preferensi.
SET
1
Anda benar. Aku telah memperbaikinya.
Jan Nepraš
1

Anda harus memanggil metode ikuti di onCreate aplikasi Android Anda untuk menghindari crash.

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
                    ?: ""))
        }
    }
Andres Paez
sumber