Android系统启动流程

本文详细介绍了Android系统的启动过程,从Linux内核启动到加载init进程,再到Zygote初始化及system_server服务启动等关键步骤。深入分析了核心组件和服务的工作原理。
  • 当系统引导程序启动Linux内核,内核会记载各种数据结构,和驱动程序,加载完毕之后,Android系统开始启动并加载第一个用户级别的进程:init(system/core/init/Init.c)

  • 查看Init.c代码,看main函数

    int main(int argc, char **argv)
    {
         ...
        //执行Linux指令
        mkdir("/dev", 0755);
        mkdir("/proc", 0755);
        mkdir("/sys", 0755);
    
        ...
        //解析执行init.rc配置文件
        init_parse_config_file("/init.rc");
        ...
    }
    
  • 在init.rc中定义好的指令都会开始执行,其中执行了很多bin指令,启动系统服务

    //启动孵化器进程,此进程是Android系统启动关键服务的一个母进程
    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
    onrestart restart netd
    
  • 在appprocess文件夹下找到appmain.cpp,查看main函数,发现以下代码

    int main(int argc, const char* const argv[])
    {
        ...
        //启动一个系统服务:ZygoteInit
        runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);
        ...
    }
    
  • 在ZygoteInit.java中,查看main方法

     public static void main(String argv[]) {
        ...
        //加载Android系统需要的类
        preloadClasses();
        ...
        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类包名相同,找到comandroidserver_SystemServer.cpp文件

  • 在comandroidserver_SystemServer.cpp文件中,找到了

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

  • 在systeminit.cpp文件中找到systeminit方法,方法体中 //执行了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();
        }
    }
    ...

 

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模与仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态与位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模与仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计与路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计与验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模与仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模与控制模块的实现细节,同时可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真与分析能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值