AndroidRuntime:致命的な例外:androidmapsapi-ZoomTableManager


134

Google Maps SDK(v2)を使用する私のアプリが次の例外でクラッシュし始めました:

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)

v3ベータSDKでは、スタックトレースは次のとおりです。

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)

原因は何ですか?


10
たぶんそれはグーグルマップの問題だろう
エドゥアルド・ヘルツァー

1
これは本番アプリですか、それとも単なるテストですか?
user961186

18
注:この質問に対して「私も」の回答を投稿しないでください。質問に回答する回答のみ回答として投稿してください。
Wai Ha Lee

3
アップデートはここにあります:issuetracker.google.com/issues/154855417
lewkka

2
@MidnightGuest少し拡張すると、良い質問になるかもしれません。
マキエン

回答:


83

編集:以下はGoogleの公式ソリューションです(リンク

概要

Google Maps SDKスレッドがアプリをクラッシュさせる(ArrayIndexOutOfBoundsException)-ソリューションを提供

説明文

20204月23日11:30 PDTに開始、Googleは4時間、Mapsモバイルコンポーネントの構成を更新し、AndroidおよびiOSのMaps SDKでクラッシュを引き起こしました。このバージョンの構成を(停止期間中に)ダウンロードしたデバイス上のアプリケーションは、クラッシュに対して脆弱でした。AndroidおよびiOS向けのMaps SDK用の回避策ソリューションが提供されています。

Android用Maps SDK

Maps SDK for Android v2(Google Play開発者サービスに含まれています)

クラッシュを修正するためのGoogle Play開発者サービスのアップデートは、Google Play開発者サービスバージョン17.4.55以降のすべてのデバイスに公開されています。アップデートのインストール後、デバイス上のGoogle Play開発者サービスのバージョン番号に変更はありません。更新されたマップモジュールを受け取るために、開発者またはエンドユーザーが行う必要のあるアクションはありません。ただし、開発者は次のadbコマンドを使用して、モジュールが特定のデバイスに存在することを確認できます。

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

セクションにModule Set ID: mapsリストされている行が表示されModule Setsます。

Module Set ID: maps, Module Set Version: 2015120015120000

Maps SDK for Android v2のクラッシュ率は通常に戻りました。

現在のところ、下記のクライアント側コードの回避策を使用してアプリを更新していない場合は、これ以上のアクションを実行する必要はありません。

回避策を使用してアプリをすでに更新している場合は、アプリの後続の更新で回避策を削除できます(ただし、回避策を維持することは安全です)。

プレミアムプランMaps SDK for Android v2またはMaps SDK for Android v3ベータ(静的ライブラリ)

アプリでプレミアムプランMaps SDK for Android v2またはMaps SDK for Android v3ベータ版(静的ライブラリ)を使用しているにもかかわらずクラッシュが発生する場合は、アプリのアップデートを通じて以下の回避策を展開することを強くお勧めします。アプリケーションが一部のデバイスに保存されている不正なデータに対して脆弱なSDKの静的バージョンを読み込んでいるため、問題を解決できるのはアプリケーションの更新のみです。

Playストアレビューの承認

アプリを更新してもPlayストアのレビュー承認が遅れる場合は、アプリのパッケージIDを使ってサポートケースを提出してください:⁠ サポートチームに連絡してください。サポートチームがお客様のリクエストを社内でエスカレーションし、承認を迅速化します。

Google Playストアでの否定的なレビュー

一部のアプリケーション開発者は、クラッシュのためにエンドユーザーが残したGoogle Playストアでの1つ星のレビューについて問い合わせました。削除できるのは、Google Playのポリシー[1]に違反するコメントのみです。また、Play Consoleで不正なレビューにフラグを付けることもできます[2]。否定的なレビューにより、アプリケーションがGoogle Playストアから自動的に削除されることはありません。また、アプリレビューの全体的な評価の計算では最近のレビューが優先されることにも注意してください。これは、評価が時間の経過とともにインシデントレベルまで回復することを意味します。

[1]⁠Play ストアでの評価とレビュー

[2]⁠ 不適切なレビューを報告する

iOS用Maps SDK

iOSのクラッシュ率は通常に戻りました。それでもアプリケーションでクラッシュが発生する場合は、ここに記載されているコードの回避策を使用してアプリを更新および公開する必要があります。

Apple App Storeでのアプリケーションの展開または迅速化に関する質問については、Appleに直接お問い合わせください。


今回のアップデートで、この問題を解決します。お待ちいただき、ありがとうございました。私たちのチームはこの事件の詳細な内部調査を行っています。できるだけ早く分析結果を公開します(約1週間)。それまでの間、ご不明な点がある場合や問題が解決しない場合は、⁠ サポートケースを提出してください。

回避策:

  • Androidのエンドユーザーは、影響を受けるアプリのデータ(キャッシュだけでなく)をクリアできます。

  • iOSのエンドユーザーは、影響を受けるアプリをアンインストールしてから再インストールできます。

  • アプリ開発者は、すべてのエンドユーザーの問題を解決するために、以下のコードの回避策を適用できます。

iOSのコード回避策:

コードの推奨配置は、application(_:didFinishLaunchingWithOptions :)(Swift)またはapplication:didFinishLaunchingWithOptions:(Objective-C)メソッドでGMSServicesを初期化する前です。具体的には:

迅速:

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

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

Androidのコード回避策:

コードの推奨配置はApplication.onCreate()にあります。

ジャワ

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

}

