ImageVerifierCode 换一换
格式:DOCX , 页数:58 ,大小:143.93KB ,
资源ID:5012813      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5012813.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Android WebView启动Chromium渲染引擎的过程分析.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Android WebView启动Chromium渲染引擎的过程分析.docx

1、Android WebView启动Chromium渲染引擎的过程分析Android WebView启动Chromium渲染引擎的过程分析 Android WebView加载了Chromium动态库之后,就可以启动Chromium渲染引擎了。Chromium渲染引擎由Browser、Render和GPU三端组成。其中,Browser端负责将网页UI合成在屏幕上,Render端负责加载网页的URL和渲染网页的UI,GPU端负责执行Browser端和Render端请求的GPU命令。本文接下来详细分析Chromium渲染引擎三端的启动过程。Android WebView使用了单进程架构的Chromiu

2、m来加载和渲染网页,因此它的Browser端、Render端和GPU端都不是以进程的形式存在的,而是以线程的形式存在。其中,Browser端实现在App的UI线程中,Render端实现在一个独立的线程中,而GPU端实现在App的Render Thread中。注意,这是针对Android 5.0及以上版本的。Android在4.4版本引入基于Chromium实现的WebView,那时候GPU端与Browser一样,都是实现在App的UI线程中。接下来我们只讨论Android WebView在Android 5.0及以上版本的实现。 Android WebView启动Chromium渲染引擎三端的

3、过程如图1所示:从前面一文可以知道,当我们在App的UI中嵌入一个WebView时,WebView会在内部创建一个类型为WebViewChromium的Provider。Android WebView就是通过这个Provider来启动和使用Chromium渲染引擎的。 Chromium里面有一个android_webview模块。这个模块提供了两个类AwBrowserProcess和AwContents,分别用来封装Chromium的Content层提供的两个接口类BrowserStartupController和ContentViewCore,它们分别用来启动Chromium的Browser

4、端和Render端。 Android WebView启动Chromium的Browser端,实际上就是在App的UI线程创建一个Browser Main Loop。Chromium以后需要请求Browser端执行某一个操作时,就可以向这个Browser Main Loop发送一个Task。这个Task最终会在App进程的UI线程中调度执行。 Android WebView启动Chromium的Render端,实际上就是在当前的App进程中创建一个线程。以后网页就由这个线程负责加载和渲染。这个线程称为In-Process Renderer Thread。 由于Chromium的GPU端实现在Ap

5、p的Render Thread中,这个Render Thread是由App负责启动的,因此Chromium无需启动它。不过,Chromium里的android_webview模块会启动一个DeferredGpuCommandService服务。当Chromium的Browser端和Render端需要执行GPU操作时,就会向DeferredGpuCommandService服务发出请求。这时候DeferredGpuCommandService服务又会通过App的UI线程将请求的GPU操作提交给App的Render Thread执行。这一点可以参考前面一文的描述。我们在接下来的一篇文章也会对Chr

6、omium的Browser端和Render端执行GPU操作的过程进行详细的分析。 接下来我们就结合源码,分析Android WebView启动Chromium的Browser端和Render端的过程。对于GPU端,我们仅仅分析与它相关的DeferredGpuCommandService服务的启动过程。在接下来一篇文章分析Android WebView执行GPU命令的过程时,我们再对GPU端进行更详细的分析。 我们首先分析Android WebView启动Chromium的Browser端的过程。前面提到,WebView会在内部创建一个类型为WebViewChromium的Provider。有了

7、这个Provider之后,WebView就可以调用它的成员函数init启动Chromium的Browser端,如下所示:java view plain copyclass WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate, WebViewProvider.ViewDelegate . public void init(final Map javaScriptInterfaces, final boolean privateBrowsing) . / We will defer real init

