这是我结合网上的资料以及自己分析android4.4的源码整理的笔记,对整个安卓系统的流程启动进行了梳理,很多细节并未展开,只是简要的进行了介绍.
一.Android系统的架构介绍
Android的整个系统分为四层,从上至下为应用层、框架层、系统库、Linux内核层.
1.应用层
各种系统应用,比如电话、浏览器、日历等.
2.框架层
也就是Framework层,提供各种服务,比如下图的一些.
3.系统库
3.1. 提供核心类库,比如OpenGl,SQlite
3.2.提供Davlik虚拟机和Java核心类库
如下图举例
4.Linux内核层
提供各种驱动和硬件抽象层.
二.Android系统的启动流程
在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.
至此,整个系统服务已经运行起来了,至于怎么安装程序、启动桌面等,以后再写.