1.1.1. Linux启动

  • 上电,cpu复位(避免硬件初始化错误),执行固定内存位置的指令。这个固定位置的保存程序称为Bootloader,作用是装载真正的用户程序。
  • 执行内核程序,(除了Bootloader之外都可以看做用户程序)初始化各种硬件。
  • kernel_thread() 加载init.rc 启动不同程序

变量的作用域

http://www.gamelook.com.cn/wp-content/uploads/2020/05/wyy004.jpg

init.rc文件位置

EBook3.2-7.1/system/core/rootdir/init.rc

system/core/rootdir/init.zygote64.rc

service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
    class main
    socket zygote stream 660 root system
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart netd
    writepid /dev/cpuset/foreground/tasks

Zygote进程

zygote本身是一个Native的应用程序,与驱动、内核等无关。它是由init进程根据init.rc文件中的配置创建的。zygote最初的名字叫“app_process”,这个名字是在Android.mk文件中指定的。在运行中,app_process通过linux下的pctrl系统调用将自己的名字换成了zygote。

Zygote进程是所有的android进程的父进程,包括SystemServer和各种应用进程都是通过Zygote进程fork出来的。而Zygote进程则是通过linux系统的init进程启动的,所以Android系统中进程的启动顺序如下:

init进程 –> Zygote进程 –> SystemServer进程 –>各种应用进程

  • init进程:linux的根进程,android系统是基于linux系统的,因此可以算作是整个android操作系统的第一个进程; 0号进程

  • Zygote进程:android系统的根进程,主要作用:fork出SystemServer进程和各种应用进程; app_process

  • SystemServer进程:主要是在这个进程中启动系统的各项服务,比如AMS,PMS,WMS服务等等;

  • 应用进程:启动自己编写的客户端应用时,一般都是重新启动一个应用进程,有自己的虚拟机与运行环境;·

Zygote的启动流程:
  • init进程fork出zygote进程

  • 启动虚拟机(startVM),注册JNI(startReg)

  • 预加载系统资源 preload

  • 启动SystemServer进程

  • 进入SocketLoop

Zygote进程main方法主要执行逻辑:

初始化DDMS;

注册Zygote进程的socket通讯;

初始化Zygote中的各种类,资源文件,OpenGL,类库,Text资源等等;

初始化完成之后fork出SystemServer进程;

fork出SystemServer进程之后,关闭socket连接;

·

SystemServer进程

SystemServer进程主要的作用是启动各种系统服务,比如ActivityManagerService,PackageManagerService,WindowManagerService等服务,我们平时熟知的各种系统性的服务其实都是在SystemServer进程中启动的,而当我们的应用需要使用各种系统服务的时候其实也是通过与SystemServer进程通讯获取各种服务对象的句柄的进而执行相应的操作的。

image-20210223232811966

startBootstrapServices() 主要用于启动系统Boot级服务 startCoreServices() 主要用于启动系统核心的服务 startOtherServices() 主要用于启动一些非紧要或者是非需要及时启动的服务

总结:

·

SystemServer进程是android中一个很重要的进程由Zygote进程启动;

SystemServer进程主要用于启动系统中的服务;

SystemServer进程启动服务的启动函数为main函数;

SystemServer在执行过程中首先会初始化一些系统变量,加载类库,创建Context对象,创建SystemServiceManager对象等之后才开始启动系统服务;

SystemServer进程将系统服务分为三类:boot服务,core服务和other服务,并逐步启动

SertemServer进程在尝试启动服务之前会首先尝试与Zygote建立socket通讯,只有通讯成功之后才会开始尝试启动服务;

创建的系统服务过程中主要通过SystemServiceManager对象来管理,通过调用服务对象的构造方法和onStart方法初始化服务的相关变量;

服务对象都有自己的异步消息对象,并运行在单独的线程中;

启动binder机制 startThreadPool

  • 打开binder驱动
  • 映射内存、分配缓冲区
  • 启动binder线程、进入binder loop

独立进程系统服务 surfaceFlinger 启动

frameworks/native/services/surfaceflinger/surfaceflinger.rc

service surfaceflinger /system/bin/surfaceflinger
    class core
    user system
    group graphics drmrpc readproc
    onrestart restart zygote
    writepid /dev/stune/foreground/tasks

frameworks/native/services/surfaceflinger/main_surfaceflinger.cpp

int main(int, char**) {
    ProcessState::self()->setThreadPoolMaxThreadCount(4);
    // start the thread pool 启动binder
    sp<ProcessState> ps(ProcessState::self());
    ps->startThreadPool();

    // 初始化sf  调用init
    sp<SurfaceFlinger> flinger = DisplayUtils::getInstance()->getSFInstance();
    flinger->init();

    // publish surface flinger
    sp<IServiceManager> sm(defaultServiceManager());
    sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);
    // run surface flinger in this thread
    flinger->run();

    return 0;
}

servicemanager启动流程


Android系统启动

Copyright © tracyliu-FE 2021 all right reserved,powered by Gitbook文件修订时间: 2022-03-06 12:52:33

results matching ""

    No results matching ""