应用场景

应用内有两个位置用到WebView加载页面,具体处理逻辑不能通用。分别扩展了WebView了。应用内独立页面使用Fragment来展示,(采用单Activity架构)。应用提供切换语言功能。

问题猜想

一、WebView内核bug

具体路径:
进入app–>设置-切换语言(应用界面重新加载)-再次进入设置->跳转到WebViewFragment展示H5。随便操作滑动。退出到上一页。重复该操作,会引发应用crash

MI 10 输出error 日志。

] Failed to create directory: /data/user/0/com.codeview.miniparty/cache/WebView/Default/HTTP Cache/Code Cache/js
D  Compat change id reported: 171228096; UID 10728; state: ENABLED
I  QUALCOMM build                   : db3d445dbc, Ia06b22fa1aBuild Date                       : 10/04/21OpenGL ES Shader Compiler Version: EV031.32.02.16Local Branch                     : Remote Branch                    : Remote Branch                    : Reconstruct Branch               :
I  Build Config                     : S P 10.0.7 AArch64
I  Driver Path                      : /vendor/lib64/egl/libGLESv2_adreno.so
W  Application attempted to call on a destroyed WebViewjava.lang.Throwableat org.chromium.android_webview.AwContents.m(chromium-TrichromeWebViewGoogle6432.aab-stable-530410534:10)at com.android.webview.chromium.WebViewChromium.addJavascriptInterface(chromium-TrichromeWebViewGoogle6432.aab-stable-530410534:25)at android.webkit.WebView.addJavascriptInterface(WebView.java:1928)at miui.contentcatcher.sdk.utils.WebViewUtils$NativeWebViewUtils.addJavascriptInterface(WebViewUtils.java:244)at miui.contentcatcher.sdk.utils.WebViewUtils.initWebViewJsInterface(WebViewUtils.java:157)at miui.contentcatcher.InterceptorProxy$1.run(InterceptorProxy.java:193)at android.os.Handler.handleCallback(Handler.java:938)at android.os.Handler.dispatchMessage(Handler.java:99)at android.os.Looper.loopOnce(Looper.java:210)at android.os.Looper.loop(Looper.java:299)at android.app.ActivityThread.main(ActivityThread.java:8293)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)

网上找到chrome 官方issue问题。
https://bugs.chromium.org/p/chromium/issues/detail?id=558377
该问题一直追踪到2021年也并没有给出具体的解决方案。

二 快速操作界面开关,导致WebView异常,引发应用闪退

在红米K40上(Android 12)显示

Build fingerprint: 'Verizon/kltevzw/kltevzw:5.0/LRX21T/G900VVRU2BOE1:user/release-keys'
Revision: '14'
ABI: 'arm'
pid: 30968, tid: 30968, name: com.myapp >>> com.myapp <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: '[FATAL:jni_android.cc(295)] Check failed: false. Please include Java exception stack in crash report
'
r0 00000000 r1 000078f8 r2 00000006 r3 00000000
r4 b6f5c114 r5 00000006 r6 0000000b r7 0000010c
r8 b6f3be04 r9 bec21408 sl 00000000 fp bec213cc
ip 000078f8 sp bec20ee0 lr b6ee5fd1 pc b6f09970 cpsr 600f0010backtrace:
#00 pc 00037970 /system/lib/libc.so (tgkill+12)
#01 pc 00013fcd /system/lib/libc.so (pthread_kill+52)
#02 pc 00014beb /system/lib/libc.so (raise+10)
#03 pc 00011531 /system/lib/libc.so (__libc_android_abort+36)
#04 pc 0000fcbc /system/lib/libc.so (abort+4)
#05 pc 002a7569 /data/app/com.google.android.webview-2/lib/arm/libwebviewchromium.so

这个问题在stackoverflows上找到另一个解决方案
https://stackoverflow.com/questions/31416568/could-someone-help-me-with-this-crash-report

这个问题更像是应用内使用的场景,webView在Fragment中,快速打开关闭Fragment导致应用Crash。

在Application的AccachBaseContext(base:Context)中进行处理multiProcess

    override fun attachBaseContext(base: Context?) {super.attachBaseContext(base)WebViewMultiProcessPatch.apply {setDirectorySuffix(isSameProcess(this@SkyCastleApplication),getProcessName(this@SkyCastleApplication))}}

新建一个WebViewMultiProcessPatch单例,用来做一些逻辑判断

