Android 런타임 : 치명적 예외 : 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
아마도 구글지도 문제 일 것입니다
Eduardo Herzer

1
프로덕션 앱입니까 아니면 테스트입니까?
user961186

18
참고 :이 질문에 "나도"답변을 게시하지 마십시오. 질문에 대한 답변 만 답변으로 게시해야합니다.
Wai Ha Lee

3
업데이트는 여기에 있습니다 : issuetracker.google.com/issues/154855417
lewkka

2
@MidnightGuest 조금 확장하면 좋은 질문이 될 수 있습니다.
Makyen

답변:


83

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

요약

Google Maps SDK 스레드가 앱과 충돌 함 (ArrayIndexOutOfBoundsException)-솔루션 제공

기술

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

Android 용지도 SDK

Android v2 용지도 SDK (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

Android v2 용 Maps SDK의 충돌 률이 정상으로 돌아 왔습니다.

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

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

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

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

Play 스토어 검토 승인

앱을 업데이트했지만 Play 스토어 검토 승인이 지연되는 경우 앱의 패키지 ID로 지원 사례를 제출하십시오. ⁠ 지원 팀에 문의하십시오 . 지원팀이 내부적으로 요청을 에스컬레이션하고 승인을 신속하게 처리합니다.

Google Play 스토어의 부정적인 리뷰

일부 애플리케이션 개발자는 충돌로 인해 최종 사용자가 남긴 Google Play 스토어에서 1 성급 리뷰에 대해 문의했습니다. Google Play의 정책 [1]을 위반하는 댓글 만 제거 할 수 있습니다. Play Console [2]에서 악의적 인 리뷰를 표시 할 수도 있습니다. 부정적인 리뷰로 인해 애플리케이션이 Google Play 스토어에서 자동으로 제거되지 않습니다. 전체 앱 리뷰 평점을 계산할 때 최근 리뷰를 선호한다는 점도 주목할 가치가 있습니다. 즉, 등급은 시간이 지남에 따라 사전 사고 수준으로 회복됩니다.

[1] ⁠ Play 스토어에 대한 평가 및 검토

[2] ⁠ 부적절한 리뷰

iOS 용지도 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)
}

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


1
우리의 앱은 에뮬레이터와 동일한 코드에서 작동하지만 프로덕션 장치에서는 작동하지 않습니다. 확대하는 동안 발생하기 시작했습니다. 치명적인 예외 : androidmapsapi-ZoomTableManager
user961186

1
오류는 Android에 있습니다.
user961186

2
Uber, Lyft 등 Map을 사용하여 많은 앱이 충돌하는지 확인했습니다. Google Maps가 작동하는 것 같습니다. 공용 API와 다른 다른 API 끝점을 가리켜 야합니다.
AlexVPerl

16
여기서 실제 범죄는 maps 호출이 try / catch 문에 캡슐화되어 있어도 Google Maps가 시도 호출을 대체하고 오류를 발생시키는 대신 앱을 중단시키는 것입니다. 지도를 사용할 수없는 경우 모든 것을 중단하지 않고 적절한 예외를 처리해야합니다.
Brettins

2
파키스탄에서 같은 문제
Syed Raza Mehdi

44

Google Map은 모든 앱에서 ZoomTables.data 파일을 생성합니다.

여기에 이미지 설명을 입력하십시오

이 파일은 comment 에서 다운로드 할 수있는 잘못된 형식의 버전입니다 . 이 문제를 재현하려면 장치의 앱 패키지에서 ZoomTables.data를 제거하고 잘못된 형식을 삽입하십시오. 앱이 중단됩니다.

현재이 문제는 Google 측에서 해결되었지만 앱에는 여전히 해당 데이터 파일의 캐시 된 버전이 포함되어 있습니다. 문제를 해결하려면 응용 프로그램 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 파일 하나만 삭제하면됩니다. Maps Android SDK v3 베타를 사용하는 애플리케이션은 하나의 파일 (DATA_ServerControlledParametersManager.data.v1) 만 삭제하면됩니다. + getBaseContext (). getPackageName ()) 또는 DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())


2
ZoomTables.data 파일을 제외하면 나를 위해 일했습니다. 고마워요! 누구나 이것을 사용하고 답변으로 표시하십시오!
Eduardo Herzer

@ArthurAttout 예, 지금이 작업을 수행하고 Google 수정을 위해 더 많은 시간을 기다리는 것보다 16 시간 이상 멈춘 프로덕션 앱을 수정합니다
Eduardo Herzer

@EduardoHerzer Google의 예상 도착 시간은 48 시간이며 전체 롤아웃에는 48 시간 이상이 소요됩니다. (검토 시간 업데이트 + 롤아웃 시간)
Muhammad Saqib

이것은 나를 위해 일했다! Flutter 앱에 대해서만 약간만 변경했습니다. var dir = await getApplicationSupportDirectory (); 파일이 손상되었습니다 .ZoomTables = 새 파일 (dir.path + "/ZoomTables.data");
csk

왜 ZoomTables.data를 한 번만 제거합니까? 나중에 다시 손상되면 어떻게됩니까?
Jan Nepraš

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가 삭제됩니다.
  • 해결 방법은 한 번만 작동합니다.이 문제가 다시는 발생하지 않습니까?

내 솔루션의 단점 :

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

내 솔루션은 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이 아닌 것으로 변경하고 사용자에게 수행 한 작업을 설명하는 메시지를 제공합니다. 앞으로 구글이 비슷한 일을한다면 안전 할 것입니다. 그래도 테스트가 향상 될 것으로 기대합니다.
Ifor

이 문제를 해결하려면 저장소를 비워야했습니다. 어떤 이유로 든 ZoomTables.data를 삭제하는 것만으로는 충분하지 않습니다. 시작 활동 onCreate ()에서 삭제를 수행했습니다. 응용 프로그램 범위 예외 처리기를 살펴 봐야한다고 생각합니다.
ShellDude

3

Google Maps SDK 충돌의 근본 원인이 해결되었다고 생각합니다. 수정 프로그램이 영향을받는 응용 프로그램으로 전파되고 있으며 예상 속도로 계속 해결 중입니다. 전체 해상도는 2020-04-23 19:45 미국 / 태평양 지역까지 완료 될 것으로 예상됩니다.

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

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 용 코드 해결 방법 :

코드에 권장되는 위치는 응용 프로그램 (_ : didFinishLaunchingWithOptions :) (Swift) 또는 응용 프로그램 : 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)
}

목표 -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
당신이 올바른지. 나는 그것을 고쳤다.
Jan Nepraš

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.