我们的Android手机在启动的时候都做了些什么,还有手机为什么需要耗费几十秒才能启动起来??
 一、启动过程
    Android系统架构由四层组成,底层为Linux内核层,第二层为Librares(c或c++)层,第三层为frameWork层
    顶层为app层;framework层和app层都算作是java层
    		
  二、详解
      系统引导程序启动Linux内核时,内核会加载各种数据和驱动,有了驱动就开启Android系统并加载用户
   级别的第一个进程init.c
      1.init.c
	mkdir("/dev",0755);-->创建各种文件夹和挂载目录
	init_parse_config_file("/init.rc");-->解析配置文件init.rc,并加载
      2.init.rc
	启动了Zygote进程,这个进程是Android系统启动关键服务的一个母进程
	
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
		    socket zygote stream 666
		    onrestart write /sys/android_power/request_state wake
		    onrestart write /sys/power/state on
		    onrestart restart media
		    onrestart restart netd

      3.App_main.cpp文件
	init.rc启动Zygote进程,但是Zygote的初始化是在App_main.cpp的main方法中完成的,如下
	
int main(int argc, const char* const argv[])
	{
		// 定义Android运行时环境.
	    AppRuntime runtime;
	    int i = runtime.addVmArguments(argc, argv);
	
		...
	
	    bool startSystemServer = (i < argc) ? 
	            strcmp(argv[i], "--start-system-server") == 0 : false;
	    setArgv0(argv0, "zygote");
	    set_process_name("zygote");

		// 使用运行时环境启动Zygote的初始化类.
	    runtime.start("com.android.internal.os.ZygoteInit",
	        startSystemServer);
	
	    ...
	}

      4.ZygoteInit.java
	由此进入java代码层,加载系统运行依赖的class类和依赖的资源文件,由于类和资源文件很多所以
        系统在此处消耗的时间比较长大约20秒左右,这也是系统启动过程中最耗时的地方,然后启动系统的
	核心服务SystemServer
	
public static void main(String argv[]) {
			// 加载系统运行依赖的class类.
            preloadClasses();

			...
            
            if (argv[1].equals("true")) {
				// Zygote孵化器进程开始孵化系统核心服务.
                startSystemServer();
            } else if (!argv[1].equals("false")) {
                throw new RuntimeException(argv[0] + USAGE_STRING);
            }
			
			...
	    }

      5.SystemServer
	首先加载本地的动态链接库,然后调用动态链接库中的c函数,这时代码执行到了Libraries层
	
public static void main(String[] args) {
	        ...
			
			// 加载本地的动态链接库.
	        System.loadLibrary("android_servers");
	
			// 调用动态链接库中的c函数.
	        init1(args);
	    }

	init1(args);中调用了c中的代码com_android_server_SystemServer.cpp
       6.com_android_server_SystemServer
	调用系统初始化类System_init.cpp
	
static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
		{
			// 转调
		    system_init();
		}

		// 此方法没有方法体.
		extern "C" int system_init();

       7.System_init.cpp类
	在本类中开启硬件相关的服务、获取Android运行时调用SystemServer下的init2,进入java层
	
	// 开启一些硬件相关的服务.
		    SensorService::instantiate();
			
			...
		    
			// 获取Android运行时环境
		    AndroidRuntime* runtime = AndroidRuntime::getRuntime();
		
		    LOGI("System server: starting Android services.\n");
			// 调用SystemServer类中静态方法init2. 从native层转到java层.
		    runtime->callStatic("com/android/server/SystemServer", "init2");

       8.init2()
	Android系统服务的初始化
	
public static final void init2() {
	        Slog.i(TAG, "Entered the Android system server!");

			// 进入Android系统服务的初始化.
	        Thread thr = new ServerThread();
	        thr.setName("android.server.ServerThread");
	        thr.start();

	调用ServerThread
       9.ServerThread中run方法执行
	
public void run() {
	        ...
	
	        // 初始化系统的服务, 并且把服务添加ServiceManager中, 便于以后系统进行统一管理.
			ServiceManager.addService("entropy", new EntropyService());

			...
	
	        // 调用了ActivityManagerService的systemReady的方法.
	        ((ActivityManagerService)ActivityManagerNative.getDefault())
	                .systemReady(new Runnable() {
	            public void run() {
	                ...
	            }
	        });
			
			...
	    }

       10.ActivityManagerService
	在本类中调用了ActivityStack中的resumeTopActivityLocked方法,在此方法中开启了系统的第一
	个界面,代码如下
	
	// 找到第一个当前没有关闭的Activity, 系统刚刚系统没有任何Activity执行, 所以next为null
		        ActivityRecord next = topRunningActivityLocked(null);
		
		        // Remember how we'll process this pause/resume situation, and ensure
		        // that the state is reset however we wind up proceeding.
		        final boolean userLeaving = mUserLeaving;
		        mUserLeaving = false;
		
		        if (next == null) {
		            // There are no more activities!  Let's just start up the
		            // Launcher...
		            if (mMainStack) {
						// 开启Launcher应用的第一个Activity界面.
		                return mService.startHomeActivityLocked();
		            }
		        }

	home界面显示,进入手机系统
  三、小结
	以上全都是Android系统的源码,看起来太费劲了,因为不仅有java代码还有c和c++的代码,方法之
    间还来回调用,但是看完源码后的收获是非常大的,虽然很多都还不懂,但是对于Android底层的实现有
    了进一步的认识


Logo

开源、云原生的融合云平台

更多推荐