SM-J410G(Android 8.1)设备native crash崩溃原因问询
SM-J410G Android 8.1 专属Native Crash分析
堆栈说明
对应崩溃的完整堆栈如下:
pid: 0, tid: 0 >>> com.app99.driver <<< backtrace: #00 pc 000000000001a70e /system/lib/libc.so (abort+63) #00 pc 00000000000065a1 /system/lib/liblog.so (__android_log_assert+156) #00 pc 000000000002fe31 /system/lib/libhwui.so (android::uirenderer::debug::GlesErrorCheckWrapper::assertNoErrors(char const*)+192) #00 pc 000000000005c02d /system/lib/libhwui.so (android::uirenderer::Caches::flush(android::uirenderer::Caches::FlushMode)+116) #00 pc 000000000004f835 /system/lib/libhwui.so (android::uirenderer::renderthread::Bridge_destroyHardwareResources(android::uirenderer::renderthread::destroyHardwareResourcesArgs*)+4) #00 pc 0000000000050233 /system/lib/libhwui.so (android::uirenderer::renderthread::MethodInvokeRenderTask::run()+10) #00 pc 00000000000503b3 /system/lib/libhwui.so (android::uirenderer::renderthread::SignalingRenderTask::run()+10) #00 pc 0000000000051103 /system/lib/libhwui.so (android::uirenderer::renderthread::RenderThread::threadLoop()+178) #00 pc 000000000000d23d /system/lib/libutils.so (android::Thread::_threadLoop(void*)+144) #00 pc 0000000000068f89 /system/lib/libandroid_runtime.so (android::AndroidRuntime::javaThreadShell(void*)+80) #00 pc 00000000000479df /system/lib/libc.so (__pthread_start(void*)+22) #00 pc 000000000001b2dd /system/lib/libc.so (__start_thread+32)
核心根因
- 该问题为三星SM-J410G机型Android 8.1定制ROM的已知缺陷,由Mali GPU驱动和系统HWUI渲染逻辑的兼容性问题导致:销毁硬件资源时渲染线程检测到未处理的GLES错误,直接触发断言终止进程,该问题不会出现在其他机型或系统版本上。
常见触发场景
- 包含硬件加速动画、自定义GL绘制、WebView视频播放的页面销毁时,资源释放时机和系统渲染线程的Flush操作冲突
- 页面销毁时未提前停止正在运行的硬件加速动画,触发渲染线程访问已释放的GL资源
修复方案
- 专属机型兼容:判断当前设备为SM-J410G且系统版本为Android 8.1时,对对应页面主动关闭硬件加速,代码如下:
// Activity onCreate中添加 if ("SM-J410G".equals(Build.MODEL) && Build.VERSION.SDK_INT == Build.VERSION_CODES.O_MR1) { getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED ); // 若仅特定View触发问题,可单独关闭该View的硬件加速 // targetView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } - 调整资源释放逻辑:页面销毁前先主动停止所有动画、WebView加载、GL绘制任务,延迟100ms再执行页面销毁/View释放操作
- WebView场景特殊处理:销毁WebView前先执行
webView.onPause()、webView.loadUrl("about:blank")清空渲染内容,再调用destroy方法
内容的提问来源于stack exchange,提问作者Elric Sun
相关产品推荐
相关产品推荐

