source

Android 런타임: 치명적 예외: Androidmapsapi-ZoomTableManager

manysource 2023. 6. 9. 22:08

Android 런타임: 치명적 예외: Androidmapsapi-ZoomTableManager

Google 지도 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)

원인이 무엇입니까?

편집: 다음은 구글의 공식 솔루션(링크)입니다.

요약

Google 지도 SDK 스레드가 App(ArrayIndexOutOfBoundsException)을 손상시킵니다. - 솔루션 제공

묘사

2020년 4월 23일 PDT 11시 30분부터 4시간 동안 Google은 Maps 모바일 구성 요소의 업데이트를 제공하여 Android 및 iOS용 Maps SDK에서 충돌을 유발했습니다.운영 중단 기간 동안 이 버전의 구성을 다운로드한 장치의 응용 프로그램이 충돌에 취약했습니다.Android 및 iOS용 Maps SDK에 대한 해결 방법이 제공됩니다.

Android용 맵 SDK

Maps SDK for Android v2(Google Play Services에 포함)

충돌을 해결하기 위한 Google Play Services 업데이트가 Google Play Services 버전 17.4.55 이상의 모든 장치에 게시되었습니다.업데이트가 설치된 후 장치에 있는 Google Play Services의 버전 번호는 변경되지 않습니다.업데이트된 지도 모듈을 받기 위해 개발자나 일반 사용자의 작업은 필요하지 않지만, 개발자는 다음 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의 충돌률이 정상으로 돌아왔습니다.

현재 아래에 언급된 클라이언트 측 코드 해결 방법으로 앱을 업데이트하지 않은 경우 추가 작업을 수행할 필요가 없습니다.

이미 해결 방법으로 앱을 업데이트한 경우 이후 앱 업데이트에서 해결 방법을 제거할 수 있습니다(그러나 해결 방법을 유지하는 것은 안전합니다).

Premium Plan Maps SDK for Android v2 또는 Maps SDK for Android v3 베타(정적 라이브러리)

앱에서 Android v2용 Premium Plan Maps SDK 또는 Android v3용 Maps SDK(정적 라이브러리)를 사용하고 있지만 충돌이 발생하는 경우에도 앱 업데이트를 통해 아래 해결 방법을 롤아웃하는 것이 좋습니다.응용 프로그램이 일부 장치에 저장되는 잘못된 데이터에 취약한 정적 SDK 버전을 로드하고 있기 때문에 응용 프로그램을 업데이트해야만 문제를 해결할 수 있습니다.

Play Store 검토 승인

앱을 업데이트했지만 Play Store 검토 승인이 지연되는 경우 앱의 패키지 ID: 지원 팀에 문의하십시오.당사의 지원 팀이 내부적으로 귀하의 요청을 확대하고 승인을 신속하게 처리합니다.

Google Play Store에서 부정적인 평가를 받았습니다.

일부 애플리케이션 개발자들은 충돌로 인해 최종 사용자들이 남긴 구글 플레이 스토어의 1성급 리뷰를 문의했습니다.Google Play의 정책 [1]을(를) 위반하는 주석만 제거할 수 있습니다.또한 Play Console [2]에서 욕설 리뷰에 플래그를 지정할 수 있습니다.부정적인 리뷰로 인해 Google Play 스토어에서 애플리케이션이 자동으로 제거되지 않습니다.또한 전체 앱 리뷰 등급 계산은 최근 리뷰에 유리하며, 이는 시간이 지남에 따라 등급이 사고 이전 수준으로 회복된다는 것을 의미합니다.

플레이 스토어에 대한 평가와 리뷰

부적절한 리뷰 보고

iOS용 SDK 매핑

iOS의 충돌률이 정상으로 돌아왔습니다.응용 프로그램이 계속 충돌하는 경우 여기에 설명된 코드 해결 방법으로 응용 프로그램을 업데이트하고 게시해야 합니다.

Apple App Store에서 응용 프로그램을 배포하거나 신속하게 실행하는 것에 대한 질문은 Apple에 직접 문의하십시오.


이 업데이트를 통해 이 문제를 해결합니다.모든 분들의 인내심에 감사드립니다.우리 팀은 이 사건에 대해 심층적인 내부 조사를 수행하고 있으며, 가능한 한 빨리 분석 결과를 발표할 것입니다(약 1주일 후).그 동안 궁금한 점이 있거나 문제가 계속 발생하는 경우 지원 사례를 제출해 주십시오.

해결 방법:

  • Android의 최종 사용자는 캐시뿐만 아니라 영향을 받는 앱의 데이터도 지울 수 있습니다.

  • iOS의 최종 사용자는 영향을 받는 앱을 제거한 후 다시 설치할 수 있습니다.

  • 앱 개발자는 모든 최종 사용자에게 문제를 해결하기 위해 아래 코드 해결 방법을 적용할 수 있습니다.

iOS에 대한 코드 해결 방법:

이 코드의 권장 배치는 응용 프로그램(_:didFinishLaunchingWithOptions:)(Swift) 또는 응용 프로그램:didFinishLaunchingWithOptions:(Objective-C) 메서드에서 GMS Services를 초기화하기 전입니다.구체적으로:

스위프트:

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

목표-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 파일 하나만 삭제하면 됩니다.
  • Maps Android SDK v3 베타를 사용하는 응용 프로그램은 하나의 파일만 삭제하면 됩니다.

    DATA_ServerControlledParametersManager.data.v1. + getBaseContext().getPackageName() 또는

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

모든 앱에서 Google 지도가 ZoomTables.data 파일을 생성하는 것 같습니다.

여기에 이미지 설명 입력

