tgkill - Android 8.0 Samsung S8 上的本机错误

Posted

技术标签:

【中文标题】tgkill - Android 8.0 Samsung S8 上的本机错误【英文标题】:tgkill - native error on Android 8.0 Samsung S8 【发布时间】:2018-10-25 21:06:06 【问题描述】:

最近我开始遇到 android 原生崩溃(在 Google Play Vitals 中报告)。它们仅发生在搭载 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)

【问题讨论】:

我也有同样的问题,android 8 独有。你找到解决办法了吗? @Deividi Cavarzan 还没有。对不起。 对我来说也一样 :( 这里也一样。这是崩溃报告中排名第一的问题。 你的布局中有 EditTexts 吗?你有真正的三星设备要测试吗? 【参考方案1】:

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 中可能有一个'Failed to set damage region on surface',可能在screen rotationonPause() 之后的onResume()。见fixing-common-android-lifecycle-issues

修复

我每次更新到Oreo 后都开始崩溃 启动了我的应用程序,并显示消息“Failed to set damage region on surface" 后面是所有关于 libhwui.soEglManager 的行 事实证明,由于某种不明原因,它是由某种原因引起的 由于我的应用程序中一个完全不相关的问题(打开的文件太多 [忘了 关闭它们])。修复了我自己的错误后,不再崩溃 EglManager。 [还请注意,只有在硬件条件下才会发生崩溃 加速开启] Ref: 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。当您打开一个对话框,按住文本字段以调出 textHandlers,然后关闭对话框或更改方向时,会发生此问题。到目前为止,我能找到的唯一解决方法是将所有 DialogFragments 更改为在我的活动上呈现的正常片段。不理想,因为它需要黑客来阻止用户与活动进行交互等。它几乎就像它试图在对话框可用之前绘制它(这将是有意义的查看你的描述),但如何修复那个? 做了一个快速测试,禁用硬件加速就可以了。它并不理想,但比崩溃要好。谢谢乔恩! @Zee 很高兴在三星/谷歌修复问题 70259031 之前,您有一些解决方法(frags/accel)。您崩溃的 EGL(“嵌入式系统图形库”)是Khronos 渲染 API(例如 OpenGL、OpenGL ES 或 OpenVG)和底层原生平台窗口系统。尝试使用 gltracer 查看 EGL 如何/是否使用 OpenGL (OpenGLPipeline) 以及对话框框架中发生的所有事情。祝你好运!。 @Zee 您可以尝试在活动级别(在清单中)停用加速,然后动态重新激活任何将从加速中受益的关键视图(并且没有此错误)...有点小技巧,但可能是值得的。 你是冠军!!设法让它像你建议的那样工作。然后,在违规活动中,我将 if (!(phoneMake.equalsIgnoreCase("samsung") && (phoneModel.startsWith("SM-G950") || phoneModel.startsWith("SM-G955")))) getWindow( ).setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 尽可能启用加速。再次感谢您的帮助!【参考方案2】:

这个问题似乎仅限于搭载 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

【讨论】:

我能够重现此问题,但修复似乎没有任何作用!

以上是关于tgkill - Android 8.0 Samsung S8 上的本机错误的主要内容,如果未能解决你的问题,请参考以下文章

sql Sams教你自己SQL db dump

Unity 2018 Game Development in 24 Hours Sams Teach Yourself 3rd Edition

用GDB推导DVM的Java栈

android 通知(android 8.0可用)

Android 8.0 修改默认媒体音量

Android 8.0 隐藏 Launcher3