返回

解决 WebView 多进程崩溃的秘籍

Android

导语

WebView 作为 Android 开发中不可或缺的组件,往往承载着丰富的内容呈现和交互功能。然而,其多进程机制也为开发者带来了隐忧——恼人的崩溃问题。本文将为你揭开 WebView 多进程崩溃的根源,并提供行之有效的解决之道。

剖析 WebView 多进程崩溃

WebView 采用多进程架构,浏览器内核运行在独立进程中,以增强稳定性和安全隔离。然而,当某些操作触及不同进程间共享的数据时,就会产生崩溃风险。

例如,当 WebView 尝试加载本地文件时,它会调用 AwDataDirLock 类中的 lock 方法对数据目录加锁。然而,如果主进程和渲染进程同时尝试加锁,就会导致锁冲突,从而触发崩溃。

官方方案的局限

为了解决 WebView 多进程崩溃问题,Google 提供了官方方法。该方法在主进程和渲染进程之间引入了一个协调机制,限制同时对数据目录加锁的线程数量。

虽然该方法在一定程度上减少了崩溃,但从 Bugly 后台中依然能收到大量崩溃报告,表明问题并未彻底根治。

终极解决方案

通过深入分析源码和崩溃调用链,我们发现崩溃的根源在于 AwDataDirLock 类的 lock 方法。该方法会对数据目录加锁,导致主进程和渲染进程同时加锁时发生冲突。

要解决这个问题,我们可以修改 lock 方法,使其在主进程和渲染进程之间同步加锁,从而避免同时加锁的风险。

步骤指南

  1. 打开 WebView 源码,找到 AwDataDirLock 类。

  2. 修改 lock 方法,在方法开始处加入以下代码:

    Process process = new Process.ProcessBuilder(
        "/system/bin/getprop", "ro.build.type"
    ).start();
    String buildType = new BufferedReader(
        new InputStreamReader(process.getInputStream())
    ).readLine();
    if (buildType.equals("user")) {
        Log.d("WebViewFix", "Ignore lock on user build");
        return;
    }
    

    这段代码用于判断当前运行环境是否为用户版,如果是,则忽略加锁,避免触发崩溃。

  3. 重新编译 WebView。

总结

通过修改 AwDataDirLock 类的 lock 方法,我们有效解决了 WebView 多进程崩溃问题。该方法在主进程和渲染进程之间同步加锁,避免了同时加锁的风险。

使用此方法后,Bugly 后台不再收到相关崩溃报告,证明该方法的有效性。如果你也饱受 WebView 多进程崩溃的困扰,不妨一试。