一、启动init进程
init程序是Linux启动的和经一个程序
init程序的源文件在system/core/init/init.cpp里
二、解析init.rc
在init的main函数里,会先做一些系统初始化的工作,然后通过Parser对象来解析init.rc文件
parser对象的源文件在system/core/init/init_parser.cpp里面
在8.1系统源码里面,rc文件分别存在几个不同的目录里面
- 主rc文件,init.rc在device/设备名/型号名/目录里,init.rc通过import的形式导入其他的rc文件
- 还有一些其他的rc文件也在这个目录里面
- init.zygote.rc文件在system/core/rootdir里面
但是在把系统镜像烧录到车机后,rc文件都在根目录/下
三、启动zygote
init进程解析完init.rc,将根据配置文件启动zygote
zygote是所有安卓服务和应用的父进程,承载着创建java虚拟机并且孵化安卓层的SystemServer和安卓应用的功能
zygote源码在frameworks/base/cmds/app_process/app_main.cpp中
四、启动SystemServer
在zygote中其实并没有fork出来一个SystemServer,而是先启动了java层的ZygoteInit类(通过runtime.start(“com.android.internal.os.ZygoteInit”, args, zygote))
当然fork是不能java层直接调用的,ZygoteInit.java中又通过Zygote类,Zygote类又通过jni调用了Linux层的函数fork出来了SystemServer
ZygoteInit.java的源码在:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
Zygote.java的源码在:frameworks/base/core/java/com/android/internal/os/Zygote.java
Zygote jni层的代码在:frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
SystemServer启动后,会启动一大堆系统服务,安卓的基础运行环境就起来了,启动服务的几个函数为:
1 2 3 |
startBootstrapServices(); startCoreServices(); startOtherServices(); |
SystemServer的代码在:frameworks/base/services/java/com/android/SystemServer.java
五、Launcher的启动
在SystemServer的startOtherServices函数中调用了mActivityManagerService.systemReady,
在ActivityManagerService的systemReady函数中通过startHomeActivityLocked来启动Launcher
六、待续问题:
init.rc中的服务是怎么启动的
Sorry, the comment form is closed at this time.