Android系统在手机上的启动流程【Android】



启动过程
        Bootloader 引导程序  --->   Linux Kernel 内核启动  --->  Android 系统启动


      启动入口:init进程(Linux系统中用户空间的第一个进程) init.c  --- >   main     还是从main方法开始启动
      加载配置(init.rc)
      启动孵化器(zygote)——java世界孵化器
      system_init启动Native世界
      ServiceThread启动Java世界

详细过程:

1. 手机通电以后(按开机键后),首先加载驱动程序,然后去加载第一个用户进程,init.c(android2.3\system\core\init.c)

int main(int argc, char **argv)
    {
        ...
        //创建所需要的文件夹
        mkdir("/dev", 0755);
        ...
        //加载设备
        mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755");
        mkdir("/dev/pts", 0755);
        ...
        //初始化log
        log_init();
        ...
        //初始化,并解析配置文件 init.rc
        init_parse_config_file("/init.rc");
        ...

init.rc文件中的主要内容:

//加载设置 

//启动服务,最主要就是zygote服务(孵化器),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

2.C代码中的zygote孵化器,对应的文件Mainapp.cpp(\frameworks\base\cmds\appprocess),主要的工作就是开启了一个java服务(ZygoteInit),从此,java中的zygote服务就开启了:

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

    //获得虚拟机的引用
    AppRuntime runtime;

    //开启第一个java程序
    setArgv0(argv0, "zygote");
    set_process_name("zygote");
    runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);

3.com.android.internal.os.ZygoteInit.java 类中的主要工作:

public static void main(String argv[]) {
    try {
        VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024);

    ...
        //加载android中所有的类文件
        preloadClasses();

        //加载android中所有的资源
        preloadResources();
        ...
        //开启系统服务 com.android.server.SystemServer
        startSystemServer();

4.SystemServer.java 中主要有二个方法 native方法 init1() 和java方法 init2() 方法 ,其中init1开启android系统中和硬件相关的服务,init2方法,开启android系统中的其他服务

init1 调C代码开启硬件相关的服务:
    System_init.cpp文件中

     // Start the AudioFlinger
    AudioFlinger::instantiate();

    // Start the media playback service
    MediaPlayerService::instantiate();

    // Start the camera service
    CameraService::instantiate();

    // Start the audio policy service
    AudioPolicyService::instantiate();


    init2()方法 开启SystemThread线程,在此线程中,加载androd服务
    如:

    //开启和硬件无关的服务,
      devicePolicy = new DevicePolicyManagerService(context);
      ServiceManager.addService(Context.DEVICE_POLICY_SERVICE, devicePolicy);

    //通知ActivityManagerService系统已经准备好了
     ((ActivityManagerService)ActivityManagerNative.getDefault())
            .systemReady
5.ActivityManagerService中的systemReady 方法中的处理事件:
//发出一个开机广播 
     Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
    broadcastIntentLocked(null, null, intent, null, finisher,
                            0, null, null, null, true, false, MY_PID, Process.SYSTEM_UID);

// 通知ActivityStack 将最上层的activity运行,此时,ActivityStack 中为空的,会开启luncher应用
    mMainStack.resumeTopActivityLocked(null);

    ..
    ActivityRecord next = topRunningActivityLocked(null);
    if (next == null) {
        //
        // There are no more activities!  Let's just start up the
        // Launcher...
        if (mMainStack) {
            return mService.startHomeActivityLocked();
        }


经过以上的五个步骤,手机桌面就启动起来了





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值