这是我结合网上的资料以及自己分析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) {
-
- 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 {
-
- SamplingProfilerIntegration.start();
-
- registerZygoteSocket();
-
- EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
- SystemClock.uptimeMillis());
-
- preload();
-
- EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
- SystemClock.uptimeMillis());
-
-
- SamplingProfilerIntegration.writeZygoteSnapshot();
-
-
- gc();
-
-
- Trace.setTracingEnabled(false);
-
-
- if (argv.length != 2) {
- throw new RuntimeException(argv[0] + USAGE_STRING);
- }
-
- if (argv[1].equals("start-system-server")) {
-
- startSystemServer();
-
- } else if (!argv[1].equals("")) {
- throw new RuntimeException(argv[0] + USAGE_STRING);
- }
-
- Log.i(TAG, "Accepting command socket connections");
-
-
- runSelectLoop();
-
-
- 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() {
-
- 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的代码如下
-
-
-
- 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;
-
-
- int pid;
-
- try {
- parsedArgs = new ZygoteConnection.Arguments(args);
- ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
- ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);
-
-
- pid = Zygote.forkSystemServer(
- parsedArgs.uid, parsedArgs.gid,
- parsedArgs.gids,
- parsedArgs.debugFlags,
- null,
- parsedArgs.permittedCapabilities,
- parsedArgs.effectiveCapabilities);
- } catch (IllegalArgumentException ex) {
- throw new RuntimeException(ex);
- }
-
-
- 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.
至此,整个系统服务已经运行起来了,至于怎么安装程序、启动桌面等,以后再写.