加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

Android启动步骤

发布时间:2021-11-24 17:54:56 所属栏目:教程 来源:互联网
导读:从内核之上,我们首先应该从文件系统的init开始,因为 init 是内核进入文件系统后第一个运行的程序,通常我们可以在linux的命令行中指定内核第一个调用谁,如果没指定那么内核将会到/sbin/, /bin/ 等目录下查找默认的init,如果没有找到那么就报告出错。 ini

从内核之上,我们首先应该从文件系统的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的格式
service <name> <pathname> [ <argument> ]*  
<option>  
<option>  
...  
zygote对应的可执行文件为app_process,android2.2中它的源代码位置:framework/base/cmds/app_process
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);  
        }  
否则不启动system server:
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();  
runtime是AppRuntime对象,继承自AndroidRuntime,在AndroitRuntime.app里的start()函数如下,默认装载的是RuntimeInit进程,不启动system server.
void AndroidRuntime::start()  
{  
    start("com.android.internal.os.RuntimeInit",  
        false /* Don't start the system server */);  
}  
在AndroidRuntime.cpp的start方法内,先启动JAVA虚拟机,在定位执行className类的main方法(如果才存在的话)。
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);  
        }  
    }  
}  
先看怎么启动虚拟机的,在startVm方法内,先将一些系统参数选项,包括虚拟机相关的属性,保存到一个JavaVMOption的实例内,比如虚拟机的堆大小,是否check jni,JNI版本信息,最后将这些参数传给JNI_CreateJavaVM,创建JAVA虚拟机实例
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*);  

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读