安卓棒棒糖5.1:使用大量Nine Patch图形时出现致命信号11(SIGSEGV),代码2,故障地址为0x9e985ff8,线程ID为4093(RenderThread)。

9

我在应用视图中使用了相当大量的NinePatchDrawables。底层位图已被缓存,因此不存在内存问题。

在准备/绘制屏幕时,应用程序崩溃,并出现以下日志条目:

04-03 19:37:42.651: A/libc(4064): Fatal signal 11 (SIGSEGV), code 2, fault addr 0x9e985ff8 in tid 4093 (RenderThread)

最新的Android 5.1版本(LMY47D,LMY47E,LMY47I)出现了问题。 相同的视图和相同的图形在早期的Android版本上(最高到5.0.2 LRX22C)运行良好。 我在Nexus 6上遇到了这个问题,迄今为止我还没有机会在其他设备上测试它。
仅在使用大量NinePatchDrawables时发生崩溃,尤其是当它们彼此叠加时。当我加载完全相同的图形(仅供测试)作为普通png时,它可以正常工作。同时,其他具有较少数量的NinePatchDrawables的视图也可以正常工作。
相同的问题在早期的Android版本(5.0.2或更早版本)上也存在,但每屏至少有三到四倍的NinePatchDrawables才会出现。
04-03 19:37:42.651: A/libc(4064): Fatal signal 11 (SIGSEGV), code 2, fault addr 0x9e985ff8 in tid 4093 (RenderThread)
04-03 19:37:42.752: I/DEBUG(354): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
04-03 19:37:42.752: I/DEBUG(354): Build fingerprint: 'google/shamu/shamu:5.1/LMY47D/1743759:user/release-keys'
04-03 19:37:42.752: I/DEBUG(354): Revision: '33696'
04-03 19:37:42.752: I/DEBUG(354): ABI: 'arm'
04-03 19:37:42.752: I/DEBUG(354): pid: 4064, tid: 4093, name: RenderThread  >>> com.xyz.myapp <<<
04-03 19:37:42.752: I/DEBUG(354): signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x9e985ff8
04-03 19:37:42.794: I/DEBUG(354):     r0 b4a23880  r1 aee24000  r2 00000000  r3 00000001
04-03 19:37:42.794: I/DEBUG(354):     r4 9e986064  r5 aec3c658  r6 00000001  r7 aec2c570
04-03 19:37:42.794: I/DEBUG(354):     r8 00000003  r9 00000001  sl 0000001c  fp aee24000
04-03 19:37:42.794: I/DEBUG(354):     ip aadb4948  sp 9e985ff8  lr aad072db  pc aac954a2  cpsr a0030030
04-03 19:37:42.795: I/DEBUG(354): backtrace:
04-03 19:37:42.795: I/DEBUG(354):     #00 pc 001024a2  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxResource::PrepareGpuAccess(EsxContext*, unsigned int, EsxAccessType)+1)
04-03 19:37:42.795: I/DEBUG(354):     #01 pc 0010d4fd  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::HwBlt(EsxBltCopy const*)+12)
04-03 19:37:42.795: I/DEBUG(354):     #02 pc 0010eb6b  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::Blt(EsxBltCopy const*)+10)
04-03 19:37:42.795: I/DEBUG(354):     #03 pc 0010ec81  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::BlitRect(EsxResource*, EsxResource*, EsxRect, EsxRect*, int)+272)
04-03 19:37:42.795: I/DEBUG(354):     #04 pc 0010ed67  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::PreserveBackBufferViaBlt(int)+126)
04-03 19:37:42.796: I/DEBUG(354):     #05 pc 001159a7  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::ProcessAndSubmitRendering(EsxFlushReason)+134)
04-03 19:37:42.796: I/DEBUG(354):     #06 pc 00177435  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::Flush(EsxFlushReason)+412)
04-03 19:37:42.796: I/DEBUG(354):     #07 pc 0017759d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::GetCmdSpace(EsxCmdBufType, unsigned int)+140)
04-03 19:37:42.796: I/DEBUG(354):     #08 pc 00173653  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBltHw(EsxBltCopy const*)+938)
04-03 19:37:42.796: I/DEBUG(354):     #09 pc 0017430d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBlt(EsxBltCopy const*)+132)
04-03 19:37:42.796: I/DEBUG(354):     #10 pc 0010d4fd  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::HwBlt(EsxBltCopy const*)+12)
04-03 19:37:42.796: I/DEBUG(354):     #11 pc 0010eb6b  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::Blt(EsxBltCopy const*)+10)
04-03 19:37:42.797: I/DEBUG(354):     #12 pc 0010ec81  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::BlitRect(EsxResource*, EsxResource*, EsxRect, EsxRect*, int)+272)
04-03 19:37:42.797: I/DEBUG(354):     #13 pc 0010ed67  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::PreserveBackBufferViaBlt(int)+126)
04-03 19:37:42.797: I/DEBUG(354):     #14 pc 001159a7  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::ProcessAndSubmitRendering(EsxFlushReason)+134)
04-03 19:37:42.797: I/DEBUG(354):     #15 pc 00177435  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::Flush(EsxFlushReason)+412)
04-03 19:37:42.797: I/DEBUG(354):     #16 pc 0017759d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::GetCmdSpace(EsxCmdBufType, unsigned int)+140)
04-03 19:37:42.797: I/DEBUG(354):     #17 pc 00173653  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBltHw(EsxBltCopy const*)+938)
04-03 19:37:42.798: I/DEBUG(354):     #18 pc 0017430d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBlt(EsxBltCopy const*)+132)
04-03 19:37:42.798: I/DEBUG(354):     #19 pc 0010d4fd  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::HwBlt(EsxBltCopy const*)+12)
04-03 19:37:42.798: I/DEBUG(354):     #20 pc 0010eb6b  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::Blt(EsxBltCopy const*)+10)
04-03 19:37:42.798: I/DEBUG(354):     #21 pc 0010ec81  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::BlitRect(EsxResource*, EsxResource*, EsxRect, EsxRect*, int)+272)
04-03 19:37:42.798: I/DEBUG(354):     #22 pc 0010ed67  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::PreserveBackBufferViaBlt(int)+126)
04-03 19:37:42.798: I/DEBUG(354):     #23 pc 001159a7  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::ProcessAndSubmitRendering(EsxFlushReason)+134)
04-03 19:37:42.798: I/DEBUG(354):     #24 pc 00177435  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::Flush(EsxFlushReason)+412)
04-03 19:37:42.799: I/DEBUG(354):     #25 pc 0017759d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::GetCmdSpace(EsxCmdBufType, unsigned int)+140)
04-03 19:37:42.799: I/DEBUG(354):     #26 pc 00173653  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBltHw(EsxBltCopy const*)+938)
04-03 19:37:42.799: I/DEBUG(354):     #27 pc 0017430d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBlt(EsxBltCopy const*)+132)
04-03 19:37:42.799: I/DEBUG(354):     #28 pc 0010d4fd  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::HwBlt(EsxBltCopy const*)+12)
04-03 19:37:42.799: I/DEBUG(354):     #29 pc 0010eb6b  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::Blt(EsxBltCopy const*)+10)
04-03 19:37:42.799: I/DEBUG(354):     #30 pc 0010ec81  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::BlitRect(EsxResource*, EsxResource*, EsxRect, EsxRect*, int)+272)
04-03 19:37:42.799: I/DEBUG(354):     #31 pc 0010ed67  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::PreserveBackBufferViaBlt(int)+126)
04-03 19:37:42.800: I/DEBUG(354):     #32 pc 001159a7  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::ProcessAndSubmitRendering(EsxFlushReason)+134)
04-03 19:37:42.800: I/DEBUG(354):     #33 pc 00177435  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::Flush(EsxFlushReason)+412)
04-03 19:37:42.800: I/DEBUG(354):     #34 pc 0017759d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::GetCmdSpace(EsxCmdBufType, unsigned int)+140)
04-03 19:37:42.800: I/DEBUG(354):     #35 pc 00173653  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBltHw(EsxBltCopy const*)+938)
04-03 19:37:42.800: I/DEBUG(354):     #36 pc 0017430d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBlt(EsxBltCopy const*)+132)
04-03 19:37:42.800: I/DEBUG(354):     #37 pc 0010d4fd  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::HwBlt(EsxBltCopy const*)+12)
04-03 19:37:42.801: I/DEBUG(354):     #38 pc 0010eb6b  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::Blt(EsxBltCopy const*)+10)
04-03 19:37:42.801: I/DEBUG(354):     #39 pc 0010ec81  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::BlitRect(EsxResource*, EsxResource*, EsxRect, EsxRect*, int)+272)
04-03 19:37:42.801: I/DEBUG(354):     #40 pc 0010ed67  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::PreserveBackBufferViaBlt(int)+126)
04-03 19:37:42.801: I/DEBUG(354):     #41 pc 001159a7  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::ProcessAndSubmitRendering(EsxFlushReason)+134)
04-03 19:37:42.801: I/DEBUG(354):     #42 pc 00177435  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::Flush(EsxFlushReason)+412)
04-03 19:37:42.801: I/DEBUG(354):     #43 pc 0017759d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::GetCmdSpace(EsxCmdBufType, unsigned int)+140)
04-03 19:37:42.801: I/DEBUG(354):     #44 pc 00173653  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBltHw(EsxBltCopy const*)+938)
04-03 19:37:42.802: I/DEBUG(354):     #45 pc 0017430d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBlt(EsxBltCopy const*)+132)
04-03 19:37:42.802: I/DEBUG(354):     #46 pc 0010d4fd  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::HwBlt(EsxBltCopy const*)+12)
04-03 19:37:42.802: I/DEBUG(354):     #47 pc 0010eb6b  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::Blt(EsxBltCopy const*)+10)
04-03 19:37:42.802: I/DEBUG(354):     #48 pc 0010ec81  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::BlitRect(EsxResource*, EsxResource*, EsxRect, EsxRect*, int)+272)
04-03 19:37:42.802: I/DEBUG(354):     #49 pc 0010ed67  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::PreserveBackBufferViaBlt(int)+126)
04-03 19:37:42.802: I/DEBUG(354):     #50 pc 001159a7  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::ProcessAndSubmitRendering(EsxFlushReason)+134)
04-03 19:37:42.802: I/DEBUG(354):     #51 pc 00177435  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::Flush(EsxFlushReason)+412)
04-03 19:37:42.803: I/DEBUG(354):     #52 pc 0017759d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::GetCmdSpace(EsxCmdBufType, unsigned int)+140)
04-03 19:37:42.803: I/DEBUG(354):     #53 pc 00173653  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBltHw(EsxBltCopy const*)+938)
04-03 19:37:42.803: I/DEBUG(354):     #54 pc 0017430d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBlt(EsxBltCopy const*)+132)
04-03 19:37:42.803: I/DEBUG(354):     #55 pc 0010d4fd  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::HwBlt(EsxBltCopy const*)+12)
04-03 19:37:42.803: I/DEBUG(354):     #56 pc 0010eb6b  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::Blt(EsxBltCopy const*)+10)
04-03 19:37:42.803: I/DEBUG(354):     #57 pc 0010ec81  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::BlitRect(EsxResource*, EsxResource*, EsxRect, EsxRect*, int)+272)
04-03 19:37:42.803: I/DEBUG(354):     #58 pc 0010ed67  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::PreserveBackBufferViaBlt(int)+126)
04-03 19:37:42.804: I/DEBUG(354):     #59 pc 001159a7  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxContext::ProcessAndSubmitRendering(EsxFlushReason)+134)
04-03 19:37:42.804: I/DEBUG(354):     #60 pc 00177435  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::Flush(EsxFlushReason)+412)
04-03 19:37:42.804: I/DEBUG(354):     #61 pc 0017759d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxCmdMgr::GetCmdSpace(EsxCmdBufType, unsigned int)+140)
04-03 19:37:42.804: I/DEBUG(354):     #62 pc 00173653  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBltHw(EsxBltCopy const*)+938)
04-03 19:37:42.804: I/DEBUG(354):     #63 pc 0017430d  /system/vendor/lib/egl/libGLESv2_adreno.so (EsxBltLib::CopyBlt(EsxBltCopy const*)+132)
04-03 19:37:43.285: I/AudioFlinger(357): BUFFER TIMEOUT: remove(4099) from active list on thread 0xb59c4000
04-03 19:37:43.381: W/ActivityManager(859):   Force finishing activity 1 com.xyz.myapp/.MainLandscape
04-03 19:37:43.382: I/DEBUG(354): Tombstone written to: /data/tombstones/tombstone_09
04-03 19:37:43.382: I/BootReceiver(859): Copying /data/tombstones/tombstone_09 to DropBox (SYSTEM_TOMBSTONE)
04-03 19:37:43.384: W/AudioTrack(4064): releaseBuffer() track 0xb491df80 disabled due to previous underrun, restarting
04-03 19:37:43.396: D/audio_hw_primary(357): out_set_parameters: enter: usecase(1: low-latency-playback) kvpairs: routing=2
04-03 19:37:43.446: I/Adreno(859): EGLInit: QTI Build: 01/29/15, 1bccc5d, I0ba6dce82d
04-03 19:37:43.452: I/WindowState(859): WIN DEATH: Window{10b6ffea u0 com.xyz.myapp/com.xyz.myapp.MainLandscape}
04-03 19:37:43.463: I/OpenGLRenderer(859): Initialized EGL, version 1.4
04-03 19:37:43.467: I/Zygote(377): Process 4064 exited due to signal (11)
04-03 19:37:43.479: I/ActivityManager(859): Process com.xyz.myapp (pid 4064) has died
04-03 19:37:43.513: V/ActivityManager(859): Display changed displayId=0
04-03 19:37:43.514: I/InputReader(859): Reconfiguring input devices.  changes=0x00000004
04-03 19:37:43.514: I/InputReader(859): Device reconfigured: id=5, name='atmel_mxt_ts', size 1440x2560, orientation 0, mode 1, display id 0
04-03 19:37:43.516: I/ActivityManager(859): Config changes=480 {1.0 ?mcc?mnc en_US ?layoutDir sw411dp w411dp h658dp 560dpi nrml port finger -keyb/v/h -nav/h s.9}
04-03 19:37:43.530: W/AudioPolicyManager(357): unregisterEffect() unknown effect ID 39
04-03 19:37:43.530: W/AudioFlinger(357): session id 36 not found for pid 4064
04-03 19:37:43.530: W/AudioFlinger(357): removeEffect_l() 0xb59c4000 cannot promote chain for effect 0xb5958d80
04-03 19:37:43.530: W/AudioPolicyManager(357): unregisterEffect() unknown effect ID 39
04-03 19:37:43.540: D/ImsConfigImpl(1308): onConfigurationChange
04-03 19:37:43.546: E/SurfaceFlinger(258): rejecting buffer: bufWidth=1792, bufHeight=728, front.active.{w=225, h=225}
04-03 19:37:43.562: E/SurfaceFlinger(258): rejecting buffer: bufWidth=1664, bufHeight=728, front.active.{w=225, h=225}
04-03 19:37:43.717: I/WindowManager(859): Screen frozen for +232ms due to Window{eccfac3 u0 com.android.systemui.ImageWallpaper}
04-03 19:37:45.792: I/art(859): Explicit concurrent mark sweep GC freed 16618(953KB) AllocSpace objects, 12(2MB) LOS objects, 30% free, 37MB/53MB, paused 1.137ms total 68.663ms
04-03 19:37:45.855: D/audio_hw_primary(357): disable_audio_route: reset and update mixer path: low-latency-playback speaker
04-03 19:37:45.856: D/audio_hw_primary(357): disable_snd_device: snd_device(2: speaker)

