我正在运行一个本机进程,它使用ScreenshotClient在循环中捕获屏幕。随机运行几次后,当我关闭进程时,我得到"服务'SurfaceFlinger'已死",屏幕重新启动。这在android 4.2中不会发生。
这是回溯:
I/DEBUG ( 111): backtrace:
I/DEBUG ( 111): #00 pc 0002a61e /system/lib/libgui.so
I/DEBUG ( 111): #01 pc 0002f205 /system/lib/libgui.so (android::Surface::queueBuffer(ANativeWindowBuffer*, int)+220)
I/DEBUG ( 111): #02 pc 0002e2cd /system/lib/libgui.so (android::Surface::hook_queueBuffer(ANativeWindow*, ANativeWindowBuffer*, int)+10)
I/DEBUG ( 111): #03 pc 00017fb9 /system/lib/libsurfaceflinger.so
I/DEBUG ( 111): #04 pc 0001b6f1 /system/lib/libsurfaceflinger.so
I/DEBUG ( 111): #05 pc 00015e6f /system/lib/libsurfaceflinger.so
I/DEBUG ( 111): #06 pc 00010767 /system/lib/libutils.so (android::Looper::pollInner(int)+394)
I/DEBUG ( 111): #07 pc 00010869 /system/lib/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+92)
I/DEBUG ( 111): #08 pc 00016089 /system/lib/libsurfaceflinger.so
I/DEBUG ( 111): #09 pc 00016f7b /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::run()+6)
I/DEBUG ( 111): #10 pc 000008fd /system/bin/surfaceflinger
I/DEBUG ( 111): #11 pc 0000e403 /system/lib/libc.so (__libc_init+50)
I/DEBUG ( 111): #12 pc 000007dc /system/bin/surfaceflinger
在过去的几天里,我亲眼目睹了3次SurfaceFlinger崩溃。似乎在实现中有一个bug。因为我用的是S5,所以我不能说这是三星特有的问题还是Android 4.4.2的普遍问题。你使用的是什么设备?
要从这个问题中恢复,您可以简单地重新启动设备。有时,我设法执行"kill -9"(我使用"ps | grep"获得pid),并在不重新启动设备的情况下使一切恢复正常。我过去常常杀死剩余的/挂起的surfaceflinger或mediasserver服务。因为它在被杀死后会自动重启,所以之后一切都很好。
由于这些是设备附带的二进制文件,因此可能无法修复此问题。但是有一个小的机会:如果二进制文件与AOSP (Android开源项目http://source.android.com/)中的二进制文件相同,您可以尝试编译这些二进制文件并替换手机上的二进制文件(请先备份原始文件)。
如果二进制文件是特定于设备的,您可能会在您的设备供应商的开源页面上找到它们。比如三星设备的http://opensource.samsung.com/。这些源代码通常很容易编译,可以代替手机上的二进制文件。
除此之外,我认为没有什么比报告问题更重要的了。
当我干净地关闭进程而不是杀死它时,SurfaceFlinger不再死亡。