Android系统的启动流程简要分析

这是我结合网上的资料以及自己分析android4.4的源码整理的笔记,对整个安卓系统的流程启动进行了梳理,很多细节并未展开,只是简要的进行了介绍.


一.Android系统的架构介绍


Android的整个系统分为四层,从上至下为应用层、框架层、系统库、Linux内核层.




1.应用层


各种系统应用,比如电话、浏览器、日历等.


2.框架层


也就是Framework层,提供各种服务,比如下图的一些.




3.系统库


3.1. 提供核心类库,比如OpenGl,SQlite

3.2.提供Davlik虚拟机和Java核心类库

如下图举例




4.Linux内核层


提供各种驱动和硬件抽象层.


二.Android系统的启动流程

先放张启动流程图,跟着流程走



Linux内核启动后会启动init进程,init是所有进程的父进程,代码位于根目录下 system\core\init



init进程的作用主要是显示开机动画,通过解析init.rc脚本然后启动一系列服务和进程.
这里的服务包括媒体服务MediaServer和服务管理者ServiceManager,ServiceManager是服务的管家,添加、注册和获取服务都通过它.
这里的进程包括安装app、内存管理、Zygote等进程等.
最核心的的是Zygote进程,它是Android系统的第一个Java进程. ,它是由init进程执行app_process程序启动的,app_process 程序代码位于frameworks/base/cmds/app_process


在app_main.cpp里启动ZygoteInit和Davlik虚拟机

 if (zygote) {
    	//启动ZygoteInit,Davlik虚拟机
    	runtime.start("com.android.internal.os.ZygoteInit",
                startSystemServer ? "start-system-server" : "");
    } else if (className) {
        
        runtime.mClassName = className;
        runtime.mArgC = argc - i;
        runtime.mArgV = argv + i;
        runtime.start("com.android.internal.os.RuntimeInit",
                application ? "application" : "tool");
    } else {
        fprintf(stderr, "Error: no class name or --zygote supplied.\n");
        app_usage();
        LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
        return 10;
    }


看下ZygoteInit这个类,它位于frameworks\base\core\java\com\android\internal\os目录下.




它的代码如下,看它在main方法里究竟做了有一些什么事情.


public static void main(String argv[]) {
        try {
            // 初始化Zygote
            SamplingProfilerIntegration.start();
            //注册ZygoteSocket服务
            registerZygoteSocket();
            
            EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
                SystemClock.uptimeMillis());
            //预加载Framework大部分的类和资源
            preload();
            
            EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
                SystemClock.uptimeMillis());

            //完成Zygote的初始化
            SamplingProfilerIntegration.writeZygoteSnapshot();

            // 在启动之后做一次垃圾回收
            gc();
          
            //禁止追踪,以便于派生的进程不继承这个标记
            Trace.setTracingEnabled(false);
     
            //	如果有需求,直接从Zygote启动system server             
            if (argv.length != 2) {
                throw new RuntimeException(argv[0] + USAGE_STRING);
            }
            
            if (argv[1].equals("start-system-server")) {
            	// fork一个新的进程system_server
            	startSystemServer();
            
            } else if (!argv[1].equals("")) {
                throw new RuntimeException(argv[0] + USAGE_STRING);
            }

            Log.i(TAG, "Accepting command socket connections");

            //处理客户端连接请求
            runSelectLoop();

            //关闭服务Socket
            closeServerSocket();
        } catch (MethodAndArgsCaller caller) {
            caller.run();
        } catch (RuntimeException ex) {
            Log.e(TAG, "Zygote died with exception", ex);
            closeServerSocket();
            throw ex;
        }
    }


1.初始化Zygote

在这里开启对系统性能的统计


2.注册ZygoteSocket服务

创建了一个Socket接口,用来和AMS(ActivityManagerService)通信


3.预加载Framework大部分的类和资源


它会开启3个线程分别预加载3个东西:类、资源和OpenGl


static void preload() {
    	Thread preloadClasses = new Thread(new Runnable() {
			public void run() {
		        //加载类
				preloadClasses();
			}
		});
    	Thread preloadResources = new Thread(new Runnable() {
			public void run() {
				//加载资源
				preloadResources();
			}
		});
    	Thread preloadOpenGL = new Thread(new Runnable() {
			public void run() {
				//加载OpenGL
				preloadOpenGL();
			}
		});
    	
    	preloadClasses.start();
    	preloadResources.start();
    	preloadOpenGL.start();
    	try {
			preloadClasses.join();
			preloadResources.join();
			preloadOpenGL.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
    }


4.完成Zygote的初始化

结束统计并生成结果文件

5.在启动之后做一次垃圾回收

6.fork一个新的进程system_server

fork是linux的的方法,会复制出一个与原来进程一样的进程,但是如果初始参数或者传入的变量不同,两个进程也可以做不同的事.

startSystemServer的代码如下

/**
     * 准备参数和fork 系统服务进程 
     */ 
    private static boolean startSystemServer()
            throws MethodAndArgsCaller, RuntimeException {
        long capabilities = posixCapabilitiesAsBits(
            OsConstants.CAP_KILL,
            OsConstants.CAP_NET_ADMIN,
            OsConstants.CAP_NET_BIND_SERVICE,
            OsConstants.CAP_NET_BROADCAST,
            OsConstants.CAP_NET_RAW,
            OsConstants.CAP_SYS_MODULE,
            OsConstants.CAP_SYS_NICE,
            OsConstants.CAP_SYS_RESOURCE,
            OsConstants.CAP_SYS_TIME,
            OsConstants.CAP_SYS_TTY_CONFIG,
            OsConstants.CAP_BLOCK_SUSPEND
        );
        /* 启动系统服务的核心命令行 */       	 
        String args[] = {
            "--setuid=1000",
            "--setgid=1000",
            "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1032,3001,3002,3003,3006,3007",
            "--capabilities=" + capabilities + "," + capabilities,
            "--runtime-init",
            "--nice-name=system_server",
            "com.android.server.SystemServer",
        };
        ZygoteConnection.Arguments parsedArgs = null;

        //进程id
        int pid;

        try {
            parsedArgs = new ZygoteConnection.Arguments(args);
            ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
            ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);

            /* 请求fork系统服务进程 */
            pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.debugFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);
        } catch (IllegalArgumentException ex) {
            throw new RuntimeException(ex);
        }

        /* 对新fork出的系统进程,执行handleSystemServerProcess() */
        if (pid == 0) {
            handleSystemServerProcess(parsedArgs);
        }

        return true;
    }
代码里会fork出SystemServer.之后进入到SystemServer.java这个类中.

代码位于:frameworks/base/services/java/com/android/server/SystemServer.java

SystemServer的main方法会调用

ServerThread thr = new ServerThread();
thr.initAndLoop();

开启一个线程ServerThread,在这里面加载各种服务,比如WindowManagerServer(Wms)、ActivityManagerService(Ams)、PackageManagerServer(Pms)等.

7.runSelectLoop

处理客户端的连接请求,等待其他进程的请求.

8.closeServerSocket()

关闭服务Socket.


至此,整个系统服务已经运行起来了,至于怎么安装程序、启动桌面等,以后再写.


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值