非常感谢您的帮助。

提前致谢。


似乎是OpenGL库中的一个无限循环。 - Gabe Sechan
1
可能是这样。或者你用自我引用的数据来调用它。但是肯定有一个循环,看起来它一直循环直到堆栈耗尽。 - Gabe Sechan
1
仅供完成:经过进一步的研究,这绝对是一个堆栈内存问题。问题是,Google是否在其最新的5.1版本中减少了堆栈大小,还是他们改变的逻辑只是使用更多的堆栈内存?无论如何,Android 5.1不允许与以前版本相同数量的九宫格图形出现在屏幕上。因此,唯一的解决方法是减少九宫格图形的数量。在我的情况下,这意味着要展平所有分层图形,这可能会将图形数量减少1/3。 - gal
你能解决这个问题吗?当我使用Image Loader库在列表中加载大量图片时,我遇到了同样的问题。请给我反馈并指导我如何解决这个问题。 - Sri Krishna
是的,我找到了一个解决那个Adreno 420图形驱动程序错误的方法。我刚刚将解决方案发布为问题的答案。 - gal
显示剩余6条评论
2个回答

9

到目前为止(即使在Android M中),对于图形驱动程序漏洞(Adreno 420)还没有修复,但我找到了一个解决方法。这绝不是长期的解决方案,但目前只是最好的可用措施来阻止应用程序崩溃。

我将图形层数减少到最小值(压缩了许多分层图形)。

我禁用了特定图形层的GPU渲染。这会稍微减慢绘制速度,但影响不大。

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

在“软件”层中,如果需要,您仍然可以将特定视图设置为“硬件”渲染。

view.setLayerType(View.LAYER_TYPE_HARDWARE, null);

4

我遇到了一些问题,然后我在Android清单文件中添加了下面的代码。它可以正常工作。

<application        
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/CustomTheme"
    android:allowBackup="true"           
    android:vmSafeMode="true"       
    android:allowClearUserData="true"
    android:hardwareAccelerated="true" >

有趣的解决方案。解决你问题的可能是android:vmSafeMode="true"。我认为这不是一个好的解决方案,因为使用此标志会禁用JIT优化,这可能(但不一定)对应用程序性能产生重大影响。 - gal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接