最近我开始收到Android原生崩溃(在Google Play上发布了重要信息)。它们只发生在搭载Android 8的三星Galaxy S8或S8 +手机上。
根据堆栈跟踪,它与UI呈现器线程相关。但是我不知道如何修复它,甚至不知道它在应用程序中的确切位置。
任何想法如何找出应用程序在哪里发生这种情况?为什么只有Android 8的Galaxy S8会受到影响?感谢。
backtrace:
#00 pc 0000000000071854 /system/lib64/libc.so (tgkill+8)
#01 pc 000000000001e058 /system/lib64/libc.so (abort+88)
#02 pc 0000000000008248 /system/lib64/liblog.so (__android_log_assert+328)
#03 pc 0000000000052430 /system/lib64/libhwui.so (_ZN7android10uirenderer12renderthread10EglManager11damageFrameERKNS1_5FrameERK6SkRect+320)
#04 pc 000000000004f9dc /system/lib64/libhwui.so (_ZN7android10uirenderer12renderthread14OpenGLPipeline4drawERKNS1_5FrameERK6SkRectS8_RKNS0_12FrameBuilder13LightGeometryEPNS0_16LayerUpdateQueueERKNS0_4RectEbRKNS0_15BakedOpRenderer9LightInfoERKNSt3__16vectorINS_2spINS0_10RenderNodeEEENSM_9allocatorISQ_EEEEPNS0_19FrameInfoVisualizerE+76)
#05 pc 000000000004d7e0 /system/lib64/libhwui.so (_ZN7android10uirenderer12renderthread13CanvasContext4drawEv+176)
#06 pc 00000000000511e8 /system/lib64/libhwui.so (_ZN7android10uirenderer12renderthread13DrawFrameTask3runEv+184)
#07 pc 0000000000058494 /system/lib64/libhwui.so (_ZN7android10uirenderer12renderthread12RenderThread10threadLoopEv+356)
#08 pc 0000000000011c58 /system/lib64/libutils.so (_ZN7android6Thread11_threadLoopEPv+280)
#09 pc 00000000000fd688 /system/lib64/libandroid_runtime.so (_ZN7android14AndroidRuntime15javaThreadShellEPv+136)
#10 pc 000000000006de44 /system/lib64/libc.so (_ZL15__pthread_startPv+36)
#11 pc 000000000001f9a4 /system/lib64/libc.so (__start_thread+68)
答案 0 :(得分:1)
这是您的代码崩溃的地方EglManager.cpp:
void EglManager::damageFrame(const Frame& frame, const SkRect& dirty) {
#ifdef EGL_KHR_partial_update
if (EglExtensions.setDamage && mSwapBehavior == SwapBehavior::BufferAge) {
EGLint rects[4];
frame.map(dirty, rects);
if (!eglSetDamageRegionKHR(mEglDisplay, frame.mSurface, rects, 1)) {
LOG_ALWAYS_FATAL("Failed to set damage region on surface %p, error=%s",
(void*)frame.mSurface, egl_error_str());
}
}
#endif
}
SkiaOpenGLPipeline::draw //method
mEglManager.damageFrame(frame, dirty);
似乎您可能有一个Failed to set damage region on surface
,可能是onResume()
中screen rotation
或onPause()
的{{1}}之后。参见fixing-common-android-lifecycle-issues
每次我更新为
Activity
后,我都开始崩溃 启动了我的应用,并显示消息“Oreo
Failed to set damage region on
”,然后是关于surface
和libhwui.so
的所有这些行 事实证明,由于某种晦涩的原因,这是由某种原因引起的 由我的应用中一个完全不相关的问题引起的(打开的文件太多 [忘记了 关闭它们))。修复了我自己的错误后,不再崩溃EglManager
。 [也请注意,只有在硬件出现崩溃时, 加速已打开]参考:issuetracker.google.com { issue 70259031}
另请参见:eglCreateWindowSurface {SO problem},Logging,native-crashes-on-abort-in-developer-console-with-oreo-8-1 {SO problem},hardware-acceleration,opengl,GLSurfaceView
答案 1 :(得分:0)
此问题似乎仅限于装有Android 8.0的三星设备,这是一些有关文本选择和/或输入文本和/或关闭包含EditTexts的对话框和/或旋转屏幕的错误。
似乎有一种解决方法。在res / drawable文件夹中创建一个xml文件,定义一个空形状,如下所示。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<!-- nothing -->
</shape>
在布局文件中,将以下属性添加到EditTexts:
android:textSelectHandle="@drawable/empty"
android:textSelectHandleRight="@drawable/empty"
android:textSelectHandleLeft="@drawable/empty"
来源:Samsung developers forum crash Samsung Galaxy S8 libhwui.so