8、ialization until we know which thread to do it on, unless: / - we are on the main thread already (common case), / - the app is targeting = JB MR2, in which case checkThread enforces that all usage / comes from a single thread. (Note in JB MR2 this exception was in WebView.java). if (mAppTargetSdkVer

9、sion = Build.VERSION_CODES.JELLY_BEAN_MR2) mFactory.startYourEngines(false); checkThread(); else if (!mFactory.hasStarted() if (Looper.myLooper() = Looper.getMainLooper() mFactory.startYourEngines(true); . mRunQueue.addTask(new Runnable() Override public void run() initForReal(); . ); . 这个函数定义在文件fra

10、meworks/webview/chromium/java/com/android/webview/chromium/WebViewChromium.java中。 WebViewChromium类的成员变量mFactory指向的是一个WebViewChromiumFactoryProvider对象。WebViewChromium类的成员函数init通过调用这个WebViewChromiumFactoryProvider对象的成员函数startYourEngines启动Chromium渲染引擎的Browser端。 在Android 4.3之前,WebView只能在App的UI线程中创建。相应地,

11、WebView也只能在App的UI线程中启动Chromium渲染引擎的Browser端。这时候WebViewChromium类的成员函数init会传递一个参数true给WebViewChromiumFactoryProvider类的成员函数startYourEngines,表示如果当前线程如果不是UI线程,那么就需要向UI线程发出一个通知,让UI线程执行启动Chromium渲染引擎的Browser端的操作。 在Android 4.3及以后,WebView也允许在App的非UI线程中创建。这时候WebView允行在App的非UI线程中启动Chromium渲染引擎的Browser端。因此,WebV

12、iewChromium类的成员函数init就会传递一个参数false给WebViewChromiumFactoryProvider类的成员函数startYourEngines。 一般情况下,WebView都是在App的UI线程中创建的。为了简单起见,我们只考虑这种情况。WebViewChromium类的成员函数init调用WebViewChromiumFactoryProvider类的成员函数startYourEngines启动了Chromium渲染引擎的Browser端之后,接下来还会向App的UI线程的消息队列发送一个Runnable。当该Runnable被执行的时候,它就会调用WebVi

13、ewChromium类的成员函数initForReal创建图1所示的AwContents对象。有了这个AwContents对象之后,后面就可以通过它来加载指定的URL了。 接下来,我们首先分析WebViewChromiumFactoryProvider类的成员函数startYourEngines启动Chromium渲染引擎的Browser端的过程,然后再分析WebViewChromium类的成员函数initForReal为WebView创建AwContents对象的过程。 WebViewChromiumFactoryProvider类的成员函数startYourEngines的实现如下所示:j

14、ava view plain copypublic class WebViewChromiumFactoryProvider implements WebViewFactoryProvider . void startYourEngines(boolean onMainThread) synchronized (mLock) ensureChromiumStartedLocked(onMainThread); . 这个函数定义在文件frameworks/webview/chromium/Java/com/android/webview/chromium/WebViewChromiumFacto

15、ryProvider.java中。 WebViewChromiumFactoryProvider类的成员函数startYourEngines调用另外一个成员函数ensureChromiumStartedLocked检查Chromium渲染引擎的Browser端是否已经启动。如果还没有启动,那么就会进行启动,如下所示:java view plain copypublic class WebViewChromiumFactoryProvider implements WebViewFactoryProvider . private void ensureChromiumStartedLocked(

16、boolean onMainThread) . if (mStarted) / Early-out for the common case. return; Looper looper = !onMainThread ? Looper.myLooper() : Looper.getMainLooper(); . ThreadUtils.setUiThread(looper); if (ThreadUtils.runningOnUiThread() startChromiumLocked(); return; / We must post to the UI thread to cover th

17、e case that the user has invoked Chromium / startup by using the (thread-safe) CookieManager rather than creating a WebView. ThreadUtils.postOnUiThread(new Runnable() Override public void run() synchronized (mLock) startChromiumLocked(); ); while (!mStarted) try / Important: wait() releases |mLock|

18、the UI thread can take it :-) mLock.wait(); catch (InterruptedException e) / Keep trying. eventually the UI thread will process the task we sent it. . 这个函数定义在文件frameworks/webview/chromium/java/com/android/webview/chromium/WebViewChromiumFactoryProvider.java中。 如果Chromium渲染引擎的Browser端已经启动,那么WebViewChr

19、omiumFactoryProvider类的成员变量mStarted的值就会等于true。在这种情况下,WebViewChromiumFactoryProvider类的成员函数ensureChromiumStartedLocked什么也不用做就可以返回。 另一方面,如果Chromium渲染引擎的Browser端还没有启动,那么WebViewChromiumFactoryProvider类的成员函数ensureChromiumStartedLocked首先会根据参数onMainThread确定Chromium渲染引擎的Browser端要在哪个线程中运行。 当参数onMainThread的值等于t

20、rue的时候,就表示Chromium渲染引擎的Browser端要在App的UI线程中运行。这时候如果当前线程不是App的UI线程,那么WebViewChromiumFactoryProvider类的成员函数ensureChromiumStartedLocked就会向App的UI线程的消息队列发送一个Runnable。当该Runnable被执行的时候,才会启动Chromium渲染引擎的Browser端。在这种情况下,当前线程也会等待App的UI线程启动完成Chromium渲染引擎的Browser端。 当参数onMainThread的值等于true的时候,如果当前线程刚好也是App的UI线程,那么

21、WebViewChromiumFactoryProvider类的成员函数ensureChromiumStartedLocked就可以马上启动Chromium渲染引擎的Browser端。 当参数onMainThread的值等于false的时候,不管当前线程是否App的UI线程,都表示Chromium渲染引擎的Browser端要在它里面运行。因此,这时候WebViewChromiumFactoryProvider类的成员函数ensureChromiumStartedLocked都会马上启动Chromium渲染引擎的Browser端。 无论是上述的哪一种情况,用来运行Chromium渲染引擎的Bro

22、wser端的线程都会通过调用ThreadUtils类的静态成员函数setUiThread记录起来。以后WebView都需要在该线程中访问Chromium渲染引擎。 WebViewChromiumFactoryProvider类的成员函数ensureChromiumStartedLocked是通过调用另外一个成员函数startChromiumLocked启动Chromium渲染引擎的Browser端的,如下所示:java view plain copypublic class WebViewChromiumFactoryProvider implements WebViewFactoryProv

23、ider . private void startChromiumLocked() . AwBrowserProcess.start(ActivityThread.currentApplication(); . . 这个函数定义在文件frameworks/webview/chromium/java/com/android/webview/chromium/WebViewChromiumFactoryProvider.java中。 WebViewChromiumFactoryProvider类的成员函数startChromiumLocked通过调用AwBrowserProcess类的静态成员函数

24、start启动Chromium渲染引擎的Browser端的,如下所示:java view plain copypublic abstract class AwBrowserProcess . public static void start(final Context context) / We must post to the UI thread to cover the case that the user / has invoked Chromium startup by using the (thread-safe) / CookieManager rather than creati

25、ng a WebView. ThreadUtils.runOnUiThreadBlocking(new Runnable() Override public void run() try BrowserStartupController.get(context).startBrowserProcessesSync( BrowserStartupController.MAX_RENDERERS_SINGLE_PROCESS); . catch (ProcessInitException e) . ); . 这个函数定义在文件external/chromium_org/android_webvie

26、w/java/src/org/chromium/android_webview/AwBrowserProcess.java中。 前面提到,用来运行Chromium渲染引擎的Browser端的线程会通过ThreadUtils类的静态成员函数setUiThread记录起来。AwBrowserProcess类的静态成员函数start为了确保Chromium渲染引擎的Browser端在该线程中启动,会通过调用ThreadUtils类的静态成员函数runOnUiThreadBlocking检查当前线程是否就是该线程。如果是的话,那么就会直接启动。否则的话,会向该线程的消息队列发送一个Runnable。当

27、该Runnable被执行的时候,再启动Chromium渲染引擎的Browser端。 AwBrowserProcess类的静态成员函数start是通过调用当前App进程中的一个BrowserStartupController单例对象的成员函数startBrowserProcessesSync来启动Chromium渲染引擎的Browser端的。这个BrowserStartupController单例对象可以通过调用BrowserStartupController类的静态成员函数get获得。 AwBrowserProcess类的静态成员函数start在启动Chromium渲染引擎的Browser端的

28、时候,会指定一个BrowserStartupController.MAX_RENDERERS_SINGLE_PROCESS参数。这个参数的值等于0,表示要启动一个单进程架构的Chromium渲染引擎。 接下来,我们就继续分析Chromium渲染引擎的Browser端的启动过程,也就是BrowserStartupController类的成员函数startBrowserProcessesSync的实现,如下所示:java view plain copypublic class BrowserStartupController . public void startBrowserProcessesS

29、ync(int maxRenderers) throws ProcessInitException / If already started skip to checking the result if (!mStartupDone) if (!mHasStartedInitializingBrowserProcess) prepareToStartBrowserProcess(maxRenderers); . if (contentStart() 0) / Failed. The callbacks may not have run, so run them. enqueueCallback

30、Execution(STARTUP_FAILURE, NOT_ALREADY_STARTED); . . 这个函数定义在文件external/chromium_org/content/public/android/java/src/org/chromium/content/browser/BrowserStartupController.java中。 当BrowserStartupController类的成员变量mStartupDone的值等于true的时候,就表示Chromium渲染引擎的Browser端已经启动了。这时候BrowserStartupController类的成员函数startBrowserProcessesSync就什么也不做就直接返回。 另一方面,如果Chromium渲染引擎的Browser端还没有启动。这时候BrowserStartupController类的成员函数startBrowserProcessesSync就会调用另外一个成员函数contentStart进行启动。 在启动Chromium渲染引擎的Browser端

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1