Android启动过程
Android启动过程
从内核之上,我们首先应该从文件系统的init开始,因为 init 是内核进入文件系统后第一个运行的程序,通常我们可以在linux的命令行中指定内核第一个调用谁,如果没指定那么内核将会到/sbin/, /bin/ 等目录下查找默认的init,如果没有找到那么就报告出错。
init.c位置:system/core/init/init.c
在init.c的main函数里面
完成以下步骤:
1、创建设备节点
2、初始化log系统
3、解析init.rc文件,解析函数在同一目录的parser.c里面实现
4、初始化属性服务器,在同一目录下的property_service.c里面实现
。。。。
最后、进入loop等待事件到来。
一、init.rc的解析过程
init.rc是一个初始化脚本,路径(不确定):device/renesas/emev/init.rc
在init.c的main函数里面,调用parser.c的parse_config_file("/init.rc");执行解析过程
先读取文件内容到data里面,再调用parse_config(fn, data);进行解析
init.rc包含Android初始化語言的四大类声明:行为类(Actions),命令类(Commands),服务类(Services),选项类(Options),解析完会形成两个列表service_list 和action_list
其中有一个很重要的服务就是zygote,在init.rc里面的片段:
- service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
- socket zygote stream 666
- onrestart write /sys/android_power/request_state wake
- onrestart write /sys/power/state on
- onrestart restart media
- service <name> <pathname> [ <argument> ]*
- <option>
- <option>
- ...
app_main.cpp的main函数,它先调用AndroidRuntime::addVmArguments将它的参数“-Xzygote /system/bin”传给AndroidRuntime作为启动JavaVM用。接着如果定位余下的参数,如果有"--zygote",执行下面代码,从参数可以知道,这时候要求启动start system server,并且将com.android.internal.os.ZygoteInit装载至虚拟机
- ZygoteInit.java的main方法)。
- if (0 == strcmp("--zygote", arg)) {
- bool startSystemServer = (i < argc) ?
- strcmp(argv[i], "--start-system-server") == 0 : false;
- setArgv0(argv0, "zygote");
- set_process_name("zygote");
- runtime.start("com.android.internal.os.ZygoteInit",
- startSystemServer);
- }
- set_process_name(argv0);
- runtime.mClassName = arg;
- // Remainder of args get passed to startup class main()
- runtime.mArgC = argc-i;
- runtime.mArgV = argv+i;
- LOGV("App process is starting with pid=%d, class=%s.\n",
- getpid(), runtime.getClassName());
- runtime.start();
- void AndroidRuntime::start()
- {
- start("com.android.internal.os.RuntimeInit",
- false /* Don't start the system server */);
- }
- void AndroidRuntime::start(const char* className, const bool startSystemServer)
- {
- LOGD("\n>>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<\n");
- /* start the virtual machine */
- if (startVm(&mJavaVM, &env) != 0)
- goto bail;
- startClass = env->FindClass(slashClassName);
- if (startClass == NULL) {
- LOGE("JavaVM unable to locate class '%s'\n", slashClassName);
- /* keep going */
- } else {
- startMeth = env->GetStaticMethodID(startClass, "main",
- "([Ljava/lang/String;)V");
- if (startMeth == NULL) {
- LOGE("JavaVM unable to find main() in '%s'\n", className);
- /* keep going */
- } else {
- env->CallStaticVoidMethod(startClass, startMeth, strArray);
- }
- }
- }
- JNI_CreateJavaVM在jni.h中有声明,代码位置:dalvik/libnativehelper/include/nativehelper/,在Jni.c中有定义
- jint JNI_GetDefaultJavaVMInitArgs(void*);
- jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*);
- jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*);
|
评论暂时关闭