问题背景与目标
本次验证聚焦于一个具体的并发场景:后台线程异步调用 WebSettings.getDefaultUserAgent(),同时主线程在冷启动阶段首次执行 new WebView()。两者会并发进入 WebView provider 及 Chromium 初始化链。
我们的目标并非单纯验证'预热是否提速',而是确认是否存在共享初始化链的竞争风险,具体包括:
- 主线程是否会因此被拖慢或阶段性阻塞
- 是否存在演化为 ANR 的风险
- 共享初始化链的具体表现形态
核心结论修正
结合所有日志分析,更准确的结论是:getDefaultUserAgent() 与首次 new WebView() 并发时,二者并不是始终'卡死'在 WebViewFactory.getProvider() 这一行。真实的表现是它们共享同一条 WebView provider / Chromium 初始化链,在不同阶段交错推进,并在部分关键节点出现阶段性等待、锁竞争或串行化,进而放大主线程耗时。
问题的本质更接近于:交错执行、阶段性阻塞以及共享初始化链导致的主线程长卡顿。这不同于两个线程永久互锁或一直完全卡死在某个特定方法上。
验证方式与环境
实验模式
统一采用以下配置进行验证:
EXPERIMENT_MODE = CONCURRENT- 冷启动首次进入
MainActivity - 在
new WebView()前触发后台WebSettings.getDefaultUserAgent() - 通过 watchdog 在
100ms / 200ms / 500ms采样主线程栈、UA 线程栈、当前阻塞时长及 UA 线程状态
关键日志关键词包括 WebWarmVerify、watchdog_trigger 以及不同角色的 thread_dump。
测试设备
为了放大问题并验证机制,我们使用了多版本模拟器及真机环境。
| 设备名 | 系统版本 | 镜像/ABI | 启动方式 | 资源配置 |
|---|---|---|---|---|
| Pixel_API25_7.1.1 | API 25 / Android 7.1.1 | Google Play x86 | Cold Boot | CPU 2核 / RAM 2GB |
| Pixel3a_API29_WebView | API 29 / Android 10 | Google Play x86_64 | Cold Boot | CPU 2核 / RAM 2GB |
| Medium Phone API 36 | API 36 / Android 16 | Google Play x86_64 | Cold Boot | CPU 2核 / RAM 2GB |
| Xiaomi 真机 |


