Android 7.1设备WebView加载URL触发SIGTRAP崩溃问题排查
Cordova WebView在arm64-v8a设备上加载URL触发SIGTRAP崩溃的解决方案
结合你提供的设备信息、代码和崩溃日志,我来帮你梳理问题根源和可行的解决办法:
问题复现场景
在**HTC Nexus 9(Android 7.1.1,API 25,arm64-v8a ABI)**设备上,使用Cordova WebView加载URL一段时间后,应用抛出Fatal signal 5 (SIGTRAP)错误崩溃。但当NDK配置仅指定armeabi-v7a时,应用运行完全正常;添加arm64-v8a等多ABI支持后,崩溃必现。
相关代码片段
private SystemWebView syswvViewDocuments; private CordovaWebView wvViewDocuments; wvViewDocuments = new CordovaWebViewImpl(new SystemWebViewEngine(syswvViewDocuments)); wvViewDocuments.init((CordovaInterface) getParentFragment(), parser.getPluginEntries(), parser.getPreferences()); syswvViewDocuments = view.findViewById(R.id.wvViewDocuments); WebView.setWebContentsDebuggingEnabled(true); syswvViewDocuments.getSettings().setLoadsImagesAutomatically(true); syswvViewDocuments.getSettings().setJavaScriptEnabled(true); syswvViewDocuments.getSettings().setBuiltInZoomControls(false); syswvViewDocuments.getSettings().setDomStorageEnabled(true); syswvViewDocuments.getSettings().setSupportZoom(true); wvViewDocuments.loadUrl(url); SystemWebViewEngine systemWebViewEngine = (SystemWebViewEngine) wvViewDocuments.getEngine(); mDocumentViewClient = new DocumentViewClient(systemWebViewEngine, getParentFragment(), (CordovaInterface) getParentFragment(), wvViewDocuments, mActivity, this, bundle); syswvViewDocuments.setWebViewClient(mDocumentViewClient); if (ApplicationStore.isUsingNativeFileChooser()) { syswvViewDocuments.setWebChromeClient(new ChromeClient(systemWebViewEngine, (CordovaInterface) getParentFragment(), mActivity, getParentFragment())); }
崩溃日志信息
简化错误日志
2019-08-09 13:14:56.699 12289-12889/com.test.example E/v8: # # Fatal error in , line 0 # 2019-08-09 13:14:56.699 12289-12889/com.test.example E/v8: ignored 2019-08-09 13:14:56.699 12289-12889/com.test.example E/v8: # # # #FailureMessage Object: 0x7653f00980 2019-08-09 13:14:57.475 12289-12889/com.test.example A/libc: Fatal signal 5 (SIGTRAP), code 1 in tid 12889 (ThreadPoolForeg)
完整崩溃报告
2019-08-09 18:59:24.132 7226-7294/? A/libc: Fatal signal 5 (SIGTRAP), code 1 in tid 7294 (ThreadPoolForeg) 2019-08-09 18:59:24.187 8393-8393/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: Build fingerprint: 'google/volantis/flounder:7.1.1/N9F27M/4333998:user/release-keys' 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: Revision: '0' 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: ABI: 'arm64' 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: pid: 7226, tid: 7294, name: ThreadPoolForeg >>> com.asite.Adoddle <<< 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0x766c15e768 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: x0 0000000000000000 x1 0000000000000000 x2 0000000000000000 x3 0000000000000003 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: x4 0000000000000000 x5 0000000000000000 x6 0000007682b23000 x7 0000000000000000 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: x8 0000000000000001 x9 0000000000000001 x10 0000000000004001 x11 0000000000000000 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: x12 0000000000000018 x13 0000000000000000 x14 0000000000000000 x15 00197a22b6e4b5d7 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: x16 000000768204e440 x17 0000007681ff9ccc x18 0000000000015180 x19 00000076693a2587 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: x20 00000076820507c8 x21 ffffff80ffffffc8 x22 0000007659951c00 x23 0000007659951900 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: x24 0000007659951940 x25 00000073b64ef218 x26 00000073b4da46bc x27 00000073b4c5a428 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: x28 00000000fffffbf8 x29 0000007659951bf0 x30 000000766c15d160 2019-08-09 18:59:24.188 8393-8393/? A/DEBUG: sp 0000007659951880 pc 000000766c15e768 pstate 0000000080000000 2019-08-09 18:59:24.191 8393-8393/? A/DEBUG: backtrace: 2019-08-09 18:59:24.196 8393-8393/? A/DEBUG: #00 pc 0000000002ff9768 /data/app/com.android.chrome-1/base.apk (offset 0xc0f000) 2019-08-09 18:59:24.196 8393-8393/? A/DEBUG: #01 pc 0000000002ff815c /data/app/com.android.chrome-1/base.apk (offset 0xc0f000)
问题根源分析
从现象和日志可以明确,崩溃和arm64-v8a架构下的库兼容性直接相关:
- 仅指定
armeabi-v7a时,应用以32位模式运行,调用的是32位WebView及依赖库,不存在兼容性冲突; - 开启
arm64-v8a支持后,应用切换到64位模式,此时Cordova WebView与系统64位WebView(Chrome内核)的交互出现异常,v8引擎的错误日志(E/v8: # # Fatal error in , line 0 #)指向JavaScript引擎层面的崩溃,最终触发了SIGTRAP信号; - 崩溃栈显示问题出在Chrome的base.apk中,说明是系统WebView的64位实现和Cordova的适配存在bug。
可行的解决方案
1. 临时屏蔽arm64-v8a ABI(快速生效)
如果你的应用不需要64位支持,可以直接在build.gradle中仅保留armeabi-v7a,这是最直接的解决方式,和你测试中正常运行的场景一致:
android { defaultConfig { ndk { abiFilters "armeabi-v7a" } } }
2. 升级Cordova及插件版本
旧版本的Cordova Android(尤其是6.x及以下)对64位设备的WebView兼容性支持不足,建议升级到最新稳定版:
- 执行命令升级Cordova Android平台:
cordova platform update android@latest - 检查所有已安装的Cordova插件,更新到支持arm64-v8a的版本,避免插件引入的原生库存在64位兼容问题。
3. 强制WebView以32位模式运行(保留多ABI场景)
如果必须保留多ABI支持,但希望WebView以32位运行,可以尝试在AndroidManifest.xml的<application>标签下添加以下meta-data:
<!-- 禁用WebView的64位模式(部分Android版本支持) --> <meta-data android:name="android.webkit.WebView.Enable64Bit" android:value="false" />
注意:这个属性并非所有Android版本都支持,需要在目标设备上测试验证。
4. 定位具体JS触发的崩溃
如果想找到具体是哪部分网页内容导致崩溃,可以利用你已经开启的WebView远程调试:
- 使用Chrome浏览器访问
chrome://inspect,连接设备后调试对应的WebView; - 逐步禁用JavaScript、图片加载等功能,排查是否是特定的JS代码或资源触发了v8引擎崩溃。
内容的提问来源于stack exchange,提问作者Mayur Raval
相关产品推荐
相关产品推荐

