欢迎来到天天文库
浏览记录
ID:11591338
大小:375.50 KB
页数:47页
时间:2018-07-12
《androidwebview启动chromium渲染引擎的过程分析》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、AndroidWebView启动Chromium渲染引擎的过程分析AndroidWebView加载了Chromium动态库之后,就可以启动Chromium渲染引擎了。Chromium渲染引擎由Browser、Render和GPU三端组成。其中,Browser端负责将网页UI合成在屏幕上,Render端负责加载网页的URL和渲染网页的UI,GPU端负责执行Browser端和Render端请求的GPU命令。本文接下来详细分析Chromium渲染引擎三端的启动过程。AndroidWebView使用了单进程架构的Chromium来加载和渲染网页,因此它的Browser
2、端、Render端和GPU端都不是以进程的形式存在的,而是以线程的形式存在。其中,Browser端实现在App的UI线程中,Render端实现在一个独立的线程中,而GPU端实现在App的RenderThread中。注意,这是针对Android5.0及以上版本的。Android在4.4版本引入基于Chromium实现的WebView,那时候GPU端与Browser一样,都是实现在App的UI线程中。接下来我们只讨论AndroidWebView在Android5.0及以上版本的实现。AndroidWebView启动Chromium渲染引擎三端的过程如图1所示:从前
3、面一文可以知道,当我们在App的UI中嵌入一个WebView时,WebView会在内部创建一个类型为WebViewChromium的Provider。AndroidWebView就是通过这个Provider来启动和使用Chromium渲染引擎的。Chromium里面有一个android_webview模块。这个模块提供了两个类AwBrowserProcess和AwContents,分别用来封装Chromium的Content层提供的两个接口类BrowserStartupController和ContentViewCore,它们分别用来启动Chromium的Br
4、owser端和Render端。AndroidWebView启动Chromium的Browser端,实际上就是在App的UI线程创建一个BrowserMainLoop。Chromium以后需要请求Browser端执行某一个操作时,就可以向这个BrowserMainLoop发送一个Task。这个Task最终会在App进程的UI线程中调度执行。AndroidWebView启动Chromium的Render端,实际上就是在当前的App进程中创建一个线程。以后网页就由这个线程负责加载和渲染。这个线程称为In-ProcessRendererThread。由于Chromiu
5、m的GPU端实现在App的RenderThread中,这个RenderThread是由App负责启动的,因此Chromium无需启动它。不过,Chromium里的android_webview模块会启动一个DeferredGpuCommandService服务。当Chromium的Browser端和Render端需要执行GPU操作时,就会向DeferredGpuCommandService服务发出请求。这时候DeferredGpuCommandService服务又会通过App的UI线程将请求的GPU操作提交给App的RenderThread执行。这一点可以参考
6、前面一文的描述。我们在接下来的一篇文章也会对Chromium的Browser端和Render端执行GPU操作的过程进行详细的分析。接下来我们就结合源码,分析AndroidWebView启动Chromium的Browser端和Render端的过程。对于GPU端,我们仅仅分析与它相关的DeferredGpuCommandService服务的启动过程。在接下来一篇文章分析AndroidWebView执行GPU命令的过程时,我们再对GPU端进行更详细的分析。我们首先分析AndroidWebView启动Chromium的Browser端的过程。前面提到,WebView会
7、在内部创建一个类型为WebViewChromium的Provider。有了这个Provider之后,WebView就可以调用它的成员函数init启动Chromium的Browser端,如下所示:[java]viewplaincopyclassWebViewChromiumimplementsWebViewProvider,WebViewProvider.ScrollDelegate,WebViewProvider.ViewDelegate{......publicvoidinit(finalMapjavaScriptInterfa
8、ces,finalbooleanpri
此文档下载收益归作者所有