0

我正在为客户开发一个项目,我必须将现有的 Android MapBox SDK (5.1.3) 更新为最新的 MapBox SDK (5.5.0)。该应用程序在较旧的 SDK 上运行良好,但一旦我更新 SDK,我的应用程序就会冻结,显示白屏和/或阻塞我的整个 UI 线程,从而在延迟后导致 ANR。

//Mapbox
implementation('com.mapbox.mapboxsdk:mapbox-android-sdk:5.5.0@aar') {
    transitive = true
}
implementation('com.mapbox.mapboxsdk:mapbox-android-services:2.2.10@aar') {
    transitive = true
}

当应用程序显示 ANR 时,我的 logcat 仅显示以下错误:

Thread[3,tid=28995,WaitingInMainSignalCatcherLoop,Thread*=0xaa430300,peer=0x12c638b0,"Signal Catcher"]: 对信号 3 做出反应 03-07 16:20:53.831 28989-28995/package.name I/art: Wrote stack跟踪到“/data/anr/traces.txt”

这是堆栈跟踪:

----- pid 28989 at 2018-03-07 16:20:53 -----
Build fingerprint: 'lge/g3_global_com/g3:6.0/MRA58K/15351124649f4:user/release-keys'
ABI: 'arm'
Build type: optimized
Zygote loaded classes=4378 post zygote classes=1932
Intern table: 42456 strong; 201 weak
JNI: CheckJNI is on; globals=636 (plus 174 weak)
Libraries: /data/app/package/lib/arm/libmapbox-gl.so /system/lib/libandroid.so /system/lib/libcompiler_rt.so /system/lib/libjavacrypto.so /system/lib/libjnigraphics.so /system/lib/libmedia_jni.so /system/lib/libwebviewchromium_loader.so libjavacore.so libopenjdk.so (9)
Heap: 40% free, 5MB/8MB; 46716 objects
Dumping cumulative Gc timings
Start Dumping histograms for 2 iterations for partial concurrent mark sweep
ProcessMarkStack:       Sum: 27.538ms 99% C.I. 0.021ms-23.012ms Avg: 4.589ms Max: 23.259ms
SweepMallocSpace:       Sum: 10.491ms 99% C.I. 0.027ms-6.440ms Avg: 2.622ms Max: 6.444ms
UpdateAndMarkImageModUnionTable:        Sum: 9.937ms 99% C.I. 3.536ms-6.401ms Avg: 4.968ms Max: 6.401ms
MarkConcurrentRoots:    Sum: 6.869ms 99% C.I. 0.006ms-5.420ms Avg: 1.717ms Max: 5.443ms
MarkAllocStackAsLive:   Sum: 4.808ms 99% C.I. 1.282ms-3.526ms Avg: 2.404ms Max: 3.526ms
MarkRootsCheckpoint:    Sum: 3.898ms 99% C.I. 312us-1672us Avg: 974.500us Max: 1672us
ScanGrayAllocSpaceObjects:      Sum: 2.394ms 99% C.I. 1us-1776us Avg: 598.500us Max: 1793us
UpdateAndMarkZygoteModUnionTable:       Sum: 2.344ms 99% C.I. 0.209ms-2.131ms Avg: 1.172ms Max: 2.135ms
SweepLargeObjects:      Sum: 1.729ms 99% C.I. 294us-1435us Avg: 864.500us Max: 1435us
ScanGrayImageSpaceObjects:      Sum: 1.191ms 99% C.I. 285us-906us Avg: 595.500us Max: 906us
ReMarkRoots:    Sum: 1.064ms 99% C.I. 283us-781us Avg: 532us Max: 781us
EnqueueFinalizerReferences:     Sum: 732us 99% C.I. 30us-702us Avg: 366us Max: 702us
SweepSystemWeaks:       Sum: 710us 99% C.I. 205us-505us Avg: 355us Max: 505us
FinishPhase:    Sum: 231us 99% C.I. 80us-151us Avg: 115.500us Max: 151us
ImageModUnionClearCards:        Sum: 220us 99% C.I. 28us-99us Avg: 55us Max: 99us
(Paused)ScanGrayAllocSpaceObjects:      Sum: 206us 99% C.I. 0.333us-190us Avg: 51.500us Max: 190us
MarkNonThreadRoots:     Sum: 183us 99% C.I. 19us-79us Avg: 45.750us Max: 79us

究竟是什么变化可能会使应用程序崩溃?有没有其他人遇到过这个问题?

4

1 回答 1

1

确保在 MapView.onStop 之前没有调用 MapView.onDestroy,因为这将导致 5.1.5 之后的 mapbox 版本冻结。早些时候你逃脱了那个合同错误。

例如:有一个Fragment 包含mapbox.MapView。如果 Activity 在附加/替换为新的 Fragment 之前没有调用 Fragment.detach,那么 MapView 将不会在 onDestroy 之前获得 onPause 和 onStop 调用。

无论如何,对我来说就是这种情况,从应用程序的 NavigationDrawer 菜单重新加载地图后,应用程序在 MapView.onDestroy 中冻结。添加调用分离为我解决了它:

    if (mMapboxFragment != null) {
        // results in calls to fragment's: onPause(), onStop() and onDestroyView():
        FragmentManager fragMgr = getSupportFragmentManager();
        fragMgr.beginTransaction().detach(mMapboxFragment).commit();
    }
于 2018-03-18T17:50:48.733 回答