Android系统是基于Linux内核的,所以当手机启动的时候,首先是Linux内核的启动,而Linux为Android系统启动的第一个进程是init进程
一、init进程
init是Linux系统启动的第一个用户进程, 它的进程号是1
init进程的入口函数是main,它主要做了这些工作:
1)解析配置文件,主要是系统配置文件和硬件平台相关的配置文件,同时也会解析service
其中的系统配置文件主要包括:
①、“early-init”:设置init进程以及它创建的子进程的优先级,设置init进程的安全环境
②、“init”:设置全局环境,为cpu accounting创建cgroup(资源控制)挂载点
③、“fs”:挂载mtd分区
④、“post-fs”:改变系统目录的访问权限
⑤、“post-fs-data”:改变/data目录以及它的子目录的访问权限
⑥、“boot”:基本网络的初始化,内存管理等等
⑦、“servicemanager”:启动系统管理器管理所有的本地服务,比如位置、音频、Shared preference等等
⑧、“zygote”:启动zygote作为应用进程
2)执行各个阶段的动作,其中包括zygote进程的创建就在这个阶段完成
3)初始化属性相关资源
4)init进入一个无限循环,等待响应
二、Zygote进程
zygote进程是由init祖先进程fork而来的,而所有的Android应用程序进程和系统服务进程又都是由zygote进程fork而来的,所以zygote是Android系统的核心进程,来看一下zygote的源文件App_main.cpp
int main(int argc, const char* const argv[]){
......
AppRuntime runtime;
......
int i = runtime.addVmArguments(argc, argv);
if(i < argc){
runtime.mParentDir = argv[i++];
}
if(i < argc){
arg = argv[i++];
if(0 == strcmp("--zygote", arg)){
bool startSystemServer = (i < argc) ? strcmp(argv[i], "--start-system-server") == 0: false;
setArgv0(argv0, "zygote");
set_process_name("zygote"); // 设置进程名为zygote
runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);
}
......
}
......
}
上面的AppRuntime继承于AndroidRuntime类, 调用的start方法其实是AndroidRuntime的方法
/*
* Start the Android runtime. This involves starting the virtual machine
* and calling the "static void main(String[] args)" method in the class
* named by "className".
*
* Passes the main function two arguments, the class name and the specified
* options string.
*/
void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
ALOGD(">>>>>> START %s uid %d <<<<<<\n",
className != NULL ? className : "(unknown)", getuid());
static const String8 startSystemServer("start-system-server");
/*
* 'startSystemServer == true' means runtime is obsolete and not run from
* init.rc anymore, so we print out the boot start event here.
*/
for (size_t i = 0; i < options.size(); ++i) {
if (options[i] == startSystemServer) {
/* track our progress through the boot sequence */
const int LOG_