android - AndroidRuntime:重要异常(exception):androidmapsapi-ZoomTableManager

标签 android ios google-maps-android-api-2 google-maps-sdk-ios google-maps-android-api-3

我的使用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 beta 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(link)的官方解决方案

摘要

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

描述

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

Android版Maps SDK

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

解决该崩溃的Google Play服务更新已发布到所有使用Google Play服务17.4.55及更高版本的设备。安装更新后,设备上的Google Play服务的版本号没有更改。开发人员或最终用户无需采取任何措施即可接收更新的Maps模块;但是,开发人员可以使用以下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 beta的Maps SDK(静态库)

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

Play商店审核批准

如果您更新了应用程序,但遇到Play商店审核审批延迟的情况,请使用应用程序的程序包ID:⁠Contact the support team提交支持案例。我们的支持团队将在内部升级您的请求并加快审批速度。

Google Play商店中的负面评论

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

[1]⁠Ratings & Review on the Play Store

[2]⁠Report inappropriate reviews

iOS版Maps SDK

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

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



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

解决方法:


Android上的最终用户可以清除受影响的应用的数据(而不仅仅是清除
缓存)。
iOS上的最终用户可以卸载然后重新安装受影响的应用程序。
App Developers可以应用下面的代码变通办法来解决
所有最终用户的问题。


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 beta的应用程序只需要
删除一个文件

DATA_ServerControlledParametersManager.data.v1。 +
getBaseContext()。getPackageName())
要么

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

关于android - AndroidRuntime:重要异常(exception):androidmapsapi-ZoomTableManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61397283/

相关文章:

ios - GCM 推送通知在 IOS 生产环境中失败并出现内部服务器错误

android - 在 Android 谷歌地图 v2 中打开自定义信息窗口

android - 谷歌地图航向标记或指示器

android - 如何使用 MapFragment(而非 MapView)获取 map 的坐标?

android - ReactNative - Webview 不在 Android 上执行 injectedJavaScript

android - 如何在对话框中设置边距

android - Ubuntu 上 Android Studio 的键盘问题

android - 在三星设备上使用蓝牙低功耗时什么也没发现

ios - 当单元格可见时在轮播中播放视频

ios - 状态栏中的事件指示器始终隐藏