コトリン

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

}

ここで提供される回避策は、Android用SDKの利用可能なすべてのフレーバーとバージョンをカバーしています。さらに明確にするには(多くのファイルを削除しなかった回避策の以前のバージョンをリリースした場合):

  • Maps Android SDK v2を使用するアプリケーションでは、ZoomTables.dataという1つのファイルのみを削除する必要があります。
  • Maps Android SDK v3ベータ版を使用するアプリケーションは、1つのファイルを削除するだけで十分です。

    DATA_ServerControlledParametersManager.data.v1。+ getBaseContext()。getPackageName())または

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


1
私たちのアプリはエミュレーターと同じコードで動作しますが、製品デバイスでは動作しません。ズーム中に発生し始めました。致命的な例外:androidmapsapi-ZoomTableManager
user961186

1
エラーはAndroidにあります。
user961186

2
Uber、Lyftなど、マップを使用する多くのアプリがクラッシュしていることを確認しました。Googleマップは私にとっては機能しているようです。パブリックAPIとは異なる別のAPIエンドポイントを指している必要があります。
AlexVPerl

16
ここでの本当の罪は、maps呼び出しがtry / catchステートメントにカプセル化されている場合でも、Googleマップが何らかの理由でtry呼び出しに取って代わり、エラーをスローする代わりにアプリをクラッシュさせることです。マップは、すべてをクラッシュさせるだけでなく、利用できない場合に適切な例外をスローする必要があります。
Brettins

2
パキスタンで同じ問題
Syed Raza Mehdi

44

すべてのアプリでGoogleマップがZoomTables.dataファイルを作成しているようです。

ここに画像の説明を入力してください

このファイルは、コメントからダウンロードできる不正な形式のファイルでした。問題を再現するには、デバイスのアプリパッケージからZoomTables.dataを削除し、不正な形式のものを挿入します。アプリがクラッシュするはずです。

現在、問題はグーグルの側で解決されました、しかしアプリはまだそのデータファイルのキャッシュされたバージョンを含んでいます。この問題を解決するには、アプリケーションのonCreateメソッドでアプリの起動時にそのファイルを削除する必要があります。

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

  }
}

アップデート1

最新のGoogle開発者のコメントに基づいて、回避策を更新しました。

ここで提供される回避策は、Android用SDKの利用可能なすべてのフレーバーとバージョンをカバーしています。さらに明確にするには(多くのファイルを削除しなかった回避策の以前のバージョンをリリースした場合):

Maps Android SDK v2を使用するアプリケーションでは、ZoomTables.dataという1つのファイルのみを削除する必要があります。Maps Android SDK v3ベータ版を使用するアプリケーションは、DATA_ServerControlledParametersManager.data.v1のいずれか1つのファイルのみを削除する必要があります。+ getBaseContext()。getPackageName())またはDATA_ServerControlledParametersManager.data。+ getBaseContext()。getPackageName())


2
ZoomTables.dataファイルを除外するとうまくいきました。どうもありがとう!誰もがこれを使用し、回答としてマークする必要があります!
Eduardo Herzer

@ArthurAttoutはい、私は今のところこれを行い、16時間を超えてクラッシュしたプロダクションアプリを修正します。Googleの修正を待つよりも長い時間がかかります
Eduardo Herzer

@EduardoHerzer GoogleのETAは48時間で、実稼働の完全展開には48時間以上かかります。(更新レビュー時間+ロールアウト時間)
Muhammad Saqib

これは私のために働いた!Flutterアプリの変更は少しだけです:var dir = await getApplicationSupportDirectory(); ファイルが壊れていますZoomTables = new File(dir.path + "/ZoomTables.data");
csk

