• Android开机流程重新梳理


    最近回顾的一些知识,补充了一下。

    源码标准:API : 29「Android 10.0」

    android手机是怎么开机的?

    android 的底层是 linux kernel「内核」,由 BootLoader「系统启动加载器」 负责加载(类似于计算机的BIOS系统)。

    /bootable/recovery/bootloader.h

    首先启动 init「父进程,第一个进程」进程,接着运行init.rc脚本,脚本文件有个命令启动了Zygote进程,初始化时会启动虚拟机。

    /system/core/rootdir/init.zygote.rc

    Zygote进程fork出SystemServer进程,然后会调用SystemServer.main()方法。

    /frameworks/base/services/java/com/android/server/SystemService.java

    /** The main entry point from zygote.*/
    public static void main(String[] args) {
        new SystemServer().run();
    }

    run方法中,主要是在进程中启动系统的各项服务,比如ActivityManagerService,PackageManagerService,WindowManagerService服务等。

    private void run() {
        //创建主线程Looper、ActivityThread、SystemContext
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND);
        Looper.prepareMainLooper();
    
        // Initialize native services.
        System.loadLibrary("android_servers");    
        // Initialize the system context.
        createSystemContext();
        
        // Create the system service manager.
        mSystemServiceManager = new SystemServiceManager(mSystemContext);
        mSystemServiceManager.setStartInfo(mRuntimeRestart,mRuntimeStartElapsedTime, mRuntimeStartUptime);
        LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
        // 并行线程池
        SystemServerInitThreadPool.get();
    
        // Start services.
        traceBeginAndSlog("StartServices");
        startBootstrapServices();
        startCoreServices();
        startOtherServices();
    
        // Loop forever.
        Looper.loop();
    }

    下面是一些主要的初始化方法。

    /**
     * 这些服务具有复杂的相互依赖关系,所以需要放一起全部初始化
     */
    private void startBootstrapServices() {
        // Start the watchdog as early as possible so we can crash the system server
        final Watchdog watchdog = Watchdog.getInstance();
        watchdog.start();
    
        //启动AMS
        ActivityTaskManagerService atm = mSystemServiceManager.startService(
                    ActivityTaskManagerService.Lifecycle.class).getService();
        mActivityManagerService = ActivityManagerService.Lifecycle.startService(
                    mSystemServiceManager, atm);
    
        //电源管理器需要提前启动,因为其他服务需要它
        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
    
        // Start the package manager.
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                        mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
    
        //设置Application实例并开始
        mActivityManagerService.setSystemProcess();
    
        //使用 ActivityManager 实例完成看门狗设置并监听重启
        watchdog.init(context, mActivityManagerService);
    }

    真正启动是在ActivityManagerService的中systemReady方法,调用resumeTopActivityLocked打开锁屏界面。

    /**
     * Starts a miscellaneous grab bag of stuff that has yet to be refactored and organized.
     */
    private void startOtherServices() {
        //启动WMS
        wm = WindowManagerService.main();
        mActivityManagerService.setWindowManager(wm);
        
        //WMS 显示默认启动消息
        ActivityManagerNative.getDefault().showBootMessage();
        //开始启动初始应用程序
        mActivityManagerService.systemReady(new Runnable(){
            //SystemUI
            startSystemUi(context, windowManagerF);
        });
    }

    /frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

    /** 通过StackSupervisor运行所有 ActivityStacks */
    final ActivityStackSupervisor mStackSupervisor;
    
    public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
        mStackSupervisor.resumeFocusedStackTopActivityLocked();
    }

    到这里,android的开机流程结束。

  • 相关阅读:
    dremio docker 镜像版本
    jdk 11 更新内容
    自定义 maven 插件
    PC端响应式设置
    windows服务器事件查看器 日志查看
    我的小程序之旅六:微信公众号授权登录(适用于H5小程序)
    我的小程序之旅二:如何创建一个微信小程序
    我的小程序之旅九:微信开放平台unionId机制介绍
    我的小程序之旅五:微信公众号扫码登录PC端网页
    我的小程序之旅七:微信公众号设置IP白名单
  • 原文地址:https://www.cnblogs.com/LiuZhen/p/15878702.html
Copyright © 2020-2023  润新知