自己开心就好,何必管他人烦恼
1. 应用进程创建
ActivityManagerService负责管理应用进程的创建。这一节会讲述如何从ActivityManagerService申请创建一个app进程,然后从zygote克隆一个进程的过程。
1.1 ActivityManagerService.startProcessLocked
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java :
1.2 Process.start
这一步直接交给下一步来处理。
1.3 Process.startViaZygote
frameworks/base/core/java/android/os/Process.java :
函数openZygoteSocketIfNeeded会在zygote地址上建立一个socket连接,然后创建一个input stream和output stream。
1.4 Process.zygoteSendArgsAndGetResult
frameworks/base/core/java/android/os/Process.java :
###1.5 ZygoteInit.runSelectLoop
ActivityManagerService通过socket将参数传递给zygote进程后,创建app进程的任务就交给zygote继续实现了。让我们再次回到zygote的循环中。
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java :
1.6 ZygoteConnection.runOnce
frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java :
1.7 ZygoteConnection.handleChildProc
frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java :
1.8 RuntimeInit.zygoteInit
这里开始调用android.app.ActivityThread的main函数。
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java :
到这里一个Android app的进程就已经创建好了。
2. Binder线程池的启动
App进程创建过程中会建立一个Binder线程池,用来处理进程间的Binder通信。
2.1 RuntimeInit.nativeZygoteInit
frameworks/base/core/jni/AndroidRuntime.cpp :
这里直接调用了一个AndroidRuntime全局对象gCurRuntime的onZygoteInit函数。这个全局对象是在zygote进程中创建了,这里是通过复制zygote的进程获得的该对象。
2.2 AppRuntime.onZygoteInit
frameworks/base/cmds/app_main.cpp :
2.3 ProcessState.startThreadPool
启动Binder线程池线程, app进程从而具有进程间binder通信的能力。
frameworks/native/libs/binder/PorcessState.cpp :
3. App进程消息循环的创建
在1.8中,RuntimeInit调用函数applicationInit来启动ActivityThread的main函数。
3.1 RuntimeInit.applicationInit
设置了heap的目标使用率,然后调用了下一步的静态函数。
3.2 RuntimeInit.invokeStaticMain
这一步终于开始从这个创建的新进程中调用ActivityThread的main函数了。不过调用的方式有点奇怪,这里是通过抛出一个异常的形式,来清空当前栈中的积压的函数,直到回退到ZygoteInit.main函数中。因为该app进程是从zygote进程中fork出来的,所以栈的内容也是相同的,所以可以会退到ZygoteInit.main函数。
frameworks/base/core/java/com/android/internal/os/RuntimeInit.java :
3.3 ZygoteInit.main
在Zygote进程里,会进入无限的循环。但是,在app进程里,进入这个循环是没有作用,所以需要跳出循环,继续前进。
3.4 MethodAndArgsCaller.run
这里就是回到ZygoteInit.main里调用ActivityThread的main函数,目的就是清理准备app进程中形成的调用堆栈。
|
|
ActivityThread.main
这里就是回到我们熟悉的剧情了,不再赘述。