Process: com.my.app
PID: 32376
UID: 1000
Flags: 0x28c8be45
Package: com.my.app v25092411 (0.2.25092411)
Foreground: Yes
Process-Runtime: 10882259
Build: DesaySV/g7ph_t22_int/msmnile_gvmq:11/RQ3A.210805.001.A1/eng.sreadm.20250928.104050:userdebug/dev-keys
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'DesaySV/g7ph_t22_int/msmnile_gvmq:11/RQ3A.210805.001.A1/eng.sreadm.20250928.104050:userdebug/dev-keys'
Revision: '0'
ABI: 'arm64'
Timestamp: 2025-09-29 20:42:58+0800
pid: 32376, tid: 17241, name: RenderThread >>> com.my.app <<<
uid: 1000
signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
Abort message: 'GL errors! frameworks/base/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp:136'
x0 0000000000000000 x1 0000000000004359 x2 0000000000000006 x3 000000794f7d31f0
x4 0000007b6e4c7090 x5 0000007b6e4c7090 x6 0000007b6e4c7090 x7 0000007b6e4c7090
x8 00000000000000f0 x9 9d3fb4888efc757f x10 0000000000000000 x11 ffffffc0fffffbdf
x12 0000000000000001 x13 0000005365c5cd21 x14 001874d756a7f000 x15 0000000034155555
x16 0000007c51242c80 x17 0000007c512249f0 x18 000000794f0a2000 x19 0000000000007e78
x20 0000000000004359 x21 00000000ffffffff x22 000000795dc7d353 x23 0000000000000016
x24 000000795dc5d167 x25 0000000000000001 x26 000000795dc740f3 x27 000000795e279000
x28 b40000797e40c810 x29 000000794f7d3270
lr 0000007c511d8420 sp 000000794f7d31d0 pc 0000007c511d844c pst 0000000000000000
backtrace:
#00 pc 000000000004e44c /apex/com.android.runtime/lib64/bionic/libc.so (abort+164) (BuildId: 8d0a10271eef02de6c33b788fec2db37)
#01 pc 000000000055d63c /apex/com.android.art/lib64/libart.so (art::Runtime::Abort(char const*)+2308) (BuildId: 73d6737dbe67e90c34ab90adafef0989)
#02 pc 0000000000013978 /system/lib64/libbase.so (android::base::SetAborter(std::__1::function<void (char const*)>&&)::$_3::__invoke(char const*)+76) (BuildId: 01a12dd5224373edcc3a74506f64a9c9)
#03 pc 0000000000006e18 /system/lib64/liblog.so (__android_log_assert+336) (BuildId: 315ede50d6288b1f9a96c1af4fdd3a20)
#04 pc 00000000002164bc /system/lib64/libhwui.so (android::uirenderer::skiapipeline::SkiaOpenGLPipeline::swapBuffers(android::uirenderer::renderthread::Frame const&, bool, SkRect const&, android::uirenderer::FrameInfo*, bool*)+172) (BuildId: 94301697e06fecf05fe0b0eaab5a7f7f)
#05 pc 000000000021f234 /system/lib64/libhwui.so (android::uirenderer::renderthread::CanvasContext::draw()+648) (BuildId: 94301697e06fecf05fe0b0eaab5a7f7f)
#06 pc 00000000002216f0 /system/lib64/libhwui.so (_ZNSt3__110__function6__funcIZN7android10uirenderer12renderthread13DrawFrameTask11postAndWaitEvE3$_0NS_9allocatorIS6_EEFvvEEclEv$c303f2d2360db58ed70a2d0ac7ed911b+480) (BuildId: 94301697e06fecf05fe0b0eaab5a7f7f)
#07 pc 000000000020fd98 /system/lib64/libhwui.so (android::uirenderer::WorkQueue::process()+220) (BuildId: 94301697e06fecf05fe0b0eaab5a7f7f)
#08 pc 0000000000231218 /system/lib64/libhwui.so (android::uirenderer::renderthread::RenderThread::threadLoop()+88) (BuildId: 94301697e06fecf05fe0b0eaab5a7f7f)
#09 pc 00000000000154d0 /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+260) (BuildId: 5d6af74124211886d954d61c96514a46)
#10 pc 0000000000014d94 /system/lib64/libutils.so (thread_data_t::trampoline(thread_data_t const*)+412) (BuildId: 5d6af74124211886d954d61c96514a46)
#11 pc 00000000000afecc /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+64) (BuildId: 8d0a10271eef02de6c33b788fec2db37)
#12 pc 0000000000050408 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: 8d0a10271eef02de6c33b788fec2db37)
根据这个系统原生崩溃日志,来分析问题原因并提供解决方案:
问题分析
根本原因
这是一个 OpenGL渲染错误 导致的崩溃,具体发生在:
- 位置:
SkiaOpenGLPipeline.cpp:136在swapBuffers过程中 - 信号: SIGABRT (信号6) - 程序主动中止
- 线程: RenderThread (渲染线程)
- 错误信息:
GL errors!- OpenGL图形API出现错误
崩溃链分析
RenderThread → SkiaOpenGLPipeline::swapBuffers → 检测到GL错误 → 断言失败 → abort() → 进程终止
可能的原因
1. 图形资源问题
- 纹理、缓冲区等图形资源未正确创建或已销毁
- 内存不足导致图形资源分配失败
- 纹理尺寸过大或格式不支持
2. OpenGL上下文问题
- EGL上下文丢失或无效
- 在多线程环境中错误地共享OpenGL资源
- SurfaceView/TextureView生命周期管理不当
3. 渲染代码问题
- 在非OpenGL线程执行GL操作
- 着色器程序编译失败但未正确处理
- 帧缓冲区配置错误
解决方案
立即措施
// 在渲染代码中添加GL错误检查
GLES20.glGetError(); // 清除错误状态
// 执行GL操作后检查错误
int error = GLES20.glGetError();
if (error != GLES20.GL_NO_ERROR) {
Log.e("GL_ERROR", "OpenGL error: " + error);
// 处理错误,避免继续渲染
return;
}
代码层面修复
- 增强错误处理
public class MyGLRenderer implements GLSurfaceView.Renderer {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// 初始化后检查GL状态
checkGLError("onSurfaceCreated");
}
@Override
public void onDrawFrame(GL10 gl) {
try {
// 渲染代码
renderFrame();
} catch (Exception e) {
Log.e("RENDER", "Render error", e);
// 优雅降级或重启渲染
recoverFromRenderError();
}
checkGLError("onDrawFrame");
}
private void checkGLError(String operation) {
int error;
while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
Log.e("OPENGL", operation + ": glError " + error);
}
}
}
- 资源管理优化
// 确保资源在正确的线程释放
@Override
public void onSurfaceDestroyed() {
// 在GL线程中释放资源
mGLSurfaceView.queueEvent(new Runnable() {
@Override
public void run() {
releaseGLResources();
}
});
}
系统层面检查
- 检查设备兼容性
// 检查OpenGL ES版本支持
final ActivityManager activityManager =
(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
final ConfigurationInfo configurationInfo =
activityManager.getDeviceConfigurationInfo();
final int maxGlEsVersion = configurationInfo.reqGlEsVersion;
- 内存管理
- 监控应用内存使用,避免OOM
- 及时释放不再使用的纹理和缓冲区
- 使用纹理压缩格式减少内存占用
预防措施
- 添加渲染健康检查
private boolean isRenderingHealthy() {
return mGLSurfaceView != null &&
mGLSurfaceView.getRenderer() != null &&
!isContextLost;
}
- 实现优雅恢复机制
private void recoverFromRenderError() {
// 尝试重新创建Surface
if (mGLSurfaceView != null) {
mGLSurfaceView.onPause();
mGLSurfaceView.onResume();
}
}
调试建议
- 启用详细日志
adb shell setprop debug.hwui.render_dirty_regions true
adb shell setprop log.tag.OpenGLRenderer DEBUG
- 使用GPU调试工具
- Android GPU Inspector
- GLES跟踪
- 系统跟踪(Systrace)
这个崩溃通常需要通过仔细检查应用的OpenGL渲染代码和资源管理来解决,重点关注渲染线程中的异常处理和资源生命周期管理。