Android系统启动流程

本文详细介绍了Android系统的启动流程,从底层的Linux内核到上层的应用程序层,涵盖了Loader层、Kernel层、Native层、Framework层及Application层的启动过程。重点讲解了zygote进程的启动与SystemServer进程的作用。

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

android的启动流程是从底层开始进行的,具体如下所示:

Android是基于Linux内核的系统,Android的启动过程主要分为两个阶段,首先是Linux内核的启动,然后是Android框架的启动。

可以将Andorid系统的启动流程分为以下五个层进行展开,分别是Loader层,Kernel层,Native层,Framework层,Application层。

Loader层
1.首先按开机键后,引导芯片将引导程序从ROM中加载到RAM中
2.引导程序(Bootloader)的主要作用就是将操作系统映像文件拷贝到RAM中

Kernel层
3.接着通过start_kernel函数和reset_kernel函数完成对kernel的初始化操作,同时启动用户空间的init进程
4.init进程是是一个十分重要的祖先进程,linux中的所有进程都是由init进程直接或者间接fork出来的,init进程一启动时就会读取init.rc脚本文件
Native层(包括利用surfaceflinger创建动画,孵化zygote进程,以及用户守护进程)
5.init进程创建后,会fork出一个zygote进程,这个进程是所有Java进程的父进程,所有的服务都会向其进行请求来fork出java进程
6.init还会创建servicemanager进程,它是Binder IPC通信过程中的守护进程,并会集中管理系统内的所有服务
Framework层
7.由zygote进程通过startSystemServer()方法fork出SystemServer进程,该进程同样是Andorid系统内重要的进程,AMS,PMS,WMS等多个进程都是由Systemserver进程fork出来的,SystemServer包含了startBootstrapServices(),startCoreServices(),startOtherServices()创建服务的方法,systemServer具体代码如下:

public final class SystemServer {
 
// The main entry point from zygote.
public static void main(String[] args) {
    new SystemServer().run();
}
 
public SystemServer() {
    // Check for factory test mode.
    mFactoryTestMode = FactoryTest.getMode();
}
 
private void run() {
......
 
    // 初始化原生服务库
    System.loadLibrary("android_servers");
    nativeInit();
 
    // 初始化系统上下文
    createSystemContext();
 
    // 创建SystemServiceManager对象
    mSystemServiceManager = new SystemServiceManager(mSystemContext);
 
    // 开启服务
    try {
        startBootstrapServices();
        startCoreServices();
        startOtherServices();
    } catch (Throwable ex) {
        Slog.e("System", "******************************************");
        Slog.e("System", "************ Failure starting system services", ex);
        throw ex;
    }
     
    ......
 
    // Loop forever.
    Looper.loop();
    throw new RuntimeException("Main thread loop unexpectedly exited");
}
 
//初始化系统上下文对象mSystemContext,并设置默认的主题。
private void createSystemContext() {
    ActivityThread activityThread = ActivityThread.systemMain();
    mSystemContext = activityThread.getSystemContext();
    mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
}
 
//在这里开启了几个核心的服务,因为这些服务之间相互依赖,所以都放在了这个方法里面。
private void startBootstrapServices() {
......
 
    //初始化ActivityManagerService
    mActivityManagerService = mSystemServiceManager
          .startService(ActivityManagerService.Lifecycle.class).getService();
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
 
    //初始化PowerManagerService,因为其他服务需要依赖这个Service,因此需要尽快的初始化
    mPowerManagerService = mSystemServiceManager
          .startService(PowerManagerService.class);
 
    // 现在电源管理已经开启,ActivityManagerService负责电源管理功能
    mActivityManagerService.initPowerManagement();
 
    // 开启DisplayManagerService
    mDisplayManagerService = mSystemServiceManager
          .startService(DisplayManagerService.class);
 
    // 开启PackageManagerService
    mPackageManagerService = PackageManagerService.main(mSystemContext,mInstaller,
          mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
...... }
 
private void startCoreServices() {...}// 启动一些基本服务。
 
private void startOtherServices() {...}// 启动其他服务。
}

Application层
zygote孵化的第一个进程是launcher进程,也就是桌面进程,在fork出Launcher进程后,AMS会向Surfaceflinger请求结束掉开机动画,同时显示桌面程序,这样就完成了系统界面的加载与显示

在这里插入图片描述

SystemServer

SystemServer是Android系统的一个核心进程,它是由zygote进程创建的,因此在android的启动过程中位于zygote之后。android的所有服务循环都是建立在 SystemServer之上的。在SystemServer中,将可以看到它建立了android中的大部分服务,并通过ServerManager的add_service方法把这些服务注册到(加入)到了ServiceManager的svclist中。从而完成ServcieManager对服务的管理。

Service Manager

Service manager是管理以上services的一个进程,可以在adb shell中运行ps看看进程列表就知道了。

源代码位于:

frameworks/base/cmds/servicemanager

执行方式:

他是用c和c++语言编写的natvie可以执行文件。在Android中称之为EXECUTABLE,这个名称很重要因为Android.mk文件中用这个名字来确定他是可以执行的二进制文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值