/*** * Date:   2022/11/29 19:00* Description:多进程闪退*/object WebViewMultiProcessPatch {/*** fix:Using WebView from more than one process at once with the same data directory is not supported* https://www.yisu.com/zixun/445583.html*/fun tryLockOrRecreateFile(context: Context, processName: String) {val filePath =context.dataDir.absolutePath + "/${processName}/app_webview/webview_data.lock"File(filePath).let {if (it.exists()) {try {val tryLock = RandomAccessFile(it, "rw").channel.tryLock()if (tryLock != null) {tryLock.close()} else {createLockFile(it, it.delete())}} catch (e: Exception) {e.printStackTrace()var delete = falseif (it.exists()) {delete = it.delete()}createLockFile(it, delete)}}}}private fun createLockFile(file: File, delete: Boolean) {try {if (delete && !file.exists()) {file.createNewFile()}} catch (e: Exception) {e.printStackTrace()}}/*** fix:Using WebView from more than one process at once with the same data directory is not supported* https://www.jianshu.com/p/f3ccc065f632*/fun setDirectorySuffix(isSameProcess: Boolean, processName: String?) {if (!isSameProcess) {//see https://developer.android.google.cn/about/versions/pie/android-9.0-changes-28#web-data-dirsif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !processName.isNullOrBlank()) {WebView.setDataDirectorySuffix(processName)}}}fun isSameProcess(context: Context): Boolean {return getProcessName(context) == getPackageName(context)}fun getProcessName(cxt: Context): String? {val pid = Process.myPid()val am = cxt.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManagerval runningApps = am.runningAppProcesses ?: return nullfor (procInfo in runningApps) {if (procInfo.pid == pid) {return procInfo.processName}}return null}private fun getPackageName(context: Context): String? {return context.packageName}}

总结

Android 不仅需要对不同品牌的设备适配,还需要针对不同的系统版本做适配。会有比较多的问题定位不到具体原因。这种情况不但要平时多多积累,更好掌握解决问题的方案。

引用

  1. Android webView
  2. Android 9.0 行为变更
  3. Android如何解决WebView多进程崩溃的问题

解决 Android WebView 多进程导致App崩溃相关推荐

  1. android webview 设置cookie时间,解决Android webview设置cookie和cookie丢失的问题

    Android页面嵌套了一个h5,H5页面内部有用户登陆页面,发现h5页面的登陆功能无法使用,一直登陆失败.和web那边商量一会,发现js写入的cookie丢失了.所有需要Android这边在重写写入 ...

  2. (转)完美解决 Android WebView 文本框获取焦点后自动放大有关问题

    完美解决 Android WebView 文本框获取焦点后自动放大问题 前几天在写一个项目时,要求在项目中嵌入一个WebView 本来很快就完成了,测试也没有问题.但发给新加坡时,他们测试都会出现文本 ...

  3. android webview anr,Android WebView客户端导致ANR

    我正在实现一个客户端库到OAUTH API.在认证过程中,webview客户端会启动并加载认证页面的URL.但是,webview客户端有时可以正确启动,但最近开始导致ANR.Android WebVi ...

  4. android资源加载失败,解决Android WebView拦截url,视频播放加载失败的问题

    解决Android WebView拦截url,视频播放加载失败的问题 发布时间:2020-10-08 05:19:44 来源:脚本之家 阅读:86 作者:灵均子孟 需求:Android调用webVie ...

  5. Swift 伪原子并发同步代码引起 DispatchGroup.leave() 方法不平衡调用导致 App 崩溃的解决

    文章目录 问题现象 问题分析 1. 失踪的真机崩溃日志 2. Xcode 通过崩溃日志快速定位出错代码位置 3. 并发代码不平衡调用 DispatchGroup.leave() 的根本原因 4. &q ...

  6. 完美解决 Android WebView 文本框获取焦点后自动放大问题

    前几天在写一个项目时,要求在项目中嵌入一个WebView 本来很快就完成了,测试也没有问题.但发给新加坡时,他们测试都会出现文本框聚焦时,网页面会放大(他们用三星手机测试的) 网上查了好久参考他的方法 ...

  7. Android长时间后台运行,内存被回收再次打开导致APP崩溃(APP在后台被系统回收后,如何重新启动?)

    问题: 因为手机内存不足的时候,会回收一些APP所占内存,如果被回收的APP中有全局变量,那么再次进入这个APP就会导致异常报错: 原因: 因为Application是全局变量,内存不足的时候会被回收 ...

  8. 关于Android切换系统字体大小和字体样式导致App崩溃或者界面错乱的问题

    一.发现问题 问题:最近公司测试同学,在无意间调整系统字体大小的之后把app从后台切换到前台,发现app crash. 查阅了一些资料,发现在app中文字标注的单位为sp.当系统字体大小发生变化的时候 ...

  9. 解决android WebView无法唤起其他app

    最近有个需求需要开机页添加taobao的广告.这个广告会唤起taobao的app.测试发现应用内的webview无法唤起taobao的app.但是一些浏览器是可以.同时我发现不同的浏览器唤起app的提 ...

最新文章

  1. 转载模板声明中template typename T和template class T
  2. 基于.htaccess的Web Shell工具htshells
  3. Django框架(二)
  4. Linux IO磁盘篇整理小记
  5. ASP.NET Core Web程序托管到Windows 服务
  6. 敏捷开发日常跟进系列之一:燃尽图(上)
  7. c++中变量名和变量值
  8. 模拟退火算法及MATLAB代码
  9. pmp华为内部资料,成功的项目管理是怎样的?
  10. 微信公众平台开发(1)--账号注册流程图文详解
  11. 网页无法复制文字,一个插件解决问题!!!!
  12. linux达梦服务重启,如何重启达梦数据库服务
  13. SNAT/DNAT/MASQUERADE
  14. 统计学之离散指标(全距、内距、异众比率、平均差与标准差)
  15. Oracle 19c升级路径与QA
  16. B. Petya and Exam
  17. 如何将拉勾网(智联招聘)的预览简历导出来
  18. java excel 分页合并_Excel办公技巧——完整显示跨页合并的单元格
  19. 红米RM-AX6000 SWRT固件/刷机教程 支持fullcone
  20. 【新人入门】HTML——前端纯小白新手入门

热门文章

  1. 小程序入门案例某大妈sign
  2. excel中用正则匹配_excel 利用正则表达式匹配工作表中的数据
  3. vue.js中DES、RSA、SHA1、MD5这四种加密算法的使用
  4. 一个男人的日记片断,笑翻了
  5. 太赫兹安检“无形检测”时代已经来临
  6. 定增保底方式与纠纷案例
  7. 进化吧,鲲鲲(C++)
  8. 【让你五行代码发一篇文章】如何把DNA序列编码成深度学习的向量化输入——GP-GCN框架教程
  9. 企业微信通讯录回调请求验证及接收
  10. zabbix 监控 tomcat 客户端 12345端口不能启动解决办法