ZoomTables.dataを一度だけ削除するのはなぜですか?これが将来再び破損した場合はどうなりますか?
JanNepraš

11

この解決策は私のために働いた

  1. まず「アプリ情報」を開きます
  2. 「ストレージ」を選択します
  3. 「データを消去」をクリック
  4. アプリを再度開き、問題が解決したかどうかを確認します。

    以下は、お客様を支援するための提案です。

  5. ご不便をおかけしてすべてのユーザーにメールを送信し、ユーザーが直面した問題について説明し、問題を解決するために上記の手順を説明します。

  6. アプリにプッシュ通知サービスがある場合は、Firebaseプッシュ通知を使用してすべてのユーザーにプッシュ通知を送信することもできます。

スクリーンショットのデモ:

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください


6

Androidの場合、複数の開発者がZoomTable.dataファイルをアプリケーションから直接削除することで構成される回避策について言及しました。レビュー後、この修正は安全であるように見え、アプリケーションで試すことができます。

https://issuetracker.google.com/154855417#comment179を参照して ください

ユーザーに再インストールせずにアプリを使い続けたい場合は、サンプルコードをここにコピーして貼り付けます。で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();
}

参照:Google Maps SDKがクラッシュします-部分的に解決されました



6

上記のソリューションの欠点:

  • ZoomTables.dataは、デバイスがクラッシュの影響を受けるかどうかに関係なく、すべてのデバイスで削除されます
  • 回避策は1度しか機能しませんが、この問題が二度と起こらないことは確かですか?

私のソリューションの欠点:

  • 影響を受けるデバイスマップでのマップアクティビティの初回実行時は空です。デバイスの回転または2番目の実行マップが表示された後

私のソリューションは、Maps SDKによってスローされた例外をキャッチし、ApplicationクラスのonCreateでこれを呼び出します。

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

同様の回避策を実行しました。私のアプリでは代替のソースをGoogleにマッピングしているので、デフォルトのソースをGoogleにしないように変更し、何が行われたかを説明するメッセージをユーザーに提供します。うまくいけば、将来的にGoogleが同様のことを実行できれば、私は安全に保たれるでしょう。ただし、テストが改善されることを期待しています。
イフール

この問題を解決するには、ストレージをクリアする必要がありました。何らかの理由で、ZoomTables.dataを削除するだけではこれを解決できませんでした。スタートアップアクティビティのonCreate()で削除を行いました。アプリケーションスコープの例外ハンドラーを調べる必要があると思います。
ShellDude

3

Google Maps SDKのクラッシュの根本的な原因は修正されたと思います。修正プログラムは影響を受けるアプリケーションに伝達されており、予想されるペースで解決に向けて継続しています。完全な解決策は、2020年4月23日木曜日までに完了する予定です。

本稼働バージョンは(Google側で)修正されましたが、それでもエミュレーターに問題がある場合は、次のコードを1回だけ実行する必要があります。

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

回避策:キャッシュだけでなく、アプリケーションデータを消去します。

:再現のために必要な場合は、デバイス上のアプリパッケージからの問題のあるファイルのコピー。

ブロック

ソース

GL


3

すべてに対する完全かつ公式の回答:

診断:ロード時のGoogle Maps PlatformモバイルSDK(iOSおよびAndroid)のクラッシュ。

回避策:*影響を受けるアプリのデータ(キャッシュだけでなく)を消去するか、影響を受けるアプリをアンインストールしてから再インストールします。

  • iOSのコード回避策:

コードの推奨配置は、application(_:didFinishLaunchingWithOptions :)(Swift)またはapplication:didFinishLaunchingWithOptions:(Objective-C)メソッドでGMSServicesを初期化する前です。具体的には:

迅速:

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

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

アプリに導入したら、承認を早めるためにマップサポートケースを提出できます。必ず、アプリケーションのID、バンドルID、およびケースで確認するバージョンを含めてください。

  • Androidのコード回避策:

    コードの推奨配置はApplication.onCreate()にあります。

    ジャワ

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

    コトリン

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

出典:https : //issuetracker.google.com/issues/1548554


2

これはXamarinの作業コードです。Xamarin.Essentials nugetパッケージをインストールする必要があります。

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

1
最後の行はPreferences.SET(.....読んではいけません
AndyM

1
あなたは正しいです。それを私が直した。
JanNepraš

1

クラッシュを回避するには、AndroidアプリのonCreateでfollowメソッドを呼び出す必要があります。

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
                    ?: ""))
        }
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.