目錄
Android之zygote源碼剖析(一)
Android之zygote源碼剖析(二)
Android之zygote源碼剖析(三)
Android之SystemServer介紹(一)
Android之SystemServer介紹(二)
Android之Launcher介紹(一)
Android之Launcher介紹(二)
SystemServer
從前文中可以看到,Zygote是孵化器刁卜,SystemServer進(jìn)程是由Zygote進(jìn)程孵化出來(lái)的。也就是SystemServer是Zygote進(jìn)程fork出來(lái)的挑辆。
SystemServer是Android系統(tǒng)的核心之一孝情,大部分Android提供的服務(wù)都在該進(jìn)程中。
比如:ActivityManagerService(AMS)魁亦,WindowManagerService(WMS)羔挡,PackagManagerService(PMS)這些系統(tǒng)服務(wù)都是以一個(gè)線程的方式存在Systemserver進(jìn)程中。
從上文我們看到ZygoteInit類(lèi)中執(zhí)行startSystemServer
后婉弹,啟動(dòng)SystemServer進(jìn)程后,會(huì)執(zhí)行handleSystemServerProcess
函數(shù):
private static void handleSystemServerProcess(
ZygoteConnection.Arguments parsedArgs)
throws Zygote.MethodAndArgsCaller {
// set umask to 0077 so new files and directories will default to owner-only permissions.
Os.umask(S_IRWXG | S_IRWXO);
if (parsedArgs.niceName != null) {
Process.setArgV0(parsedArgs.niceName);
}
// 從環(huán)變量獲取systemServerClasspath
final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
if (systemServerClasspath != null) {
performSystemServerDexOpt(systemServerClasspath);
……
}
if (parsedArgs.invokeWith != null) {
String[] args = parsedArgs.remainingArgs;
……
} else {
ClassLoader cl = null;
if (systemServerClasspath != null) {
// 創(chuàng)建PathClassLoader氯哮,用于加載類(lèi)
cl = createPathClassLoader(systemServerClasspath, parsedArgs.targetSdkVersion);
Thread.currentThread().setContextClassLoader(cl);
}
/*
* Pass the remaining arguments to SystemServer.
*/
ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
}
/* should never reach here */
}
handleSystemServerProcess函數(shù)主要做了兩件事情:
- 創(chuàng)建PathClassLoader(加載java類(lèi)使用)
- 執(zhí)行 ZygoteInit.zygoteInit
ZygoteInit.zygoteInit代碼如下:
public static final void zygoteInit(int targetSdkVersion, String[] argv,
ClassLoader classLoader) throws Zygote.MethodAndArgsCaller {
if (RuntimeInit.DEBUG) {
Slog.d(RuntimeInit.TAG, "RuntimeInit: Starting application from zygote");
}
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ZygoteInit");
RuntimeInit.redirectLogStreams();
RuntimeInit.commonInit();
// 啟動(dòng)binder線程池
ZygoteInit.nativeZygoteInit();
// 啟動(dòng)systemserver的main函數(shù)
RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
}
這段代碼也主要干兩件事:
- 啟動(dòng)binder線程池
- 啟動(dòng)systemserver的main函數(shù)
啟動(dòng)binder線程池
nativeZygoteInit函數(shù)是native函數(shù)喉钢,通過(guò)JNI調(diào)用,函數(shù)位于
AndroidRuntime.cpp內(nèi):
static AndroidRuntime* gCurRuntime = NULL;
static void com_android_internal_os_ZygoteInit_nativeZygoteInit(JNIEnv* env, jobject clazz)
{
gCurRuntime->onZygoteInit();
}
onZygoteInit是個(gè)虛函數(shù)幔戏,實(shí)現(xiàn)在app_process.cpp里:
virtual void onZygoteInit()
{
sp<ProcessState> proc = ProcessState::self();
ALOGV("App process: starting thread pool.\n");
// 啟動(dòng)線程池
proc->startThreadPool();
}
這里就啟動(dòng)了binder線程池税课。
啟動(dòng)systemserver的main函數(shù)
接下來(lái)看下applicationInit(RuntimeInit.java
)函數(shù):
protected static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
throws Zygote.MethodAndArgsCaller {
nativeSetExitWithoutCleanup(true);
VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion);
final Arguments args;
try {
args = new Arguments(argv);
} catch (IllegalArgumentException ex) {
Slog.e(TAG, ex.getMessage());
return;
}
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
// 主要執(zhí)行了這個(gè)函數(shù)
invokeStaticMain(args.startClass, args.startArgs, classLoader);
}
繼續(xù)跟蹤invokeStaticMain函數(shù):
private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)
throws Zygote.MethodAndArgsCaller {
Class<?> cl;
try {
// 傳入?yún)?shù)為com.android.server.SystemServer
// 加載類(lèi)進(jìn)入內(nèi)存
cl = Class.forName(className, true, classLoader);
} catch (ClassNotFoundException ex) {
throw new RuntimeException(
"Missing class when invoking static main " + className,
ex);
}
Method m;
try {
// 獲取SystemServer類(lèi)中的main方法
m = cl.getMethod("main", new Class[] { String[].class });
} catch (NoSuchMethodException ex) {
throw new RuntimeException(
"Missing static main on " + className, ex);
} catch (SecurityException ex) {
throw new RuntimeException(
"Problem getting static main on " + className, ex);
}
int modifiers = m.getModifiers();
if (! (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))) {
throw new RuntimeException(
"Main method is not public and static on " + className);
}
// 執(zhí)行main函數(shù)
throw new Zygote.MethodAndArgsCaller(m, argv);
}
從這里就執(zhí)行到了SystemServer的mian函數(shù)垒玲。
classname的定義在startSystemServer函數(shù)中:
String args[] = {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,1032,3001,3002,3003,3006,3007,3009,3010",
"--capabilities=" + capabilities + "," + capabilities,
"--nice-name=system_server",
"--runtime-args",
"com.android.server.SystemServer",
};
今天就到這里找颓,散會(huì)。_