1分别分析b2g process
2和nuwa process,
3 分析b2g 与nuwa的通信交互
4分析messageloop,ipdl
5分析APP如何启动
结构:
|-XRE_main |-new ScopedAppData(aAppData); | |-XREMain::XRE_mainRun() |
NS_InitXPCOM2
启动xpcom部分:
|
|
NS_initxpcom
总结性:
NS_InitXPCOM2,在b2g进程中调用NS_InitXPCOM2完成了以下工作: 设置挂起时间, 设置线程类型,创建并初始化主线程,启动localfile服务用于获取各文件(app 或gre 文件,在omni.jar中)路径,创建组件服务和管理,自动注册各组件,初始化js 引擎,共享线程和抽象线程初始化,实例化jsloader服务,启动挂起监控,启动后台挂起监控,调用消息队列循环messageloop,再新建一个后台挂起监控。
前启动app 部分:
|-XREMain::XRE_mainRun()
|
为启动APP做准备:
XRE_MainRun,其所做工作如下:XRE_mainRun()先调用ProcLoaderClientGeckoInit与service端建立连接,启动app观察监听器,初始化命令行,启动命令行(cmdLine),创建隐藏窗口。启动最终ui(窗口),cmdLine->Run()一波复杂的操作最后会启动出第一个(hiden)页面/窗口(window),appStartup->Run()调mAppShell->Run()无限循环messageloop,等待APP启动请求?
nuwa进程做了些什么:
ProcLoaderServiceRun初始化命令行,new ContentProcess()传入了b2g pid作为参数,为创建子进程做各种准备:为子进程创建io子线程,创建uiloop消息循环线程,new一个ProcLoaderChild()作为进程加载器的子端,创建loaderChild,open发一个messageloop去建立连接通道,使建立连接通道,接着loaderChild这侧就在等b2g端的load信号了
交互部分:
b2g和nuwa这里用的ipdl通信机制,大体如下:在b2g里SendLoad,Nuwa则RecvLoad, SendLoadComplete进行一系列Load操作,比较不理解的是b2g那里一直没RecvLoadComplete,连OnMessageReceived都没执行.不过其load交互大体如此,在一个进程发,另一个进程收并去做相应工作。第一次的时候,它Load的目的是完整的Load它(nuwa)自己,至于后面的nuwa如何Load出其他进程
b2g让Nuwa创建新进程:
在b2g main thread 中,SendNuwaFork() 发送fork新进程的消息,在nuwa main thread中,会RecvNuwaFork(),并开始去做真正的fork工作(一系列操作。。)。fork完之后会发消息sendAddNewProcess 给b2g让它继续给nuwa发消息预加载新进程,供下一个APP用。ioloop 线程专门用于接收进程间的消息。每个进程中其ioloop线程与main thread 建立通道。
疑问:
为何b2g调了NS_InitXPCOM2 启动xpcom相关模块后,nuwa 还要继续来一次?
新进程从哪步开始出来的?新进程的产生过程及相互进程间的消息传递。
每个进程都有一个主线程吗?它的作用是什么,它们下面子线程相互通信可以实现吗?是如何实现的?
Omnijar.h
```
/**
* Initializes the Omnijar API with the given directory or file for GRE and
* APP. Each of the paths given can be:
* - a file path, pointing to the omnijar file,
* - a directory path, pointing to a directory containing an "omni.jar" file,
* - nullptr for autodetection of an "omni.jar" file.
*/
static void Init(nsIFile* aGrePath = nullptr, nsIFile* aAppPath = nullptr);
```
messageloop 机制:
ioloop 线程专门用于接收进程间的消息。每个进程中其ioloop线程与main thread 建立通道。专门用于处理进程间需要发送接收消息的需求,配合其他机制实现消息同步异步等操作。
gecko/dom/ipc/模块所承担的工作:
猜想:
一开机就启动system app(b2g中,app startup部分?),启动三个还是两个,至少两个进程(keyboa,homescreen),nuwa进程就是一个模板进程,同时具备附加的孵化其他进程的能力的增强版普通进程。不对,应该是先启动prealloc放在那里,然后当系统启动完成(未进入homescreen,),system app去启动homescreen,keyboard app,然后就在shell.html里渲染出界面了。
所以,所有app启动的触发当然是在system app(从gaia传过去的),也就是从content process 要到b2g process 才能使创建进程。
b2g启动过程:
b2g到nuwa再从 nuwa fork出的preallocated process 如何成为app process,过程基本:nuwa 被load 出来,初始化完善自己。完成后给b2g NuwaReady的消息,b2g开始消息使nuwa 开始fork新进程preallocated process。preallocated proc完成线程重新创建初始化等后给消息给b2g。若有app需要启动,则b2g 进程会setappinfo对preallocted proc改名为相关的APP应用名,否则就一直等待有新应用请求。开机app启动的顺序是preallocate proc ,home screen ,再到keyboard .每当preallocated proc被改名后成为具体APP应用后,b2g 会立马发消息给nuwa创建新的preallocated proc 预备着等新应用入驻。
应用的启动及b2g,nuwa,preallocated ,app 消息的获取与传输。