webview初始化
关注Android加载webview内核的过程。我们从WebView的init过程中切入。
WebView的构造方法,最终都会调用
WebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes,
Map<String, Object> javaScriptInterfaces, boolean privateBrowsing)
这个方法,这个方法做了如下几个事情:
- 线程检查
- Provider类的选择
- Provider类的初始化
- 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