笔记:Android系统启动流程

一、电源开启期

  1. 长按电源键,会产生电流,电流最终会转换为汇编指令,指令会启动运行一个被内置到ROM(只读存储器,一旦存储数据就无法改变或删除)中的芯片引导代码,芯片引导代码的作用是将引导程序(BootLoader)加载到RAM(运行时存储空间)并运行,BootLoader是系统内核启动前的一个小程序,类似Windows的BIOS,作用是引导启动操作系统,系统启动过程中会启动内核、设置缓存、被保护存储器、计划列表,加载驱动等。

二、idle进程

  1. 系统启动过程中,会启动Linux系统的第一个进程–idle(pid为0,init、kthreadd进程的父进程)进程,他是有汇编语言编写,idle进程的一个很重要的作用就是完成系统环境初始化工作并创建两个进程后开启无限循环,管理进程调度,两个进程:
    • init进程,Linux系统中第一个用户进程,Android中的进程都有此直接或间接派生而来。
    • kthreadd进程

三、kthreadd进程

kthreadd(pid为2)进程,Linux内核中进程,运行在内核空间,负责所有内核线程的创建、调度、管理,内核中所有线程有此直接或间接派生而来,主要负责内核线程的调度管理。

四、init进程

init(pid为1)进程,Linux系统中第一个用户进程,Android中的进程都有此直接或间接派生而来。init进程启动后,会去系统中查找init.cpp文件并执行其内部的main方法,其中主要干了以下事情:

  1. 创建并挂载文件系统;
  2. 屏蔽标准输入输出,初始化内核Log系统;
  3. 初始化环境属性变量;
  4. 完成SELinux(Linux系统安全相关)的一些初始化工作;
  5. 创建子进程信号处理器;
  6. 启动属性服务(PropertyService,同时允许8个用户服务操作属性服务);
  7. 找到并解析init.rc(AIL:Android初始化语言编写)配置文件(内部由5类数据组成action、option、import、commands、services),最终会执行到Service.cpp的Start()方法,方法内部会创建子进程及Zygote进程
  • action:一系列commands的集合
  • option:修饰service的属性,用于定义service何时启动以及怎样启动
  • service:需要在初始化就启动的服务
  • commands:一系列命令
  • import:导入其他RC文件

涉及文件源码路径:

Android O 8.0源码文件地址:

  • /system/core/init/init.cpp
  • /system/core/rootdir/init.rc
  • /system/core/init/service.cpp

五、Zygote进程

  1. 在zygote进程中找到app_main.cpp的main方法,方法中会组织ZygoteInit.java类中main函数的args参数(“start-system-server”,abi相关等)调用APPRuntime.start(“com.android.internal.os.ZygoteInit”, args, zygote),AppRuntime继承自AndroidRuntime,最终到AndroidRuntime的start()。
  2. 在AndroidRuntime的start()中会做以下几件事:
  • 创建DVM
  • 注册JNI
  • 找到ZygoteInit的main()
  • 通过JNI的方式调用ZygoteInit的main(),从此进入了Java框架层
  1. ZygoteInit的main()中:
  • 创建LocalServerSocket(等待AMS请求创建新的应用程序进程)
  • 预加载类和资源(IcuCachePinning、"/system/etc/preloaded-classes"路径下的类、com.android.internal.R.array.preloaded_drawables资源、com.android.internal.R.array.preloaded_color_state_lists资源、com.android.internal.R.bool.config_freeformWindowManagement资源、com.android.internal.R.array.preloaded_freeform_multi_window_drawables资源、OpenGL相关、System.loadLibrary(“android”);、System.loadLibrary(“compiler_rt”);、 System.loadLibrary(“jnigraphics”);、TextResources【TextView.preloadFontCache()】、 AndroidKeyStoreProvider.install())
  • startSystemServer()中通过Zygote.forkSystemServer()Zygote进程通过复制自身地址空间创建SystemServer进程,
  • runSelectLoop开启socket监听

涉及文件源码路径:

Android O 8.0源码文件地址:

  • /frameworks/base/cmds/app_process/app_main.cpp
  • /frameworks/base/core/jni/AndroidRuntime.cpp
  • /frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

六、SystemServer进程

在Zygote.java的main中调用startSystemServer()方法创建SystemServer进程后:

  1. 关闭不用的Socket;
  2. 创建ClassLoader;
  3. 调用ZygoteInit.zygoteInit(),内部会【1.ZygoteInit.nativeZygoteInit()到AndroidRuntime.cpp中创建Binder线程池2.RuntimeInit.applicationInit()找到SystemServer类main()封装成MethodAndArgsCaller异常抛出,ZygoteInit的main函数中会catch住,并调用期run(),run内部通过反射调用SystemServer类main()方法。
  4. main中new SystemServer().run();
  5. run()中如下:
  • loadLibrary(“android_servers”);
  • 创建SystemServiceManager,通过他启动三种服务,两种方式:1. 调用其start()传入被启动服务的.class,内部通过反射调用构造函数,添加到mServices中并调用service的start(),通过这种方式启动的Service都是继承自SystemService,这种都是实现了.Stub方法。如:AMS、Installer、PowerManagerService等;2. Service调用自身方法创建服务,然后通过ServiceManager.addService()添加,ServiceManager管理系统服务,需要通过Binder机制通信。如:PackageManagerService;
  • 启动引导服务(startBootstrapServices();【Installer、AMS、PMS、PowerMS、LightsService、DisplayManagerService、UserManagerService等】)
  • 启动核心服务(startCoreServices();【DropBoxManagerService、BatteryService、UsageStatsService、WebViewUpdateService】)
  • 启动其他服务(startOtherServices();【WMS、AlarmManagerService、InputManagerService、VrManagerService、BluetoothService、AccessibilityManagerService、NotificationManagerService、StorageManagerService、NetworkManagementService、TextServicesManager、WifiScanningService、LocationManagerService、AudioService、UsbService、NightDisplayService、JobSchedulerService、AppWidgerService、SensorNotificationService】)
  1. PMS启动后,会调用systemReady解析并安装系统中应用程序,将信息进行保存;
  2. AMS启动后会调用systemReady查找Launcher应用,会用到ActivityStackSupervisor.java、ActityStack.java、AMS.startHomeActivityLocked()中判断Action为Intent.ACTION_MAIN, Category为Intent.CATEGORY_HOME的应用程序是否启动,没有则启动,这个就是Launcher应用。
  3. Launcher应用启动后,用工作区显示应用图标,每个工作区描述一个抽象桌面,由多个屏幕组成,每个屏幕又分多个单元格,每个单元格放一个图标。

涉及文件源码路径:
Android O 8.0源码文件地址:

  • /frameworks/base/services/java/com/android/server/SystemServer.java
  • /frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值