WebView深究之Android是如何实现webview初始化的

本文探讨了Android WebView的初始化过程,从WebView的构造方法开始,详细阐述了线程检查、WebViewProvider的选择与初始化,以及如何加载Chromium动态库。在Android 5.0后,WebView内核更改为Chromium,通过工厂模式实现与上层代码的解耦。在初始化过程中,系统通过XML配置文件确定WebView包信息,并加载对应动态库,利用JNI技术加载并共享GNU_RELRO Section以节省内存。
摘要由CSDN通过智能技术生成

webview初始化

关注Android加载webview内核的过程。我们从WebView的init过程中切入。
WebView的构造方法,最终都会调用

WebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes,
            Map<String, Object> javaScriptInterfaces, boolean privateBrowsing)

这个方法,这个方法做了如下几个事情:

  1. 线程检查
  2. Provider类的选择
  3. Provider类的初始化
  4. Cookie相关的处理

线程检查是为了保证WebView在同一个线程中进行创建,暂时不深究。把主要的经历放在Provider相关的逻辑。

mProvider是WebView中一个成员变量,类型是WebViewProvider.实际上,我们可以发现WebView所有的逻辑处理都是通过WebViewProvider来实现的,例如:

load(String url)方法的源码实现是

public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
        checkThread();
        mProvider.loadUrl(url, additionalHttpHeaders);
}

WebViewProvider实际是一个interface
进入源码,他包括了大部分WebView中的同名方法。包括loadUrl,reload,goBack等。所以他是WebView的真正能力提供者。

查看源码ensureProviderCreated()方法

mProvider = getFactory().createWebView(this, new PrivateAccess());

getFactory的具体实现是

private static synchronized WebViewFactoryProvider getFactory() {
        return WebViewFactory.getProvider();
}

这一步是为了确定WebViewProvider的子类,Provider的构造根据WebViewFactory类确定。Android在5.0后将webview内核从webkit换成了chromium,这里使用工厂模式可以将内核实现反射和上层初始化的代码解耦

我们选取getProvider()方法中的核心逻辑进行分析

try {
    Class<WebViewFactoryProvider> providerClass = getProviderClass();

    Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "providerClass.newInstance()");
        try {
            sProviderInstance = providerClass.getConstructor(WebViewDelegate.class)
            .newInstance(new WebViewDelegate());
            return sProviderInstance;
        } catch (Exception e) {
        } finally {
        }
    finally {
    }
}

有些版本的实现为

try {
    Class<WebViewFactoryProvid
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值