AndroidRuntime:重要例外:androidmapsapi-ZoomTableManager [英] AndroidRuntime: FATAL EXCEPTION: androidmapsapi-ZoomTableManager

本文介绍了AndroidRuntime:重要例外:androidmapsapi-ZoomTableManager的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用Google Maps SDK(v2)的我的应用刚刚开始崩溃,但出现以下异常:

My app that uses Google Maps SDK (v2) just started crashing with this exception:

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 beta SDK中,堆栈跟踪为:

In the v3 beta SDK, the stack trace is:

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的官方解决方案(

Edit: following is the official solution from Google (link)

Google Maps SDK线程使应用程序崩溃(ArrayIndexOutOfBoundsException)-提供的解决方案

Google Maps SDK thread crashes App (ArrayIndexOutOfBoundsException) - Solution Offered

2020年4月23日美国太平洋标准时间11:30 开始,Google对Maps移动组件的配置进行了4个小时的更新,触发了Android和iOS版Maps SDK崩溃.下载此版本配置的设备上的应用程序(在停机期间)很容易崩溃.针对Android和iOS的Maps SDK提供了解决方法.

On April 23 2020 starting at 11:30 PDT, Google served for 4 hours an update to the configuration of a Maps mobile component, triggering crashes in Maps SDKs for Android and iOS. Applications on devices that downloaded this version of the configuration (during the outage period) were vulnerable to the crash. Workaround solutions are offered for Maps SDKs for Android and iOS.

适用于Android v2的Maps SDK(包含在Google Play服务中)

用于修复崩溃的Google Play服务更新已发布到所有使用Google Play服务17.4.55及更高版本的设备.安装更新后,设备上的Google Play服务的版本号没有更改.开发人员或最终用户无需采取任何措施即可接收更新的Maps模块;但是,开发人员可以使用以下adb命令验证给定设备上是否存在该模块:

The updates to Google Play Services to fix the crash has been published to all devices with Google Play Services version 17.4.55 and newer. There is no change to the version number of Google Play Services on the device after the update is installed. No action is required from developers or end users to receive the updated Maps module; however, developers can verify that the module is present on a given device with the following adb command:

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

您应该看到Module Sets部分中列出的行Module Set ID: maps.

You should see the line Module Set ID: maps listed in the Module Sets section.

Module Set ID: maps, Module Set Version: 2015120015120000

Android v2的Maps SDK的崩溃率恢复正常.

The crash rates of Maps SDK for Android v2 are back to normal.

到目前为止,如果尚未使用下面提到的客户端代码替代方法更新应用程序,则无需采取进一步的措施.

As of now, if you have not updated your app with the client-side code workarounds mentioned below, you do not need to take further action.

如果您已经使用变通办法更新了您的应用程序,则可以在以后的应用程序更新中删除变通办法(但保持变通办法是安全的).

If you have already updated your app with the workarounds, you can remove the workaround in a subsequent update of your app (but keeping the workaround is safe).

Android v2的Premium Plan Maps SDK或Android v3 beta的Maps SDK(静态库)

如果您的应用使用适用于Android v2的Premium Plan Maps SDK或适用于Android v3 beta的Maps SDK(静态库),并且仍然遇到崩溃,我们仍然强烈建议您通过更新应用来推出以下解决方法.由于您的应用程序正在加载静态版本的SDK,该SDK容易受到某些设备上存储的错误数据的影响,因此只有对您的应用程序进行更新才能解决此问题.

If your app uses the Premium Plan Maps SDK for Android v2 or Maps SDK for Android v3 beta (static libraries), and is still experiencing crashes, we still highly recommend you to roll out the workarounds below via an update to your app. As your application is loading a static version of the SDK which is vulnerable to the bad data being stored on some devices, only an update to your application can solve the problem.

Play商店审核批准

如果您更新了应用程序,但遇到了Play商店审核批准的延迟,请使用应用程序的程序包ID提交支持案例:⁠

If you update your app but experience Play Store review approvals delays, please file a support case with your app’s Package ID: ⁠Contact the support team. Our Support Team will internally escalate your request and expedite the approval.

Google Play商店中的负面评论

由于崩溃,一些应用程序开发人员在Google Play商店中询问了最终用户留下的一星级评论.只有违反Google Play政策[1]的评论才能被删除.您也可以在Play控制台[2]中标记侮辱性评论.由于负面评价,应用程序不会自动从Google Play商店中删除.还值得注意的是,您对应用的总体评价评分的计算偏向于最近的评价,这意味着您的评分将随着时间的推移恢复到事发前的水平.

Some application developers inquired about 1-star reviews in the Google Play Store left by end-users due to crashes. Only comments that violate Google Play's policy [ 1 ] can be removed. You can also flag abusive reviews in the Play Console [ 2 ]. Applications will not be automatically removed from the Google Play store due to negative reviews. It's also worth noting that the calculation of your overall app review rating favors recent reviews, which means that your rating will recover to pre-incident levels over time.

[1]⁠评分与amp;在Play商店中查看

[2]⁠举报不当评论

iOS上的崩溃率恢复正常.如果您的应用程序仍然崩溃,则需要使用此处传达的代码替代方法来更新和发布您的应用程序.

Crash rates on iOS are back to normal. If your application is still experiencing crashes, you need to update and publish your app with the code workarounds communicated here.

有关在Apple App Store中部署或加速应用程序的问题,请直接与Apple联系.

For questions about deploying or expediting your application in the Apple App Store, please contact Apple directly.

通过此更新,我们正在解决此问题.谢谢大家的耐心配合.我们的团队正在对该事件进行深入的内部调查;我们将尽快发布分析结果(大约一周内).同时,如果您有任何疑问或仍然遇到问题,请⁠提交支持案例.

  • Android上的最终用户可以清除受影响的应用的数据(而不仅仅是清除 缓存).

  • End users on Android can clear the affected app's data (not just the cache).

iOS上的最终用户可以卸载然后重新安装受影响的应用.

End users on iOS can uninstall then reinstall the affected app(s).

应用开发者可以应用以下代码替代方法来解决 所有最终用户都会遇到的问题.

App Developers can apply the code workarounds below in order to solve the issue for all their end users.

iOS的代码解决方法:

建议将代码放置在application(_:didFinishLaunchingWithOptions :)(Swift)或application:didFinishLaunchingWithOptions:(Objective-C)方法中的GMSServices初始化之前.具体来说:

Recommended placement for the code is before GMSServices initialization in the application(_:didFinishLaunchingWithOptions:) (Swift) or application:didFinishLaunchingWithOptions: (Objective-C) method. Specifically:

快捷键:

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()中:

The recommended placement for the code is in Application.onCreate():

Java

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

}

科特林

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的所有可用版本.为了进一步说明(如果您发布的早期版本的解决方法没有删除太多文件):

The workarounds provided here covers all available flavors and versions of our SDKs for Android. To clarify further (in case you released an earlier version of the workaround that did not delete as many files):

  • 使用Maps Android SDK v2的应用程序只需删除 一个文件:ZoomTables.data.
  • 使用Maps Android SDK v3 beta的应用程序仅需要 删除一个文件

  • Applications that use Maps Android SDK v2 should only need to delete one file: ZoomTables.data.
  • Applications that use Maps Android SDK v3 beta should only need to delete one file, either

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

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

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

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

这篇关于AndroidRuntime:重要例外:androidmapsapi-ZoomTableManager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