打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
chromium for android Browser进程创建过程分析
版权

ContentMainDelegate是客户端程序注册给content_main_runner.cc的回调接口,
content_main_runner.cc通过调用ContentMainDelegate的接口来通知客户端
当前Content框架的状态。
客户端程序通过ContentMainDelegate::RegisterApplicationNativeMethods接口
注册自己的本地方法。
ContentMainDelegate中的有四个函数:
CreateContentBrowserClient();
CreateContentPluginClient();
CreateContentRendererClient();
CreateContentUtilityClient();
用来分别创建ContentBrowserClient,ContentPlunginClient,ContentRendererClient,
ContentUtilityClient的实例。

ContentMainDelegate的注册过程如下:

虚拟机在动态库加载完成后调用全局函数JNI_OnLoad,定义在chrome_jni_onload.cc中。
JNI_OnLoad调用全局函数RunChrome,定义在chrome_android_initializer.cc中。
RunChrome调用content命名空间的全局函数SetContentMainDelegate()定义在content_main.cc中。
SetContentMainDelegate()将指向ChromeMainDelegateAndroid对象的指针
保存到全局变量g_content_main_delegate中。
content_main.cc的Start方法会构建一个ContentMainRunner的实例,并将变量g_content_main_delegate
传递给ContentMainRunner实例。
content_main_runner.cc中调用ContentMainDelegate中的所有函数。

android平台的chromium框架由ContentMain.java负责初始化所有类型的进程。
content_switches.cc中定义了chromium所有的进程类型,
如BrowserProcess,RendererProcess,PluginProcess,WorkerProcess,UtilityProcess等。
应用程序创建Browser进程的过程如下:

ContentMain.java只有两个方法:
public static void initApplicationContext(Context context);
public static int start();
客户端程序需要先调用initApplicationContext接口,再调用start接口,才会触发Browser进程或Render进程的创建。
ContentMain.java的jni层对应文件是src/content/app/android/content_main.cc.
将ContentMain.java与content_main.cc连接起来的是Chromium自动生成的jni文件:ContentMain_jni.h
Chromium的jni文件的命名规则是java文件名_jni.h.
编译后这个文件位于:src/out/Release/gen/content/jni
ContentMain.java中的两个方法只是简单的调用native层content_main.cc中的全局函数。
content_main.cc中的start函数主要做三件事:
1.创建一个ContentMainRunner实例,实际创建的是继承自ContentMainRunner的ContentMainRunnerImpl,
这个类定义在content_main_runner.cc中;
2.调用ContentMainRunnerImpl实例的Initialize接口,同时将ContentMainDelegate实例传给ContentMainRunnerImpl;
3.调用ContentMainRunnerImpl实例的Run接口;
ContentMainRunnerImpl::Initialize接口调用ContentClientInitializer::Set(process_type, delegate_),
ContentClientInitializer定义在content_main_runner.cc中,这个类只有一个static方法Set,
Set方法的职责是调用ContentMainDelegate的相应接口设置ContentClient的实例域
ContentBrowserClient,ContentPluginClient,ContentRenderClient,ContentUtilityClient。

ContentMainRunnerImpl::Run会调用全局函数RunNamedProcessTypeMain,这个函数中会调用ContentMainDelegate::RunProcess.
根据前面对ContentMainDelegate的讨论,我们知道实际执行的是ChromeMainDelegateAndroid::RunProcess.
ChromeMainDelegateAndroid::RunProcess主要做两件事:
1.创建BrowserMainRunner实例,实际创建的是继承自BrowserMainRunner的BrowserMainRunnerImpl,
这个类定义在browser_main_runner.cc中;
2.调用BrowserMainRunnerImpl实例的Initialize接口。
BrowserMainRunnerImpl包含BrowserMainLoop的引用。
BrowerMainLoop是Browser进程的核心类,负责Browser进程中所有线程的创建。
BrowserMainRunnerImpl::Initialize函数创建BrowserMainLoop的实例并调用其接口完成Browser进程的准备工作。
上述类之间的关系图如下:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ndk开发流程
下接 android linux 基础知识总结[下]6
如何在Android中启动JAVA程序
Android运行时ART简要介绍和学习计划
Chromium扩展(Extension)加载过程分析
Android之jni出现JNIEnv has no member named ‘GetMehtodID‘解决办法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服