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进程通讯获取各种服务对象的句柄的进而执行相应的操作的。
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启动流程