当系统引导程序启动Linux内核,内核会加载各种数据结构,和驱动程序,加载完毕之后,Android系统开始启动并加载第一个用户级别的进程:init(system/core/init/Init.c) 查看Init.c代码,看main函数
int main(int argc, char **argv)
{
...
//执行Linux指令
mkdir("/dev" , 0755 );
mkdir("/proc" , 0755 );
mkdir("/sys" , 0755 );
...
//解析执行init.rc配置文件
init_parse_config_file("/init.rc" );
...
}
在system\core\rootdir\Init.rc中定义好的指令都会开始执行,其中执行了很多bin指令,启动系统服务
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
在appprocess文件夹下找到appmain.cpp,查看main函数,发现以下代码
int main(int argc, const char * const argv[])
{
...
runtime.start("com.android.internal.os.ZygoteInit" ,startSystemServer);
...
}
在ZygoteInit.java中,查看main方法
public static void main (String argv[]) {
...
preloadClasses();
...
if (argv[1 ].equals("true" )) {
startSystemServer();
}
...
}
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" ,
"com.android.server.SystemServer" ,
};
...
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids, debugFlags, null ,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
public static void main (String[] args) {
...
System.loadLibrary("android_servers" );
init1(args);
...
}
动态链接库文件和java类包名相同,找到com_android_server_SystemServer.cpp文件 在com_android_server_SystemServer.cpp文件中,找到了
static JNINativeMethod gMethods[] = {
{ "init1" , "([Ljava/lang/String;)V" , (void *) android_server_SystemServer_init1 },
};
android_server_SystemServer_init1方法体中调用了system_init(),system_init()没有方法体 在system_init.cpp文件中找到system_init()方法,方法体中 //执行了SystemServer.java的init2方法 runtime->callStatic(“com/android/server/SystemServer”, “init2”); 回到SystemServer.java,在init2的方法体中
Thread thr = new ServerThread();
thr.start();
Looper.prepare();
...
ServiceManager.addService(Context.WINDOW_SERVICE, wm);
...
((ActivityManagerService)ActivityManagerNative.getDefault())
.systemReady(new Runnable(){
...
});
在ActivityManagerService.java中,有systemReady方法,方法体里找到
mMainStack.resumeTopActivityLocked(null );
在ActivityStack.java中,方法resumeTopActivityLocked
ActivityRecord next = topRunningActivityLocked(null );
...
if (next == null ) {
if (mMainStack) {
return mService.startHomeActivityLocked();
}
}
...