tgkill - Android 8.0 Samsung S8 上的本地错误。

17

最近我开始遇到Android本地崩溃(在Google Play关键指标中报告)。 它们仅发生在带有Android 8的三星Galaxy S8或S8 +手机上。

根据堆栈跟踪,它与UI渲染器线程有关。 然而,我不知道如何修复它,甚至不知道在应用程序中确切发生了什么。

有没有想法如何找出在应用程序中发生了什么? 为什么只有Galaxy S8配备Android 8受到影响? 谢谢。

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)

4
我也有同样的问题,只出现在安卓8上。你找到了解决方法吗? - Deividi Cavarzan
@Deividi Cavarzan 还没有。抱歉。 - petrsyn
我也一样 :( - Jonathan ANTOINE
1
一样的问题。这是我们崩溃报告中的#1问题。 - dasfima
@petrsyn,你解决了吗? - Jithish P N
显示剩余4条评论
2个回答

4

Logcat分析

这里是您的代码崩溃的位置: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.cpp

SkiaOpenGLPipeline::draw //method

mEglManager.damageFrame(frame, dirty);

为什么会出现问题?

Activity中的onResume()或者onPause()之后,可能会出现"Failed to set damage region on surface"的错误。这通常与screen rotation或者硬件加速(hardware acceleration)有关。具体解决方案请参考fixing-common-android-lifecycle-issues

如何解决问题?

我在升级到Oreo之后每次启动我的应用程序时都会出现这个崩溃,错误信息是"Failed to set damage region on surface",并且还会输出一系列有关libhwui.soEglManager的内容。后来发现,由于我的应用程序存在一个与此无关但导致too many open files的问题([忘记关闭文件]),因此出现了这个问题。当我修复了自己的错误后,就再也没有出现过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


谢谢,非常详细!但是我认为 OP(或者我)没有使用任何OpenGL。这个问题发生在你打开一个对话框,按住文本框以弹出文本处理器,然后关闭对话框或改变方向时。到目前为止,我找到的唯一解决方法是将所有的DialogFragments更改为普通片段呈现在我的活动上。这并不理想,因为它需要一些技巧来防止用户与活动进行交互等。就像它试图在对话框可用之前绘制一样(从您的描述来看这是有道理的),但是如何修复它呢? - Zee
1
@Zee 很高兴你有一些解决方案(frags/accel),直到三星/谷歌修复问题70259031。 EGL(“嵌入式系统图形库”)是你崩溃的接口,它是Khronos渲染API(如OpenGL、OpenGL ES或OpenVG)和底层本地平台窗口系统之间的接口。 尝试使用gltracer查看EGL是否正在使用OpenGL(OpenGLPipeline)以及在对话框帧中发生的所有情况。祝你好运! - Jon Goodwin
@Zee See 控制硬件加速 您可以在以下级别上控制硬件加速: 应用程序 活动 窗口 视图 - Jon Goodwin
1
@Zee 你可以尝试在活动级别(在清单中)停用加速,然后动态重新激活任何受益于加速的关键视图(并且没有此错误)...这有点像黑客行为,但可能值得一试。 - Jon Goodwin
1
你真是个冠军!!按照你的建议,我设法让它正常工作了。在有问题的活动中,我加入了以下代码:if (!(phoneMake.equalsIgnoreCase("samsung") && (phoneModel.startsWith("SM-G950") || phoneModel.startsWith("SM-G955")))) { getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); }以便尽可能地启用加速功能。再次非常感谢你的帮助!! - Zee
显示剩余3条评论

-1

这个问题似乎只出现在搭载Android 8.0的三星设备上,它与文本选择、输入文本、关闭包含EditText的对话框和/或旋转屏幕有关。

看起来有一个解决方法。在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"

来源:三星开发者论坛崩溃三星Galaxy S8 libhwui.so


我能够重现这个问题,但修复似乎没有任何改变! - Zee

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