您的位置:首页 > 移动开发 > Android开发

android系统的启动流程

2015-07-12 16:59 483 查看

体系

流程

当系统引导程序启动linux内核,内核会记载各种数据结构,和驱动程序,加载完毕之后,android系统开始启动并加载第一个用户级别的进程:init(system/init/Init.c)

*查看 Init.c代码 看main函数

int mai(int argc,char**argv){

//执行linux指令

makdir(“/dev”,0755);

makdir(“/proc”,0755);

makdir(“/sys”,0755);



//解析执行init.c配置文件

init_parse_config_file(“init.rc”);

..

}

在init.rc中定义好的指令都会开始执行,其中执行了很多bin指令,启动系统服务

//启动孵化器进程,此进程是android系统启动关键服务的一个母进程

*在app_process文件夹下找到app_main,cpp,查看main函数,发现以下代码

int main(int argc ,const char* const argv[]){

//启动一个系统服务:ZygoteInit

}

*在ZygoteInit,java中,查看main方法

public static void main(String argv[]){

//加载android系统需要的类

proloadClasses();

if(argv[1].equals(“true”)){

//调用方法启动一个系统服务

startSystemServer();

}

}

*在startSystemServer()方法的方法体中

String args[] = {

“–setuid=1000”,

“–setgid=1000”,

“–setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003”,

“–capabilities=130104352,130104352”,

“–runtime-init”,

“–nice-name=system_server”,

“com.android.server.SystemServer”,

};

[code]    ...
    //分叉启动上面字符串数组定义的服务
     pid = Zygote.forkSystemServer(
     parsedArgs.uid, parsedArgs.gid,
     parsedArgs.gids, debugFlags, null,
     parsedArgs.permittedCapabilities,
     parsedArgs.effectiveCapabilities);


*SystemServer服务被启动

public static void main(String[] args){

//加载动态链接库

System.loadLibrary(“android_servers”);

//执行连接库里面的init1方法

init1(args);

}

*

* 动态链接库文件和java类包名相同,找到com_android_server_SystemServer.cpp文件

* 在com_android_server_SystemServer.cpp文件中,找到了

[code]    static JNINativeMethod gMethods[] = {
        /* name, signature, funcPtr */
        //给init1方法映射一个指针,调用system_init方法
        { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },
    };


android_server_SystemServer_init1方法体中调用了system_init,system_init没有方法体

在system_init.cpp文件中找到system_init方法,方法体中

//执行了SystemServer.java的init2方法

runtime->callStatic(“com/android/server/SystemServer”, “init2”);

回到SystemServer.java,在init2的方法体中

[code]//启动一个服务线程
Thread thr = new ServerThread();
thr.start();


在ServerThread的run方法中

[code]//准备消息轮询器
Looper.prepare();
...
//启动大量的系统服务并把其逐一添加至ServiceManager
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
...
//调用systemReady,准备创建第一个activity
 ((ActivityManagerService)ActivityManagerNative.getDefault())
        .systemReady(new Runnable(){
        ...
});


在ActivityManagerService.java中,有systemReady方法,方法体里找到

[code]//检测任务栈中有没有activity,如果没有,创建Launcher
mMainStack.resumeTopActivityLocked(null);


在ActivityStack.java中,方法resumeTopActivityLocked

[code]// Find the first activity that is not finishing.
ActivityRecord next = topRunningActivityLocked(null);
...
if (next == null) {
    // There are no more activities!  Let's just start up the
    // Launcher...
    if (mMainStack) {
        return mService.startHomeActivityLocked();
    }
}
...
![转载](http://img.blog.csdn.net/20150712165832661)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: