框架
android 体系架构图Android系统体系架构分为5层,自顶而下分别是:
- 应用程序框架(Application Framework)
- 进程通信层(Binder IPC)
- 系统服务层(Android System Services)
- 硬件抽象层(HAL)
-- HAL 定义了一个标准接口用于硬件厂商的实现. HAL允许功能实现,而不会影响或修改上层的系统。HAL的实现被打包成模块(.so)文件,并在适当的时候被加载进Android系统。 - Linux内核(Linux Kernel)
启动概述
启动概述Android系统底层基于Linux Kernel, 当Kernel启动过程会创建init进程, 该进程是所有用户空间的鼻祖, init进程会启动servicemanager(binder服务管家), Zygote进程(Java进程的鼻祖). Zygote进程会创建 system_server进程以及各种app进程,同时我们应该注意这里的 socket 通信 和 binder 通信
init启动
Kernel启动后,在用户空间启动init进程(init进程是Linux系统中用户空间的第一个进程,进程号固定为1),调用init中的main()方法执行init进程的职责,主要包括四部分:
- 信号处理
signal_handler_init()
-- 初始化signal句柄;
-- 循环处理子进程;
-- 注册epoll句柄;
-- 处理子进程的终止; - 解析并运行所有的init.rc相关文件,根据rc文件,生成相应的设备驱动节点
-- rc文件主要包含Action、Service、Command、Options,其中对于Action和Service的名称都是唯一的,对于重复的命名视为无效。 -
启动服务
服务启动流程 - 属性服务。
-- 当某个进程A,通过property_set()修改属性值后,init进程会检查访问权限,当权限满足要求后,则更改相应的属性值,属性值一旦改变则会触发相应的触发器(即rc文件中的on开头的语句),在Android Shared Memmory(共享内存区域)中有一个system_property_area区域,里面记录着所有的属性值。对于进程A通过property_get()方法,获取的也是该共享内存区域的属性值。
init进程执行的大体过程
- 创建一块共享内存空间,用于属性服务器
- 解析各个rc文件,并启动相应属性服务进程
- 初始化epoll,依次设置signal、property、keychord这3个fd可读时相对应的回调函数
- 循环执行如下:
-- 检查action_queue列表是否为空,若不为空则执行相应的action
-- 检查是否需要重启的进程,若有则将其重新启动
-- 进入epoll_wait等待状态,直到系统属性变化事件(property_set改变属性值),或者收到子进程的信号SIGCHLD,再或者keychord 键盘输入事件,则会退出等待状态,执行相应的回调函数。
Zygote 启动
- 它是android系统第一个java进程,是所有java进程的父进程,由于Android应用程序运行在各自独立的Dalvik虚拟机中,如果每个应用程序在启动之时都需要单独运行和初始化一个虚拟机,则会大大降低系统性能,因此Android首先创建一个zygote虚拟机,然后通过它孵化出其他的虚拟机进程,进而共享虚拟机内存和框架层资源,这样大幅度提高应用程序的启动和运行速度。
- 也就是说, Zygote进程会事先将应用程序要使用的Android Framework中的类与资源加载到内存中, 并组织形成所用资源的链接信息. 这样, 新运行的Android应用程序在使用所需资源时不必每次形成资源的链接信息, 这样就大大提升了程序的运行时间.
- Zygote进程就是init进程fork出来的. 但是, Zygote是由java编写而成的, 所以也要先初始化虚拟机, 由app_process进程装载并运行ZygoteInit类. 大体过程如下:app_process创建一个AppRuntime变量,然后调用它的start成员函数, 由于AppRuntime类没有重写start函数, 所以调用的是其父类AndroidRuntime中的start函数. 在这个start函数中, 它干了三件事: 一是调用函数startVM启动虚拟机,二是调用函数startReg注册运行ZygoteInit时需要调用的JNI本地方法,三是调用了com.android.internal.os.ZygoteInit类的main函数.
Zygote是由init进程
通过解析init.zygote.rc文件而创建的,zygote所对应的可执行程序app_process,所对应的源文件是App_main.cpp,进程名为zygote。
- 创建AppRuntime 并调用 AppRuntime.start() 方法
- 在 Runtime 中 startVM() 创建虚拟机, startReg() 注册 JNI 函数
- 通过 JNI 调用 ZygoteInit.main() ,进入 Java 环境
- registerZygoteSocket()建立socket通道。(zygote作为通信的服务端,用于响应客户端请求)
- preload() 预加载通用类、drawable和color 资源、openGL、共享库、WebView
- startSystemServer() fork 出system_server 进程
- 调用 runSelectLoop() 等待新的请求来将其唤醒并执行新的工作
总结
- 系统启动时init进程会创建Zygote进程,Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作。
- Zygote进程会首先创建一个SystemServer进程,SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService。
- 当我们需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程。
SystemServe 启动
StartSystemServer1.jpg- 首先fork出一个子进程
- 初始化并配置zygote进程
- 由于startSystemServer起始于main 方法,通过抛出 MethodAndArgsCaller 异常来回到main方法,从而进入到 SystemServer.main() 方法
注:
// ZygoteInit.java
public static void main(String argv[]) {
try {
startSystemServer(abiList, socketName);//启动system_server
....
} catch (MethodAndArgsCaller caller) {
caller.run(); //【见小节13】
} catch (RuntimeException ex) {
closeServerSocket();
throw ex;
}
}
public static class MethodAndArgsCaller extends Exception implements Runnable {
public void run() {
try {
//根据传递过来的参数,可知此处通过反射机制调用的是SystemServer.main()方法
mMethod.invoke(null, new Object[] { mArgs });
} catch (IllegalAccessException ex) {
throw new RuntimeException(ex);
} catch (InvocationTargetException ex) {
Throwable cause = ex.getCause();
if (cause instanceof RuntimeException) {
throw (RuntimeException) cause;
} else if (cause instanceof Error) {
throw (Error) cause;
}
throw new RuntimeException(ex);
}
}
}
SystemServer 的main方法会启动一系列的Service 如: ActivityManagerService, PowerManagerService, LightsService, DisplayManagerService, PackageManagerService, UserManagerService, sensor服务和BatteryService,UsageStatsService,WebViewUpdateService等核心服务。
到此, System_server主线程的启动工作总算完成, 进入Looper.loop()状态,等待其他线程通过handler发送消息到主线再处理.
system_server 启动流程
简单解析如下:
- Phase0
引导四大服务
:ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService - Phase100
回调服务
:PackageManagerService、WindowManagerService、InputManagerService、NetworkManagerService、DropBoxManagerService、FingerprintService、LauncherAppsService - Phase480
回调服务
:DevicePolicyManagerService - Phase500
核心系统服务
:WindowManagerService.systemReady()、PowerManagerService.systemReady()、PackageManagerService.systemReady()、DisplayManagerService.systemReady(),然后是AMS.systemReady - Phase550
准备就绪
: - Phase600
各种服务的systemRunning
: - Phase1000
启动就绪
这个过程启动的服务包括引导服务(7个)、核心服务(3个)、其他服务(70个+)
AMS (ActivityManagerService)启动
在SystemServer中启动的服务startBootstrapServices中包括了 AMS SystemServiceManager.startService(ActivityManagerService.Lifecycle.class)
主要流程包括:
- 创建AMS实例,包括Android Runtime、ActivityThread、Context对象等
- setSystemProces,将创建的AMS、meminfo、cpuinfo等注册到ServiceManager中
-- 这册 binder 服务,如: activity、procstats、meminfo、gfxinfo、dbinfo、cpuinfo、permission、processinfo、usagestats等 - installSystemProviders,安装系统provider,并创建CoreSettingsObserver,来监控settings的变化
- 启动systemUI,调用相应服务的systemReady
-- startProcessLocked()过程对于非persistent进程必须等待mProcessesReady = true才会真正创建进程,否则进程放入mProcessesOnHold队列。例外包括:addAppLocked、finishBooting、cleanUpApplicationRecordLock、attachApplicationLocked,还有processNextBroadcast对于flag为 FLAG_RECEIVER_BOOT_UPGRADE的广播,一般情况下mProcessesReady在没有ready前,则基本没有应用进程
//TODO:Activity启动
网友评论