SystemServer的启动过程

本文详细解析了Android系统中SystemServer的启动过程,从init.rc开始,通过Zygote进程的fork,再到SystemServer的创建,重点介绍了启动过程中涉及的关键步骤和源码分析。
摘要由CSDN通过智能技术生成

了解SystemServer之前,我们知道

  • Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的。Zygote进程也不例外,它是在系统启动的过程,由init进程创建的。在系统启动脚本system/core/rootdir/init.rc文件中。—上帝init.rc
  • 系统启动时init进程会创建Zygote进程(准确的说是通过app_main.cpp启动的Zygote进程),Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作。—android大boss,孵化进程
  • Zygote进程会首先创建一个SystemServer进程,SystemServer进程负责启动系统的关键服务,如AMS,PMS等。—android大boss首席小弟
  • 下面查看一波源码,源码版本是2.3.7。

本文分析流程图

1>system/core/rootdir/init.rc

而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的,他会去打开一个叫做app_process的文件夹下面的目录。

文件目录:
可以看到文件目录下有mk文件和一个cpp文件。

mk文件:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
	app_main.cpp

LOCAL_SHARED_LIBRARIES := \
	libcutils \
	libutils \
	libbinder \
	libandroid_runtime

LOCAL_MODULE:= app_process

include $(BUILD_EXECUTABLE)

总体来说,就是去加载app_main.cpp这个文件。

2>frameworks/base/cmds/app_process.rc


核心代码:


 bool startSystemServer = (i < argc) ?  strcmp(argv[i], "--start-system-server") == 0 : false;
            ......
 runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);

这里的runtime实际上是AppRuntime类型,而这个AppRuntime类型在底层是继承了AndroidRuntime.cpp,它调用的start方法实际上就是AndroidRuntime.cpp中的start方法(俩参数的重载)。

AndroidRuntime.cpp#start(const char* className, const bool startSystemServer)


	/*
	 * Start the Android runtime.  This involves starting the virtual machine
	 * and calling the "static void main(String[] args)" method in the class
	 * named by "className".
	 */
	void AndroidRuntime::start(const char* className, const bool startSystemServer)
	{
   
	    LOGD("\n>>>>>> AndroidRuntime START %s <<<<<<\n",
	            className != NULL ? className : "(unknown)");
	
	    char* slashClassName = NULL;
	    char* cp;
	    JNIEnv* env;
	
	    blockSigpipe();
	
	    /* 
	     * 'startSystemServer == true' means runtime is obslete and not run from 
	     * init.rc anymore, so we print out the boot start event here.
	     */
	    if (startSystemServer) {
   
	        /* track our progress through the boot sequence */
	        const int LOG_BOOT_PROGRESS_START = 3000;
	        LOG_EVENT_LONG(LOG_BOOT_PROGRESS_START, 
	                       ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
	    }
	
	    const char* rootDir = getenv("ANDROID_ROOT");
	    if (rootDir == NULL) {
   
	        rootDir = "/system";
	        if (!hasDir(
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值