用Source Insight来追踪Android系统启动流程的源码,并将我认为重要的源码进行分析
1、当系统引导程序启动Linux内核,内核会记载各种数据结构和驱动程序,加载完毕之后,Android系统开始启动并加载第一个用户级别的进程:Init.c(system\core\init)
//Init.c中的main()方法
int main(int argc, char **argv)
{
//解析执行init.rc配置文件
init_parse_config_file("/init.rc");
}
2、执行配置文件init.rc(system\core\rootdir)中定义好的指令,进行环境初始化;执行了很多bin指令,来启动系统服务
//启动孵化器进程,执行app_process(一个编译好的可执行文件)
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_process文件下找到app_main.cpp,查看main()方法
int main(int argc, const char* const argv[])
{
//启动一个系统服务:ZygoteInit
runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);
}
4、在ZygoteInit.java中,查看main()方法
public static void main(String argv[]) {
//预加载Android系统所需要的类
preloadClasses();
if (argv[1].equals("true")) {
//调用方法开启系统服务
startSystemServer();
}
}
preloadClasses(),加载Android运行时环境
/**
* The name of a resource file that contains classes to preload.
*/
//“preloaded-classes”这个文件里面是Android中所有需要加载的全包名
private static final String PRELOADED_CLASSES = "preloaded-classes";
private static void preloadClasses() {
//用类加载器,根据文件名,加载资源作为一个输入流
InputStream is = ZygoteInit.class.getClassLoader().getResourceAsStream(PRELOADED_CLASSES);
BufferedReader br = new BufferedReader(new InputStreamReader(is), 256);
String line;
//一行一行的读取全包名
while ((line = br.readLine()) != null) {
//根据全包名加载类
Class.forName(line);
}
}
startSystemServer(),这个方法开启系统服务
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",
//开启SystemServer服务
"com.android.server.SystemServer",
};
5、启动SystemServer服务
//C库中的init1()方法
native public static void init1(String[] args);
public static void main(String[] args) {
//加载C库
System.loadLibrary("android_servers");
//执行C库里的init1方法
init1(args);
}
在om_android_server_SystemServer.cpp文件,找到init1()方法
static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
//给init1方法映射一个指针,最后调用了system_init()方法,而system_init()没有方法体
{ "init1", "([Ljava/lang/String;)V", (void*)
android_server_SystemServer_init1 },
};
static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{
system_init();
}
extern "C" int system_init();
在system_init.cpp文件中找到system_init()方法
extern "C" status_t system_init()
{
//这个方法里主要是开启硬件管理服务
SensorService::instantiate();
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
//执行SystemServer类中的init2()方法
runtime->callStatic("com/android/server/SystemServer", "init2");
}
回到SystemServer类中的init2()方法
public static final void init2() {
//创建系统服务线程
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();
}
6、在ServerThread类中的run()方法中,开启系统的其他服务
//准备消息轮询器
Looper.prepare();
//启动大量的系统服务并把其逐一添加至ServiceManager
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
//调用ActivityManagerService类中的systemReady()方法,准备创建第一个activity
((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady(new Runnable() {});
7、在ActivityManagerService.java中,找到systemReady()方法
public ActivityStack mMainStack;
public void systemReady(final Runnable goingCallback) {
//启动laucher
mMainStack.resumeTopActivityLocked(null);
}
在ActivityStack.java中找到resumeTopActivityLocked()方法
final boolean resumeTopActivityLocked(ActivityRecord prev) {
ActivityRecord next = topRunningActivityLocked(null);
//判断栈顶是否有activity,没有的话直接启动laucher
if (next == null) {
// There are no more activities! Let's just start up the Launcher...
if (mMainStack) {
return mService.startHomeActivityLocked();
}
}
}
至此,Laucher已经被启动,Android系统启动完成;
声明:本文只做学习交流,欢迎大家提出各类问题,让我们共同进步!!!
最后附上时序图一张