Android系统启动概述
上电开机,CPU获取第一条指令,执行BootLoader引导装载程序;
BootLoader加载Linux内核并启动内核,加载各种驱动和数据结构;
内核启动第一个用户进程,也就是内核空间到用户空间启动的第一个进程——init进程(c代码);
init进程读取配置文件init.rc,配置文件中会启动一个Zygote孵化器进程App_main.cpp(由c进入c++代码);
Zygote进程启动Java级别的第一个进程ZygoteInit.java(从c++到了java代码);
ZygoteInit进程分叉出新的进程SystemServer.java;
SystemServer中jni调用init1方法,找到SystemServer.cpp类,又执行system_init方法,找到System_init.cpp;
System_init中启动各种硬件服务,并回调SystemServer.java的init2方法,init2中启动ServerThread线程;
ServerThread初始化Looper轮询器、启动各种服务,调用systemReady方法,找到ActivityManagerService;
ActivityManagerService加载各种组件,调用resumeTopActivityLocked方法,找到ActivityStack类;
ActivityStack调用startHomeActivityLocked方法,返回待机画面的Activity,系统启动完成。
注:Bootloader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。
Android系统启动过程图
核心源码位置
关键类 | 路径 |
---|---|
init.c | system/core/init/init.c |
init.rc | system/core/rootdir/init.rc |
Zygote.java | frameworks/base/core/java/com/android/internal/os/Zygote.java |
ZygoteInit.java | frameworks/base/core/java/com/android/internal/os/ZygoteInit.java |
SystemServer.java | frameworks/base/services/java/com/android/server/SystemServer.java |
com_android_server_SystemServer.cpp |
frameworks/base/services/jni/... |
Android系统启动详述
1、init.c源代码的main方法如下:(system/core/init/init.c)
init这个进程是一个守护进程,确切的说,它是Linux系统中用户控件的第一个进程,所以它的进程号是1。它的生命周期贯穿整个linux 内核运行的始终, linux中所有其它的进程的共同始祖均为init进程。
int main(int argc, char **argv)
{
...
创建目录并且挂载该目录
log_init(); //初始化日志
...
init_parse_config_file("/init.rc"); //解析配置文件init.rc
...
return 0;
}
2、init.rc配置文件(system/core/rootdir/init.rc)
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
解读:在Init.zygote32.rc中,定义了一个zygote服务:zygote,由关键字service告诉init进程创建一个名为zygote的进程,这个进程要执行的程序是:/system/bin/app_process,给这个进程四个参数:
-Xzygote:该参数将作为虚拟机启动时所需的参数
/system/bin:代表虚拟机程序所在目录
--zygote:指明以ZygoteInit.java类中的main函数作为虚拟机执行入口
--start-system-server:告诉Zygote进程启动SystemServer进程
3、Zygote孵化器进程App_main.cpp(由c进入c++代码)
int main(int argc, const char* const argv[])
{
...
AppRuntime runtime; //Android运行时环境
if (i < argc) {
arg = argv[i++];
if (0 == strcmp("--zygote", arg)) {
bool startSystemServer = (i < argc) ?
strcmp(argv[i], "--start-system-server") == 0 : false;
setArgv0(argv0, "zygote");
set_process_name("zygote");
runtime.start("com.android.internal.os.ZygoteInit",
startSystemServer); //启动Java级别的第一个进程ZygoteInit.java
}
...
}
4、com.android.internal.os.ZygoteInit Java类(java层的孵化器进程)
public static void main(String argv[]) {
try {
VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024); //设置最小堆内存5M
...
preloadClasses(); //预加载类和资源 ,该方法细节看2步
// Do an initial gc to clean up after startup
gc(); //强制执行一次垃圾收集
// 传入的参数满足if 等于true,不然抛异常
if (argv[1].equals("true")) {
startSystemServer();//详情看第3步
}
...
}//end main
//2步 preloadClasses()
private static void preloadClasses() {
final VMRuntime runtime = VMRuntime.getRuntime();
InputStream is = ZygoteInit.class.getClassLoader().getResourceAsStream(
PRELOADED_CLASSES);//类的配置文件 1800多个类
try {
BufferedReader br
= new BufferedReader(new InputStreamReader(is), 256);
int count = 0;
String line;
while ((line = br.readLine()) != null) {
Class.forName(line);//加载每一个类
...
}
//3步 startSystemServer()方法
private static boolean startSystemServer()
throws MethodAndArgsCaller, RuntimeException {
/* Hardcoded command line to start the system server */
String args[] = {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003",
"--capabilities=130104352,130104352",
"--runtime-init",
"--nice-name=system_server",//进程的名字system_server
"com.android.server.SystemServer",//启动的类名
};
ZygoteConnection.Arguments parsedArgs = null;
int pid;
try {
//把参数封装到对象中
parsedArgs = new ZygoteConnection.Arguments(args);
//分叉进程
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids, debugFlags, null,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
...
return true;
}
注:Zygote进程共做了如下几件事。
1. 创建AppRuntime并调用其start方法,启动Zygote进程。
2. 创建JavaVM并为JavaVM注册JNI.
3. 通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。
4. 通过registerZygoteSocket函数创建服务端Socket,预加载类和资源,并通过runSelectLoop函数等待如ActivityManagerService等的请求。
5. 启动SystemServer进程。
5、com.android.server.SystemServer 分叉出该进程,main方法主要代码如下:
SystemServer是由Zygote孵化而来的一个进程,通过ps命令,我们发现其进程名为:system_server。
有两个方法:init1()启动Native世界,init2()启动Android的Framework世界。
public static void main(String[] args) {
...
// The system server has to run all of the time, so it needs to be
// as efficient as possible with its memory usage.
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
//加载android_servers库 jni
System.loadLibrary("android_servers"); //加载 libxxx.so文件
init1(args);//通过jni调用的目的:通过c来启动底层的硬件服务
}
native public static void init1(String[] args); //在c或c++中实现
6、com_android_server_SystemServer.cpp, 该类的主要代码如下:
会启动系统的硬件服务,比如Audio、Camera等。
extern "C" int system_init(); //类似java的抽象方法,在System_init.cpp中,详情看2步
static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{
system_init();
}
/*
* JNI registration.
*/
static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
{ "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },
};
//2步 System_init.cpp类 中system_init()方法主要代码如下:
extern "C" status_t system_init()
{
LOGI("Entered system_init()");
// Start the sensor service
SensorService::instantiate();
// 启动硬件服务(c代码才可以直接操作硬件)
if (!proc->supportsProcesses()) {
// Start the AudioFlinger
AudioFlinger::instantiate();
// Start the media playback service
MediaPlayerService::instantiate();
// Start the camera service
CameraService::instantiate();
// Start the audio policy service
AudioPolicyService::instantiate();
}
LOGI("System server: starting Android runtime.\n");
AndroidRuntime* runtime = AndroidRuntime::getRuntime();
LOGI("System server: starting Android services.\n");
//详情看3步
runtime->callStatic("com/android/server/SystemServer", "init2");
...
return NO_ERROR;
//3步 SystemServer类的静态方法init2,代码如下:
public static final void init2() {
Slog.i(TAG, "Entered the Android system server!");
//启动线程
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();
}
7、ServerThread类的run方法,主要代码如下:
ServerThread是SystemServer的内部类。
@Override
public void run() {
//轮询器的初始化
Looper.prepare();
...
//启动各种服务
// make sure the ADB_ENABLED setting value matches the secure
//几种服务的ready准备
...
((ActivityManagerService)ActivityManagerNative.getDefault())
.systemReady(new Runnable() { //systemReady方法
public void run() {
Slog.i(TAG, "Making services ready");
if (statusBarF != null) statusBarF.systemReady2();
if (batteryF != null) batteryF.systemReady();
if (connectivityF != null) connectivityF.systemReady();
if (dockF != null) dockF.systemReady();
if (usbF != null) usbF.systemReady();
if (uiModeF != null) uiModeF.systemReady();
if (recognitionF != null) recognitionF.systemReady();
Watchdog.getInstance().start();
// It is now okay to let the various system services start their
// third party code...
if (appWidgetF != null) appWidgetF.systemReady(safeMode);
if (wallpaperF != null) wallpaperF.systemReady();
if (immF != null) immF.systemReady();
if (locationF != null) locationF.systemReady();
if (throttleF != null) throttleF.systemReady();
}
});
...
//轮询器已经开监听消息(轮询取消息)
Looper.loop();
Slog.d(TAG, "System ServerThread is exiting!");
}
8、ActivityManagerService类的systemReady方法,主要代码如下:
public void systemReady(final Runnable goingCallback) {
...
final ArrayList<ComponentName> doneReceivers = new ArrayList<ComponentName>();
...
加载各种Activity组件
mMainStack.resumeTopActivityLocked(null);
}
}
9、ActivityStack类的resumeTopActivityLocked方法,主要代码如下:
final boolean resumeTopActivityLocked(ActivityRecord prev) {
//系统刚开始启动,任务栈中还不存在Activity
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;
//第一次加载,没有任何Activity存在
if (next == null) {
// There are no more activities! Let's just start up the
// Launcher...
if (mMainStack) {
//系统刚开始启动成功 ,返回的就是待机画面的Activity
return mService.startHomeActivityLocked();
}
}
...
}
视频学习路径
百度网盘:https://pan.baidu.com/s/1qGQac82pil_5dql1zxZocQ
提取码:a2wt