You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3.3 KiB
3.3 KiB
Android 系统的启动流程
Android 有哪些主要的系统进程?
在 init.rc 启动配置文件中定义了很多 Service,这些 Service 就是要单独启动的系统服务进程。
service zygote /system/bin/app_process ...
service servicemanager /system/bin/servicemanager ...
service surfaceflinger /system/bin/surfaceflinger ...
service media /system/bin/mediaserver ...
...
这些系统进程是怎么启动的?以及做了什么事?
Zygote 启动:
- init 进程 fork 出 zygote 进程
- 启动虚拟机,注册 jni 函数,为进入 Java 世界做准备
- 预加载系统资源
- 启动 SystemServer
- 进入 Socket Loop
Zygote 工作流程就是执行 runOnce 函数的过程。
SystemServer 启动:
private static boolean startSystemServer(...) {
String args[] = {
...
"com.android.server.SystemServer",
}
int pid = Zygote.forkSystemServer(...);
if(pid == 0){
handlerSystemServerProcess(parsedArgs);
}
return true;
}
void handlerSystemServerProcess(Arguments parsedArgs) {
RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, ...);
}
void zygoteInit(String[] argv, ...) {
commonInit();
nativeZygoteInit();
applicationInit(argv, ...);
}
// 启动 Binder 机制
void nativeZygoteInit() {
sp<ProcessState> proc = ProcessState::self();
proc->startThreadPool();
}
// 执行 SystemServer 的 main 函数
void applicationInit() {
invokeStaticMain(args, ...);
}
public static void main() {
new SystemServer().run();
}
// SystemServer#run
private void run() {
Looper.prepareMainLooper();
System.loadLibrary("android_servers");
createSystemContext();
startBootstrapServcies();
startCoreServices();
startOtherServices();
Looper.loop();
}
两个问题:
- 系统服务是怎么启动的?
- 怎么解决系统服务之间的相互依赖?
第一个问题,系统服务是怎么启动的?
我们只需要关注两个问题:
-
系统服务怎么发布,让应用程序可见?
void publishBinderService(String name, IBiner service, ...) { ServiceManager.addService(name, service, allowlsolated); }
也就是把系统服务的 Binder 注册到 ServiceManager 中。
-
系统服务跑在什么线程?
课堂作业:
- 为什么系统服务不都跑在 binder 线程里呢?
- 为什么系统服务不都跑在自己私有的工作线程里呢?
- 跑在 binder 线程和跑在工作线程,如何取舍?
第二个问题,怎么解决系统服务之间的相互依赖?
- 分批启动(AMS、PMS、PKMS)
- 分阶段启动(阶段1、阶段2...)
桌面启动
在 AMS 服务就绪的时候,会调用以下函数:
public void systemReady(final Runnable goingCallback) {
//...
startHomeActivityLocked(mCurrentUserId, "systemReady");
}
在 Launcher2 Activity 的 onCreate 里面会启动一个 LoaderTask:
mLoaderTask = new LoaderTask(mApp.getContext(), loadFlags);
这个 LoaderTask 会向 PMS 去查询已经安装的应用:
mPm.queryIntentActivitiesAsUser
说说 Android 系统的启动流程?
- Zygote 是怎么启动的?
- systemServer 是怎么启动的?
- 系统服务是怎么启动的?