android系统的启动流程

本文详细阐述了从系统引导程序启动Linux内核到Android系统初始化的全过程,包括内核数据结构记载、驱动加载、init进程执行init.rc配置文件、孵化器进程启动、ZygoteInit加载系统类、启动Zygote服务、SystemServer服务初始化和启动大量系统服务等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

体系

流程

当系统引导程序启动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”,
};

    ...
    //分叉启动上面字符串数组定义的服务
     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文件中,找到了

    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的方法体中

    //启动一个服务线程
    Thread thr = new ServerThread();
    thr.start();
    
  • 在ServerThread的run方法中

    //准备消息轮询器
    Looper.prepare();
    ...
    //启动大量的系统服务并把其逐一添加至ServiceManager
    ServiceManager.addService(Context.WINDOW_SERVICE, wm);
    ...
    //调用systemReady,准备创建第一个activity
     ((ActivityManagerService)ActivityManagerNative.getDefault())
            .systemReady(new Runnable(){
            ...
    });
    
  • 在ActivityManagerService.java中,有systemReady方法,方法体里找到

    //检测任务栈中有没有activity,如果没有,创建Launcher
    mMainStack.resumeTopActivityLocked(null);
    
  • 在ActivityStack.java中,方法resumeTopActivityLocked

    // 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();
        }
    }
    ...
    ![转载](https://img-blog.youkuaiyun.com/20150712165832661)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值