用Source Insight來(lái)追蹤Android系統(tǒng)啟動(dòng)流程的源碼拾酝,并將我認(rèn)為重要的源碼進(jìn)行分析
1缘屹、當(dāng)系統(tǒng)引導(dǎo)程序啟動(dòng)Linux內(nèi)核透乾,內(nèi)核會(huì)記載各種數(shù)據(jù)結(jié)構(gòu)和驅(qū)動(dòng)程序,加載完畢之后熔恢,Android系統(tǒng)開始啟動(dòng)并加載第一個(gè)用戶級(jí)別的進(jìn)程:Init.c(system\core\init)
//Init.c中的main()方法
int main(int argc, char **argv)
{
//解析執(zhí)行init.rc配置文件
init_parse_config_file("/init.rc");
}
2脐湾、執(zhí)行配置文件init.rc(system\core\rootdir)中定義好的指令,進(jìn)行環(huán)境初始化叙淌;執(zhí)行了很多bin指令沥割,來(lái)啟動(dòng)系統(tǒng)服務(wù)
//啟動(dòng)孵化器進(jìn)程,執(zhí)行app_process(一個(gè)編譯好的可執(zhí)行文件)
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[])
{
//啟動(dòng)一個(gè)系統(tǒng)服務(wù):ZygoteInit
runtime.start("com.android.internal.os.ZygoteInit",startSystemServer);
}
4帜讲、在ZygoteInit.java中衅谷,查看main()方法
public static void main(String argv[]) {
//預(yù)加載Android系統(tǒng)所需要的類
preloadClasses();
if (argv[1].equals("true")) {
//調(diào)用方法開啟系統(tǒng)服務(wù)
startSystemServer();
}
}
preloadClasses(),加載Android運(yùn)行時(shí)環(huán)境
/**
* The name of a resource file that contains classes to preload.
*/
//“preloaded-classes”這個(gè)文件里面是Android中所有需要加載的全包名
private static final String PRELOADED_CLASSES = "preloaded-classes";
private static void preloadClasses() {
//用類加載器似将,根據(jù)文件名获黔,加載資源作為一個(gè)輸入流
InputStream is = ZygoteInit.class.getClassLoader().getResourceAsStream(PRELOADED_CLASSES);
BufferedReader br = new BufferedReader(new InputStreamReader(is), 256);
String line;
//一行一行的讀取全包名
while ((line = br.readLine()) != null) {
//根據(jù)全包名加載類
Class.forName(line);
}
}
startSystemServer(),這個(gè)方法開啟系統(tǒng)服務(wù)
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服務(wù)
"com.android.server.SystemServer",
};
5在验、啟動(dòng)SystemServer服務(wù)
//C庫(kù)中的init1()方法
native public static void init1(String[] args);
public static void main(String[] args) {
//加載C庫(kù)
System.loadLibrary("android_servers");
//執(zhí)行C庫(kù)里的init1方法
init1(args);
}
在om_android_server_SystemServer.cpp文件玷氏,找到init1()方法
static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
//給init1方法映射一個(gè)指針,最后調(diào)用了system_init()方法腋舌,而system_init()沒(méi)有方法體
{ "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()
{
//這個(gè)方法里主要是開啟硬件管理服務(wù)
SensorService::instantiate();
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
//執(zhí)行SystemServer類中的init2()方法
runtime->callStatic("com/android/server/SystemServer", "init2");
}
回到SystemServer類中的init2()方法
public static final void init2() {
//創(chuàng)建系統(tǒng)服務(wù)線程
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();
}
6盏触、在ServerThread類中的run()方法中,開啟系統(tǒng)的其他服務(wù)
//準(zhǔn)備消息輪詢器
Looper.prepare();
//啟動(dòng)大量的系統(tǒng)服務(wù)并把其逐一添加至ServiceManager
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
//調(diào)用ActivityManagerService類中的systemReady()方法块饺,準(zhǔn)備創(chuàng)建第一個(gè)activity
((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady(new Runnable() {});
7赞辩、在ActivityManagerService.java中,找到systemReady()方法
public ActivityStack mMainStack;
public void systemReady(final Runnable goingCallback) {
//啟動(dòng)laucher
mMainStack.resumeTopActivityLocked(null);
}
在ActivityStack.java中找到resumeTopActivityLocked()方法
final boolean resumeTopActivityLocked(ActivityRecord prev) {
ActivityRecord next = topRunningActivityLocked(null);
//判斷棧頂是否有activity授艰,沒(méi)有的話直接啟動(dòng)laucher
if (next == null) {
// There are no more activities! Let's just start up the Launcher...
if (mMainStack) {
return mService.startHomeActivityLocked();
}
}
}
至此辨嗽,Laucher已經(jīng)被啟動(dòng),Android系統(tǒng)啟動(dòng)完成淮腾;
聲明:本文只做學(xué)習(xí)交流糟需,歡迎大家提出各類問(wèn)題屉佳,讓我們共同進(jìn)步!V扪骸武花!
最后附上時(shí)序圖一張