学习android内核 -- 系统启动相关

参考自:《Android系统进程Zygote启动过程的源代码分析》 http://blog.csdn.net/luoshengyang/article/details/6768304 


1.Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的。Zygote进程也不例外,它是在系统启动的过程,由init进程创建的。在系统启动脚本system/core/rootdir/init.rc文件中


2.Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程孕育(fork)出来的。

系统中的两个重要服务PackageManagerService和ActivityManagerService,则是由SystemServer进程来负责启动的。

即:Zygote-〉加载系统资源 -〉SystemServer-〉(PackageManagerService,ActivityManagerService(fork应用进程)


3.系统资源(framework/base/core/core/res目录下),由appt会编译生成framework-res.apk.

该资源是在Zygote进程启动时被加载的(预加载资源[即需要在res/values/arrays.xml配置],缓冲到静态变量中,从而应用程序可以访问),并且只有当加载了系统资源之后才开始启动其它应用进程,从而实现其它应用进程共享系统资源的目标。

即:Zygote -> 加载系统资源 ->启动其它应用进程




Zygote启动序列图:


Step 1. app_process.main

        这个函数定义在frameworks/base/cmds/app_process/app_main.cpp文件中: 

    runtime.start("com.android.internal.os.ZygoteInit",
	startSystemServer);

由于AppRuntime没有实现自己的start函数,它继承了父类AndroidRuntime的start函数,因此,下面会执行AndroidRuntime类的start函数。


Step 2. AndroidRuntime.start

        这个函数定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中:

这个函数的作用是启动Android系统运行时库,它主要做了三件事情:

一是调用函数startVM启动虚拟机,

二是调用函数startReg注册JNI方法,

三是调用了com.android.internal.os.ZygoteInit类的main函数。



 Step 3. ZygoteInit.main

        这个函数定义在frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中:


它主要作了三件事情,

一个调用registerZygoteSocket函数创建了一个socket接口,用来和ActivityManagerService通讯;

二是调用startSystemServer函数来启动SystemServer组件;

三是调用runSelectLoopMode函数进入一个无限循环在前面创建的socket接口上等待ActivityManagerService请求创建新的应用程序进程。



Step 7.  RuntimeInit.zygoteInit

        这个函数定义在frameworks/base/core/java/com/android/internal/os/RuntimeInit.java文件中:

这个函数会执行两个操作,一个是调用zygoteInitNative函数来执行一个Binder进程间通信机制的初始化工作,这个工作完成之后,这个进程中的Binder对象就可以方便地进行进程间通信了,另一个是调用上面zygoteInit.startSystemServer传进来的com.android.server.SystemServer类的main函数。


Step 8. RuntimeInit.zygoteInitNative

         这个函数定义在frameworks/base/core/java/com/android/internal/os/RuntimeInit.java文件中:


函数zygoteInitNative是一个Native函数,实现在frameworks/base/core/jni/AndroidRuntime.cpp文件中.



完成这一步后,这个进程的Binder进程间通信机制基础设施就准备好了。

回到Step 7中的RuntimeInit.zygoteInitNative函数,下一步它就要执行com.android.server.SystemServer类的main函数了。


Step 9. SystemServer.main

        这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:


这里的main函数首先会执行JNI方法init1,然后init1会调用这里的init2函数,在init2函数里面,会创建一个ServerThread线程对象来执行一些系统关键服务的启动操作.如:PackageManagerService和ActivityManagerService

 

这里执行完成后,层层返回,最后回到上面的Step 3中的ZygoteInit.main函数中,接下来它就要调用runSelectLoopMode函数进入一个无限循环在前面Step 4中创建的socket接口上等待ActivityManagerService请求创建新的应用程序进程了。


 Step 10. ZygoteInit.runSelectLoopMode

        这个函数定义在frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中:

这里就是在等待ActivityManagerService来连接这个Socket,然后调用ZygoteConnection.runOnce函数来创建新的应用程序.





这样,Zygote进程就启动完成了,学习到这里,我们终于都对Android系统中的进程有了一个深刻的认识了,这里总结一下:

        1. 系统启动时init进程会创建Zygote进程,Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作。

        2. Zygote进程会首先创建一个SystemServer进程,SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService。

        3. 当我们需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值