strcmp(argv[i],"--start-system-server")==0:
false;
setArgv0(argv0,"zygote");
set_process_name("zygote");
runtime.start("com.android.internal.os.ZygoteInit",
startSystemServer);
}else{
set_process_name(argv0);
runtime.mClassName=arg;
//Remainderofargsgetpassedtostartupclassmain()
runtime.mArgC=argc-i;
runtime.mArgV=argv+i;
LOGV("Appprocessisstartingwithpid=%d,class=%s.\n",
getpid(),runtime.getClassName());
runtime.start();
}
首先创建AppRuntime,即AndroidRuntime,建立了一个Dalvik虚拟机。
通过这个runtime传递com.android.internal.os.ZygoteInit参数,从而由Dalvik虚拟机运行ZygoteInit.java的main(),开始创建Zygote进程。
在其main()中,如下所示:
registerZygoteSocket();
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
SystemClock.uptimeMillis());
preloadClasses();
//cacheRegisterMaps();
preloadResources();
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
SystemClock.uptimeMillis());
//Finishprofilingthezygoteinitialization.
SamplingProfilerIntegration.writeZygoteSnapshot();
//Doaninitialgctocleanupafterstartup
gc();
//Ifrequested,startsystemserverdirectlyfromZygote
if(argv.length!
=2){
thrownewRuntimeException(argv[0]+USAGE_STRING);
}
if(argv[1].equals("true")){
startSystemServer();
}elseif(!
argv[1].equals("false")){
thrownewRuntimeException(argv[0]+USAGE_STRING);
}
首先通过registerZygoteSocket()登记端口,接着preloadClasses()装载相关类。
这里大概要装载1000多个类,具体装载类见platform\frameworks\base\preloaded-classes。
这个文件有WritePreloadedClassFile类自动生成。
分析该类的main函数,有如下一段筛选类的代码:
//Preloadclassesthatwereloadedbyatleast2processes.Hopefully,
//thememoryassociatedwiththeseclasseswillbeshared.
for(LoadedClassloadedClass:
root.loadedClasses.values()){
Setnames=loadedClass.processNames();
if(!
Policy.isPreloadable(loadedClass)){
continue;
}
if(names.size()>=MIN_PROCESSES||
(loadedClass.medianTimeMicros()>MIN_LOAD_TIME_MICROS&&names.size()>1)){
toPreload.add(loadedClass);
}
}
intinitialSize=toPreload.size();
System.out.println(initialSize
+"classseswereloadedbymorethanoneapp.");
//Preloadeligableclassesfromapplications(notlong-running
//services).
for(Procproc:
root.processes.values()){
if(proc.fromZygote()&&!
Policy.isService(proc.name)){
for(Operationoperation:
proc.operations){
LoadedClassloadedClass=operation.loadedClass;
if(shouldPreload(loadedClass)){
toPreload.add(loadedClass);
}
}
}
}
其中MIN_LOAD_TIME_MICROS等于1250,当类的装载时间大于1.25ms,则需要预装载。
Policy.isPreloadable()定于如下:
/**Reportsifthegivenclassshouldbepreloaded.*/
publicstaticbooleanisPreloadable(LoadedClassclazz){
returnclazz.systemClass&&!
EXCLUDED_CLASSES.contains(clazz.name);
}
其中EXCLUDED_CLASSES如下定义:
/**
*Classeswhichweshouldn'tloadfromtheZygote.
*/
privatestaticfinalSetEXCLUDED_CLASSES
=newHashSet(Arrays.asList(
//Binders
"android.app.AlarmManager",
"android.app.SearchManager",
"android.os.FileObserver",
"com.android.server.PackageManagerService$AppDirObserver",
//Threads
"android.os.AsyncTask",
"android.pim.ContactsAsyncHelper",
"java.lang.ProcessManager"
));
这几个Binders和Thread是不会被预加载的。
另外还有一些application需要装载,要求满足条件proc.fromZygote()且不是属于常驻内存的服务。
SERVICES定义如下:
/**
*Longrunningservices.Thesearerestrictedintheircontributiontothe
*preloaderbecausetheirlaunchtimeislesscritical.
*/
//TODO:
Generatethisautomaticallyfrompackagemanager.
privatestaticfinalSetSERVICES=newHashSet(Arrays.asList(
"system_server",
"com.google.process.content",
"android.process.media",
"com.android.bluetooth",
"com.android.calendar",
"com.android.inputmethod.latin",
"com.android.phone",
"com.google.android.apps.maps.FriendService",//prefroyo
"com.google.android.apps.maps:
FriendService",//froyo
"com.google.android.apps.maps.LocationFriendService",
"com.google.android.deskclock",
"com.google.process.gapps",
"android.tts"
));
preloaded-classes是在下载源码的时候生成,WritePreloadedClassFile类并没有被用到,但可以通过这个类了解Android系统对预加载类的默认要求,参考修改preloaded-classes文件,减少开机初始化时要预加载的类,提高开机速度。
最后来通过startSystemServer()启动SystemServer进程。
见如下代码:
/*Hardcodedcommandlinetostartthesystemserver*/
Stringargs[]={
"--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",
};
ZygoteConnection.ArgumentsparsedArgs=null;
intpid;
try{
parsedArgs=newZygoteConnection.Arguments(args);
/*
*Enabledebuggingofthesystemprocessif*either*thecommandlineflags
*indicateitshouldbedebuggableorthero.debuggablesystemproperty
*issetto"1"
*/
intdebugFlags=parsedArgs.debugFlags;
if("1".equals(SystemProperties.get("ro.debuggable")))
debugFlags|=Zygote.DEBUG_ENABLE_DEBUGGER;
/*Requesttoforkthesystemserverprocess*/
pid=Zygote.forkSystemServer(
parsedArgs.uid,parsedArgs.gid,
parsedArgs.gids,debugFlags,null,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities)
Zygote包装了Linux的fork。
forkSystemServer()调用forkAndSpecialize(),最终穿过虚拟机调用platform\dalvik\vm\native\dalvik_system_Zygote.c中Dalvik_dalvik_system_Zygote_forkAndSpecialize()。
由dalvik完成fork新的进程。
main()最后会调用runSelectLoopMode(),进入while循环,由peers创建新的进程。
l SystemService进程
SystemService用于创建init.rc定义的服务之外的所有服务。
在main()的最后有如下代码:
//Thesystemserverhastorunallofthetime,soitneedstobe
//asefficientaspossiblewithitsmemoryusage.
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
System.loadLibrary("android_servers");
init1(args);
Init1()是在native空间实现的,用于启动native空间的服务,其实现在com_android_server_SystemServer.cpp中的android_server_SystemServer_init1():
staticvoidandroid_server_SystemServer_init1(JNIEnv*env,jobjectclazz)
{
system_init();
}
而system_init()服务初始化创建native层的各个服务:
//Startthesensorservice
SensorService:
:
instantiate