android - tgkill - Android 8.0 Samsung S8 上的本机错误
问题描述
最近我开始遇到 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)
解决方案
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::draw //method
mEglManager.damageFrame(frame, dirty);
为什么 ?
看起来你可能有一个' Failed to set damage region on surface
',可能在onResume()
from之后screen rotation
或onPause()
在你的Activity
. 请参阅fixing-common-android-lifecycle-issues
修复
更新到 后,我开始遇到此崩溃
Oreo
,每次我启动我的应用程序时,都会显示消息“Failed to set damage region on
surface
”,然后是所有那些关于libhwui.so
and的行EglManager
结果证明,由于某种模糊的原因,它是由一个完全不相关的问题引起的我的应用程序(打开的文件太多[忘记关闭它们])。在修复了这个我自己的错误后,EglManager
. [还请注意,只有在打开硬件加速时才会发生崩溃] Ref: issuetracker.google.com { issue 70259031}
另请参阅:eglCreateWindowSurface {SO 问题}、日志记录、native-crashes-on-abort-in-developer-console-with-oreo-8-1 {SO 问题}、硬件加速、opengl、GLSurfaceView
推荐阅读
- typescript - 带有嵌套对象的 Object.keys():获取正确的类型
- sql - 使用 EXEC 的结果创建新表
- node.js - 如何使用 `ng new` 创建新应用程序?
- java - 如何在首选项中保存文件?
- c# - 如何使用 Sharppcap 获取 http 内容
- angular - 如何在 Ionic Angular 中播放音频?
- javascript - 您如何使用 Neptune 在本地进行测试?
- javascript - Javascript 中数组与对象的实例化。数组什么时候是对象,什么时候得到数组的方法?
- c++ - Mutex 不是 cv 的成员,用 g++ 编译失败
- python - 插入数据库时出现无效语法 ON CONFLICT