Android 9 WebView运行20小时出现双实例异常问题求助
问题记录
基于Ionic Cordova框架运行Angular 10.2.5版本项目时,在Android 9系统WebView环境下可复现以下异常:
- 程序持续运行20小时左右,会自动生成重复WebView实例,最终出现双WebView实例同时运行的异常表现
- 异常现象截图:

问题排查与修复
该问题已有大量同技术栈开发者反馈,属于Cordova-Android平台在Android 9系统下的典型兼容性问题,和Angular版本无直接关联,核心触发原因及对应修复方案如下:
- 原因1:Activity启动模式配置不兼容
Android 9系统对后台驻留时长超过20小时的应用会触发内存阈值回收,Cordova默认的MainActivity启动模式为standard,系统回收后重新拉起Activity时不会复用原有栈内实例,会新建CordovaWebView实例挂载到新Activity上,原有实例因上下文泄漏未被销毁,最终形成双实例。
修复方法:修改项目AndroidManifest.xml中MainActivity的启动模式为singleTask,参考配置:<activity android:name="MainActivity" android:launchMode="singleTask" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"> <!-- 保留原有其他配置项 --> </activity> - 原因2:低版本cordova-android核心库存在生命周期bug
若项目使用的cordova-android平台版本低于9.1.0,核心库存在WebView生命周期解绑逻辑缺失问题:应用长时间驻留触发WebView重载时,未销毁原有WebView实例就直接创建新实例挂载。
修复方法:升级cordova-android平台到修复版本,执行以下命令:cordova platform rm android cordova platform add android@9.1.0 - 原因3:第三方插件重复唤起Activity
部分集成的推送、后台保活类插件在应用长时间驻留后,会触发Application生命周期二次执行,若插件内置主动唤起Cordova Activity的逻辑,会重复创建WebView实例。
排查方法:在MainActivity的onCreate方法中添加日志打印当前任务栈ID,若出现双实例时两次onCreate打印的栈ID不一致,即可定位为插件触发的重复启动,给对应插件添加重复启动拦截逻辑即可。
内容的提问来源于stack exchange,提问作者Naor Yael
相关产品推荐
相关产品推荐

