安卓16更新Vulkan后有很大比例的用户会在uni-app中崩溃
安卓16更新Vulkan后有很大比例的用户会在uni-app中崩溃
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Mac | 14.6 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Mac
HBuilderX类型:正式
HBuilderX版本号:4.87
手机系统:Android
手机系统版本号:Android 16
手机厂商:Google Pixel
手机机型:Google Pixel 8a、Google Pixel 9 Pro XL、Samsung Galaxy A16 5G等
页面类型:vue
vue版本:vue3
打包方式:云端
项目创建方式:HBuilderX
操作步骤:
未知
预期结果:
无用户崩溃
实际结果:
谷歌商店后台统计3%用户崩溃
bug描述:
根据GooglePlay后台崩溃统计,用户崩溃率高达2.9%,且全部为Android 16
GooglePlay后台给出崩溃常见设备为Samsung Galaxy A16 5G、Google Pixel 9 Pro XL、Google Pixel 8a等
项目为WebView内嵌H5,除基础前端页面、部分translate动画外,使用了基于腾讯tcplayer的webrtc视频播放
90%以上报错为如下两个情况:
情况一:
VK_ERROR_DEVICE_LOST (RenderThread, 2 address info (1:411832422656:4096, 1:411832422656:4096), 2 vendor info (194:4310696642, 194:8605663938)): Exception type 0xc2: TRANSLATION_FAULT at level 2. VA: 0x. Access type 0x2: Read. Source id 0xf0: sc_0, Shader core 0 (tma1, Texture Cache AFBC 1). Group 0.
pid: 0, tid: 25735 >>> com.xxxx.xxxx <<<
backtrace:
#00 pc 0x0000000000076360 /apex/com.android.runtime/lib64/bionic/libc.so (abort+160)
#1 pc 0x00000000008fde60 /apex/com.android.art/lib64/libart.so (art::Runtime::Abort(char const*)+1004)
#2 pc 0x000000000001654c /apex/com.android.art/lib64/libbase.so (android::base::SetAborter(std::__1::function<void (char const)>&&)$_0::__invoke(char const)+80)
#3 pc 0x000000000000bc64 /system/lib64/liblog.so (__android_log_assert+212)
#4 pc 0x00000000006fd0f4 /system/lib64/libhwui.so (android::uirenderer::renderthread::(anonymous namespace)::onVkDeviceFault(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator> const&, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator> const&, std::__1::vector<VkDeviceFaultAddressInfoEXT, std::__1::allocator> const&, std::__1::vector<VkDeviceFaultVendorInfoEXT, std::__1::allocator> const&, std::__1::vector<std::byte, std::__1::allocatorstd::byte> const&) (.__uniq.192405051647925496281077346275335259674)+980)
#5 pc 0x00000000006fccbc /system/lib64/libhwui.so (android::uirenderer::renderthread::(anonymous namespace)::deviceLostProcRenderThread(void*, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator> const&, std::__1::vector<VkDeviceFaultAddressInfoEXT, std::__1::allocator> const&, std::__1::vector<VkDeviceFaultVendorInfoEXT, std::__1::allocator> const&, std::__1::vector<std::byte, std::__1::allocatorstd::byte> const&) (.__uniq.192405051647925496281077346275335259674)+76)
#6 pc 0x0000000000207f44 /system/lib64/libhwui.so (skgpu::InvokeDeviceLostCallback(skgpu::VulkanInterface const*, VkDevice_T*, void*, void ()(void, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator> const&, std::__1::vector<VkDeviceFaultAddressInfoEXT, std::__1::allocator> const&, std::__1::vector<VkDeviceFaultVendorInfoEXT, std::__1::allocator> const&, std::__1::vector<std::byte, std::__1::allocatorstd::byte> const&), bool)+628)
#7 pc 0x0000000000207624 /system/lib64/libhwui.so (GrVkResourceProvider::checkCommandBuffers()+1732)
#8 pc 0x000000000031dec8 /system/lib64/libhwui.so (GrDirectContext::performDeferredCleanup(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l>>, GrPurgeResourceOptions)+104)
#9 pc 0x0000000000550044 /system/lib64/libhwui.so (android::uirenderer::renderthread::RenderThread::threadLoop()+740)
#10 pc 0x0000000000019bcc /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+236)
#11 pc 0x000000000001bd58 /system/lib64/libutils.so (libutil_thread_trampoline(void*) (.__uniq.226528677032898775202282855395389835431)+24)
#12 pc 0x00000000000873e4 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*) (.__uniq.67847048707805468364044055584648682506)+180)
#13 pc 0x0000000000079c64 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+68)
情况二:
VK_ERROR_DEVICE_LOST (RenderThread): No details: VK_EXT_device_fault not available/enabled.
pid: 0, tid: 2764 >>> com.xxxx.xxxx <<<
backtrace:
#00 pc 0x00000000000a7cc8 /apex/com.android.runtime/lib64/bionic/libc.so (abort+156)
#1 pc 0x00000000008a0f04 /apex/com.android.art/lib64/libart.so (art::Runtime::Abort(char const*)+476)
#2 pc 0x0000000000016188 /apex/com.android.art/lib64/libbase.so (android::base::SetAborter(std::__1::function<void (char const)>&&)$_0::__invoke(char const)+80)
#3 pc 0x000000000000d254 /system/lib64/liblog.so (__android_log_assert+288)
#4 pc 0x000000000088a018 /system/lib64/libhwui.so (android::uirenderer::renderthread::(anonymous namespace)::onVkDeviceFault(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator> const&, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator> const&, std::__1::vector<VkDeviceFaultAddressInfoEXT, std::__1::allocator> const&, std::__1::vector<VkDeviceFaultVendorInfoEXT, std::__1::allocator> const&, std::__1::vector<std::byte, std::__1::allocatorstd::byte> const&) (.__uniq.192405051647925496281077346275335259674)+1032)
#5 pc 0x0000000000889bb4 /system/lib64/libhwui.so (android::uirenderer::renderthread::(anonymous namespace)::deviceLostProcRenderThread(void*, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator> const&, std::__1::vector<VkDeviceFaultAddressInfoEXT, std::__1::allocator> const&, std::__1::vector<VkDeviceFaultVendorInfoEXT, std::__1::allocator> const&, std::__1::vector<std::byte, std::__1::allocatorstd::byte> const&) (.__uniq.192405051647925496281077346275335259674)+72)
#6 pc 0x00000000004037ec /system/lib64/libhwui.so (skgpu::InvokeDeviceLostCallback(skgpu::VulkanInterface const*, VkDevice_T*, void*, void ()(void, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator> const&, std::__1::vector<VkDeviceFaultAddressInfoEXT, std::__1::allocator> const&, std::__1::vector<VkDeviceFaultVendorInfoEXT, std::__1::allocator> const&, std::__1::vector<std::byte, std::__1::allocatorstd::byte> const&), bool)+288)
#7 pc 0x0000000000402fec /system/lib64/libhwui.so (GrVkResourceProvider::checkCommandBuffers()+1852)
#8 pc 0x0000000000584550 /system/lib64/libhwui.so (GrDirectContext::performDeferredCleanup(std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l>>, GrPurgeResourceOptions)+112)
#9 pc 0x000000000068e728 /system/lib64/libhwui.so (android::uirenderer::renderthread::RenderThread::threadLoop()+728)
#10 pc 0x0000000000019060 /system/lib64/libutils.so (android::Thread::_threadLoop(void*)+248)
#11 pc 0x000000000001b66c /system/lib64/libutils.so (libutil_thread_trampoline(void*) (.__uniq.226528677032898775202282855395389835431)+20)
#12 pc 0x00000000000b78f4 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+232)
#13 pc 0x00000000000aac5c /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)
更多关于安卓16更新Vulkan后有很大比例的用户会在uni-app中崩溃的实战教程也可以访问 https://www.itying.com/category-93-b0.html
该bug反馈整体较为完整,标题清晰描述了问题核心,BUG描述详细说明了崩溃率(2.9%)、设备型号(Samsung Galaxy A16 5G、Pixel系列)和技术栈(WebView内嵌H5+腾讯tcplayer webrtc),并提供了两种典型的backtrace日志。分类信息完整包含HBuilderX 4.87、Vue3、Android 16等关键版本信息。但复现步骤标记为"未知"是明显缺失,官方难以直接复现;缺少可运行的代码示例,虽有backtrace但无法验证具体触发条件。
经核查知识库,该问题成立且具有针对性:Android 16对Vulkan图形API进行了重大更新,而反馈中崩溃均源于VK_ERROR_DEVICE_LOST,与系统级Vulkan变更直接相关。 内容为 AI 生成,仅供参考
更多关于安卓16更新Vulkan后有很大比例的用户会在uni-app中崩溃的实战教程也可以访问 https://www.itying.com/category-93-b0.html
可以打点对比验证下,在不使用腾讯的webrtc时,Android16的用户群里有没有崩溃,或者崩溃率是否低于合理值
App核心功能,没法不用的
这是一个典型的Android 16系统更新Vulkan图形驱动后引发的GPU设备丢失问题。从崩溃堆栈看,问题发生在libhwui.so的渲染线程中,核心错误是VK_ERROR_DEVICE_LOST。
问题分析:
- Vulkan驱动兼容性问题:Android 16更新了Vulkan实现,但某些设备的GPU驱动(特别是三星和Google Pixel的特定型号)在处理WebView的图形渲染时存在缺陷。
- WebView硬件加速冲突:uni-app的WebView在Android 16上默认使用硬件加速,与Vulkan渲染管线存在兼容性问题。
- 纹理缓存访问异常:从错误信息
Texture Cache AFBC 1可以看出,问题涉及AFBC(Adaptive Scalable Texture Compression)纹理压缩格式的缓存访问。
临时解决方案:
-
禁用WebView硬件加速(推荐): 在
manifest.json的app-plus节点下添加:"webview": { "hardwareAccelerated": false } -
降级渲染模式: 在应用启动时尝试设置:
// main.js或App.vue if (uni.getSystemInfoSync().platform === 'android') { const system = uni.getSystemInfoSync(); if (parseInt(system.system.split(' ')[1]) >= 16) { // 尝试设置软件渲染 plus.webview.currentWebview().setStyle({ hardwareAccelerated: false }); } }