이 파일은 주석에서 다운로드할 수 있는 잘못된 형식의 파일입니다.문제를 재현하려면 장치의 앱 패키지에서 ZoomTables.data를 제거하고 잘못된 형식의 앱 패키지를 삽입합니다.앱이 중단되어야 합니다.

현재 구글 측에서는 문제가 해결되었지만 앱에는 해당 데이터 파일의 캐시된 버전이 여전히 포함되어 있습니다.이 문제를 해결하려면 Application on Create Method에서 앱 시작 시 해당 파일을 바로 제거해야 합니다.

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 파일 하나만 삭제하면 됩니다.Maps Android SDK v3 베타를 사용하는 응용 프로그램은 DATA_ServerControlledParametersManager.data.v1. + getBaseContext() 또는 DATA_ServerControlledParametersManager.data. + getBaseContext() 중 하나의 파일만 삭제하면 됩니다.

이 솔루션은 저에게 효과가 있었습니다.

  1. 먼저 "앱 정보" 열기

  2. "스토리지"를 선택합니다.

  3. 데이터 지우기를 클릭합니다.

  4. 앱을 다시 열고 문제가 해결되었는지 확인합니다.

    다음은 고객을 돕기 위한 제안 사항입니다.

  5. 모든 사용자에게 불편함을 호소하는 이메일을 보내고 사용자가 직면한 문제에 대해 설명하고 위에서 언급한 문제 해결 단계를 제공합니다.

  6. 앱에 푸시 알림 서비스가 있는 경우 Firebase 푸시 알림을 통해 모든 사용자에게 푸시 알림을 보낼 수도 있습니다.

스크린샷 시연:

여기에 이미지 설명 입력

여기에 이미지 설명 입력

여기에 이미지 설명 입력

위 솔루션의 단점:

  • ZoomTables.데이터는 장치가 충돌의 영향을 받는지 여부에 관계없이 모든 장치에서 삭제됩니다.
  • 해결 방법은 한 번만 작동합니다. 이 문제가 다시 발생하지 않는 것이 확실합니까?

내 솔루션의 단점:

  • 영향을 받는 장치 맵에서 맵을 처음 실행할 때 활동이 비어 있습니다.장치를 회전한 후 또는 두 번째 실행 맵이 표시됩니다.

내 솔루션은 Maps SDK에서 던져진 예외를 포착합니다. 응용 프로그램 클래스 만들기에서 이 예외를 호출합니다.

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

iOS 및 Android용으로 제공되는 솔루션:

https://issuetracker.google.com/issues/154855417#comment509

Maps SDK for Android v2(Google Play Services에 포함)

충돌을 해결하기 위한 Google Play Services 업데이트가 Google Play Services 버전 17.4.55 이상의 모든 장치에 게시되었습니다.업데이트가 설치된 후 장치에 있는 Google Play Services의 버전 번호는 변경되지 않습니다.업데이트된 지도 모듈을 받기 위해 개발자나 일반 사용자의 작업은 필요하지 않지만, 개발자는 다음 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의 충돌률이 정상으로 돌아왔습니다.

현재 아래에 언급된 클라이언트 측 코드 해결 방법으로 앱을 업데이트하지 않은 경우 추가 작업을 수행할 필요가 없습니다.

이미 해결 방법으로 앱을 업데이트한 경우 이후 앱 업데이트에서 해결 방법을 제거할 수 있습니다(그러나 해결 방법을 유지하는 것은 안전합니다).


Android용 코드 해결 방법:

생산적인 버전은 (구글 측에서) 수정되었지만 에뮬레이터에 여전히 문제가 있는 경우 다음 코드를 한 번만 실행해야 합니다.

코드의 권장 위치는 Application.onCreate()입니다.

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

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 지도 SDK가 충돌 중입니다. 부분적으로 해결되었습니다.

모두를 위한 완전하고 공식적인 답변:

진단:Google 지도 플랫폼 모바일 SDK(iOS & Android) 로드 시 충돌.

해결 방법: * 영향을 받는 앱의 데이터(캐시뿐만 아니라)를 지우거나 영향을 받는 앱을 제거한 후 다시 설치합니다.

  • iOS에 대한 코드 해결 방법:

이 코드의 권장 배치는 응용 프로그램(_:didFinishLaunchingWithOptions:)(Swift) 또는 응용 프로그램:didFinishLaunchingWithOptions:(Objective-C) 메서드에서 GMS Services를 초기화하기 전입니다.구체적으로:

스위프트:

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

목표-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

충돌을 방지하려면 Android 앱의 onCreate에서 다음 방법을 호출해야 합니다.

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

이것은 사마린의 작업 코드입니다.Xamarin을 설치해야 합니다.필수 스누트 패키지입니다.

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

제안된 해결 방법은 한 번만 작동합니다.

앱에 Google 지도 줌 데이터 손상에 대한 자동 푸시 알림을 보내거나 API 호출을 통해 Google 지도 줌 데이터의 상태를 확인하는 것이 좋습니다.매번 이것을 불필요한 서버 호출로 생각하는 경우, 푸시 알림을 사용하여 이 논리를 트리거하거나 서버의 상태를 확인하는 기존 호출 중 하나와 통합할 수 있습니다.앱별 논리에 맡겨둡니다.이렇게 하면 Google 지도에서 이 오류를 다시 표시할 경우 해결 방법을 다시 트리거할 수 있습니다.

서버가 호출되면 모든 사용자에 대해 ZoomData가 재설정됩니다.푸시 알림인 경우 일부 사용자에게 알림을 보낼 수 있습니다.


fun receivedPushNotificationZoomDataCorrupted() {
 try {
        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()
    }
 } catch (exception: Exception) {

 }
} 


언급URL : https://stackoverflow.com/questions/61396588/androidruntime-fatal-exception-androidmapsapi-zoomtablemanager