解决 Android WebView 多进程导致App崩溃

news2024/11/25 16:24:42

应用场景

应用内有两个位置用到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, Ia06b22fa1a
   Build Date                       : 10/04/21
   OpenGL ES Shader Compiler Version: EV031.32.02.16
   Local 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 WebView
   java.lang.Throwable
    at 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 600f0010

backtrace:
#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 = false
                    if (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-dirs
            if (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 ActivityManager
        val runningApps = am.runningAppProcesses ?: return null
        for (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多进程崩溃的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46945.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]SSM计算机毕业设计校园征兵及退役复原管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

ABAQUS学习之路

ABAQUS入门 首先看模块 1、部件——类似建模 2、属性——给零件添加材料属性 3、装配 4、分析步—— 5、相互作用——创建接触&#xff08;摩擦力&#xff09; 6、载荷——预定义场&#xff08;温度场、力场&#xff09;、边界条件 7、网络——划分网格 8、优化&#…

Libvirt Java API操作QEMU虚拟机(重启,强制关机,挂起,恢复,详情,关机,注销,快照备份等 )(CentOS)

需求背景 有个产品需求&#xff0c;需要在一台linux上装多个虚拟机&#xff0c;然后每个虚拟机单独部署一个产品&#xff0c;然后需要虚拟机的一个产品去控制宿主机中安装虚拟机的状态 注意&#xff1a; 如果虚拟机中装的产品去连宿主机的Libvirt服务&#xff0c;那么虚拟机一…

LeetCode530.二叉搜索树的最小绝对差 501二叉搜索树中的众数 236二叉树的最近公共祖先

文章目录530二叉搜索树的最小绝对差c代码实现python 代码实现501二叉搜索树中的众数c 代码实现python 代码实现236二叉树的最近公共祖先c代码实现python代码实现530二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差…

运维行业数字化维修数据屏来袭

说起维修数字化&#xff0c;售后维保管理&#xff0c;大家必然想到青鸟云报修&#xff0c;今天我给大家呈现一下青鸟云报修数据大屏是怎么一回事。 这是青鸟云报修第三代数据大屏&#xff0c;在2代基础上增加了更多板块&#xff0c;更加专业和智能化&#xff0c;他主要应用于单…

Unity ab包加载文本 puerts 自定义loader

输出ab包 他会把你创建的ab包都打包 也就是在这里的创建的 string assetBundleDirectory Path.Combine(Application.streamingAssetsPath, "OutAssetBundles"); if (!Directory.Exists(assetBundleDirectory)) {Directory.CreateDirectory(assetBundleDirectory);…

2022/11/28-29总结

刷题 统计2021年10月每个退货率不大于0.5的商品各项指标_牛客题霸_牛客网 思路 主要就是sum函数、round函数、date_format函数 代码实现 select product_id, round(sum(if_click)/count(*),3) ctr, round(sum(if_cart)/sum(if_click),3) cart_rate, round(sum(if_payment)…

大二学生JavaScript实训大作业——动漫秦时明月7页 期末网页制作 HTML+CSS+JavaScript 网页设计实例 企业网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

【JavaScript预解析】

JavaScript预解析1 本节目标2 预解析3 变量预解析和函数预解析4 预解析案例1 本节目标 知道解析器运行JS分为哪两步说出变量提升的步骤和运行过程说出函数提升的步骤和运行过程 2 预解析 JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行Java…

技术解读倚天 ECS 实例 — Arm 芯片的 Python-AI 算力优化

深度学习技术在图像识别、搜索推荐等领域得到了广泛应用。近年来各大 CPU 厂商也逐渐把 AI 算力纳入了重点发展方向&#xff0c;通过《Arm 芯片 Python-AI 算力优化》我们将看到龙蜥社区 Arm 架构 SIG&#xff08;Special Interest Group&#xff09; 利用最新的 Arm 指令集优化…

分析实时云渲染在小程序中可行性应用

点量云小芹和大家分享过很多实时云渲染的优势&#xff0c;比如在网页直接打开&#xff0c;本地无需任何算力支持&#xff0c;所有指令的执行均是在云端服务器上完成的。但在实际中小芹发现很多业主也想在小程序给用户更好的体验&#xff0c;尤其是一些To C的场景下&#xff0c;…

【新知实验室 认识TRTC+四步跑通音视频demo】

1【产品功能介绍】 1.1 什么是TRTC&#xff1f; 实时音视频&#xff08;Tencent RTC &#xff09;是腾讯基于21年来在网络与音频技术上的深度积累&#xff0c;以多人音视频通话和低延时互动直播两大场景化方案&#xff0c;通过腾讯云服务向开发者开放&#xff0c;致力于帮助开…

LabVIEW创建类 2

LabVIEW创建类 2 定义私有数据控件 创建LabVIEW类时&#xff0c;LabVIEW将自动创建类的私有数据控件。请注意在下列项目浏览器窗口中&#xff0c;LabVIEW类的图标是一个有色立方体。该立方体用于代表一个LabVIEW类。私有数据控件的图标是一个带有绿色圆柱体的有色立方体。圆柱…

SpringCloud 从入门到入土

springcloud包含的模块&#xff1a; 1、服务注册与发现 2、服务调用 3、服务熔断 4、负载均衡 5、服务降级 6、服务消息队列 7、配置中心管理 8、服务网关 9、服务监控 10、全链路追踪 11、自动化构建部署 12、服务定时任务调度操作 版本控制留样 重点技术选型&am…

ConstraintLayout布局扩展

相信大家对ConstraintLayout&#xff08;约束布局&#xff09;不陌生,这是google推出的一个强大控件&#xff0c;之所以强大其实主要归纳有两点&#xff1a;减少布局层次&#xff0c;能够轻松实现复杂布局。当然在我们实际使用过程中&#xff0c;是否真的减少了布局层次&#x…

一种亮红色染料AF 594 NHS Ester|295348-87-7|AF 594 Succinimidyl Ester

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a; CAS号&#xff1a;295348-87-7 中文名&#xff1a;AF 594活性酯 英文名&#xff1a;AF 594 Succinimidyl Ester&#xff0c;Alexa Fluor 594 NHS Ester&#xff0c;AF 594 NHS Ester 光谱图&#xff08;Sp…

低代码助力生产管理:ERP生产管理系统

随着国内生产技术的迅速发展&#xff0c;企业信息化实现了生产经营活动的运营自动化、管理网络化和决策智能化。其中运营自动化是基础&#xff0c;决策智能化是顶峰。将信息化应用于生产管理有助于提高产品的质量和生产效率&#xff0c;加强对原材料、生产工序、员工、设备和产…

第三十九篇 自定义指令 - directive

前面讲了关于在Vue中如何来进行封装swiper组件的内容&#xff0c;本篇内容讲到使自定义组件&#xff0c;讲这块内容也是同样为了后续再次回顾封装swiper组件变化做铺垫内容&#xff0c;那么什么是自定义指令&#xff0c;在前面的内容讲过了好些常用的指令&#xff0c;如 v-modl…

记录--两行CSS让页面提升了近7倍渲染性能!

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 对于前端人员来讲&#xff0c;最令人头疼的应该就是页面性能了&#xff0c;当用户在访问一个页面时&#xff0c;总是希望它能够快速呈现在眼前并且是可交互状态。如果页面加载过慢&#xff0c;你…

衡师11月月赛web题目wp

目录 1.丢三落四的学姐 2.wep&#xff1f;Pwn&#xff01;&#xff01;&#xff01; 这题web部分是buuctf中的DASCTF X GFCTF 2022十月挑战赛&#xff01;的原题 1.丢三落四的学姐 访问题目位置&#xff0c;很明显的phpstudy搭建的痕迹 访问一下经常信息泄露的几个文件&…