init进程
init进程是Android系统的第一个进程,是所以Android进程的祖先,主要完成两件事
- 解析配置文件init.rc
- 维护一个属性服务property.server
init进程源码在system/core/init
目录下,入口为init.cpp的main()
函数,
init进程启动服务
init进程通过解析init.rc文件(遵守Android Init Language规范);获得需要启动的服务所在路径,启动服务所需要的参数,名称等,并将信息添加至一个链表中.
通过fork+execve创建一个新的进程并让服务运行于新进程.并将pid添加至链表对应位置.
在main()
函数中,还通过注册子进程退出信号监听来重启异常退出的服务,根据pid在链表中查询是哪个进程退出.杀死该进程所以子进程,并重启该进程.
init进程主要启动的服务
- ServiceManager
- zygote进程
- surfacefligner
- media
Zygote进程
Zygote是所有Java进程的祖先.源码在freamwork/base/cmds/app_process/app_main.cpp
中,入口为main()
函数;
zygote在启动时候传入的两个参数是--zygote
和--start-sytem-server
;代表着此进程是启动zygote及启动sytemserver.将会进入AndroidRuntime的start()方法,进行初始化java虚拟机及注册jni函数等.之后执行
com.android.internal.os.ZygoteInit
的java类中的main()
方法.
//freamwork/base/cmds/app_process/app_main.cpp
int main(int argc, char* const argv[])
....
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
}
}
....
void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote){
...
//执行ZygoteInit main方法
jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
"([Ljava/lang/String;)V");
...
env->CallStaticVoidMethod(startClass, startMeth, strArray);
...
}
ZygoteInit.java
在ZygoteInit
main()方法中,通过registerZygoteSocket(socketName);
注册socket;
通过preload()
预加载资源,(通过Class.forName(“xxx”)将常用类加载进来等)
//package: com.android.internal.os.ZygoteInit
public static void main(String argv[]) {
try {
boolean startSystemServer = false;
if ("start-system-server".equals(argv[i])) {
startSystemServer = true;
}
//创建socket链接
registerZygoteSocket(socketName);
//预加载资源
preload();
//启动sytemserver
if (startSystemServer) {
startSystemServer(abiList, socketName);
}
//循环等待socket客户端发过来的请求
runSelectLoop(abiList);
//通过抛异常的方式去执行方法,目的为清空之前的栈,通常为子进程systemServer及app进程
} catch (MethodAndArgsCaller caller) {
caller.run();
}
}
通过捕获异常的方式执行子进程的方法调用,清空方法栈,让子线程以为程序入口为ZygoteInit main().(SystemServer进程为SystemServer.java 的main()
,其他app进程为ActivityThread.java的main()
)
preload();预加载意义为当fork()新进程时,子进程会继承zygote的资源,子进程便省去了启动虚拟机,加载资源等操作,会延长开机启动时间
static void preload() {
...
preloadClasses();
preloadResources();
preloadOpenGL();
preloadSharedLibraries();
preloadTextResources();
...
启动sytemService
在ZygoteInit.java的main()
方法中,如果是Zygote启动,会传入参数,启动systemserver,
private static boolean startSystemServer(String abiList, String socketName)
throws MethodAndArgsCaller, RuntimeException {
int pid;
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids,
parsedArgs.debugFlags,
null,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
if (pid == 0) {
handleSystemServerProcess(parsedArgs);
}
return true;
}
通过forkSystemServer
创建子进程,在子进程(systemserver)中执行handleSystemServerProcess(..)
private static void handleSystemServerProcess(
ZygoteConnection.Arguments parsedArgs)
throws ZygoteInit.MethodAndArgsCaller {
RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
}
}
public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
throws ZygoteInit.MethodAndArgsCaller {
//打开binder,启动线程池,
nativeZygoteInit();
//继续执行
applicationInit(targetSdkVersion, argv, classLoader);
}
private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
throws ZygoteInit.MethodAndArgsCaller {
//继续
invokeStaticMain(args.startClass, args.startArgs, classLoader);
}
private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)
throws ZygoteInit.MethodAndArgsCaller {
//className="com.android.server.SystemServer"由ZygoteInit的startSystemServer()传递过来
cl = Class.forName(className, true, classLoader);
//抛出异常,交由ZygoteInit的main()方法执行,目的为清空之前的方法栈
throw new ZygoteInit.MethodAndArgsCaller(m, argv);
}
抛出需要执行的方法的异常,在ZygoteInit.java的main()
中捕获,并通过反射调用SystemServer.java的main方法