赞
踩
在整个android系统中,进程的启动流程如下:
先启动init进程,它是整个linux系统的根进程,接着启动了Zygote进程,它是Android系统的根进程,接着启动的就是本文要讲到的SystemServer进程,它管理着Android系统的各种系统服务,然后才是启动各种上层应用进程。
SystemServer也是Android Java的两大支柱,另一大支柱是专门负责孵化Java进程的Zygote进程(SystemServer也是由其孵化),这两大支柱任何一个倒了都会导致Android Java崩溃,然后Linux系统的init进程 会重新启动两大支柱 以重建 Android Java。
刚刚提到,System_server是在Zygote进程中被启动的,源码在frameworks/base/core/java/com/android/internal/os/ZygoteInit.java 中:
public static void main(String argv[]) { ... if (startSystemServer) { startSystemServer(abiList, socketName); } ... } /** * Prepare the arguments and fork for the system server process. */ private static boolean startSystemServer(String abiList, String socketName) throws MethodAndArgsCaller, RuntimeException { ... /* Hardcoded command line to start the system server */ String args[] = { // 注释1 启动System_server的相关固定参数 "--setuid=1000", "--setgid=1000", "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1032,3001,3002,3003,3006,3007", "--capabilities=" + capabilities + "," + capabilities, "--nice-name=system_server", "--runtime-args", "com.android.server.SystemServer", }; ZygoteConnection.Arguments parsedArgs = null; int pid; try { parsedArgs = new ZygoteConnection.Arguments(args); ZygoteConnection.applyDebuggerSystemProperty(parsedArgs); ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs); /* Request to fork the system server process */ pid = Zygote.forkSystemServer(//注释2 从Zygote fork System_server进程 parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, parsedArgs.debugFlags, null, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities); } ... /* For child process */ if (pid == 0) { if (hasSecondZygote(abiList)) { waitForSecondaryZygote(socketName); } //注释3 完成刚启动的System_server进程的剩余部分工作 handleSystemServerProcess(parsedArgs); } return true; }
相关的代码解释已经写在注释中了,上面注释3 调用的方法是用来做启动System_server进程后一些剩余的工作,看代码:
/** * Finish remaining work for the newly forked system server process. */ private static void handleSystemServerProcess( ZygoteConnection.Arguments parsedArgs) throws ZygoteInit.MethodAndArgsCaller {main closeServerSocket();//注释1 关掉socket, Android中除了Zygote进程,其他进程之间的通信都是通过Binder完成 ... /* * Pass the remaining arguments to SystemServer. */ //注释2 调用此方法会启动Binder线程池 以及 启动SystemServer RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl); ... }
上述代码中,注释1 SyetemServer进程是复制了Zygote进程的地址空间,因此也会得到Zygote进程创建的Socket,这个Socket对于SyetemServer进程没有用处,所以关闭。 注释2中,调用RuntimeInit的zygoteInit函数会启动System_server的Binder线程池,跟进代码RuntimeInit.zygoteInit:
public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
throws ZygoteInit.MethodAndArgsCaller {
...
nativeZygoteInit();//注释1
applicationInit(targetSdkVersion, argv, classLoader);//注释2
}
此处 注释1 去启动了Binder线程池, 注释2进入了 System_server的 main方法,注释1最终会进入native层,感兴趣的可以跟进去,我们接着看注释2:
private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
...
invokeStaticMain(args.startClass, args.startArgs, classLoader);
}
,
private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader) throws ZygoteInit.MethodAndArgsCaller { Class<?> cl; try { cl = Class.forName(className, true, classLoader); } catch (ClassNotFoundException ex) { throw new RuntimeException( "Missing class when invoking static main " + className, ex); } Method m; try { 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); } throw new ZygoteInit.MethodAndArgsCaller(m, argv); }
此处通过反射调用了SystemServer的main方法,并以抛出MethodAndArgsCaller这个 异常方式让其被 ZygoteInit.java的main函数捕获:
public static void main(String argv[]) {
...
closeServerSocket();
} catch (MethodAndArgsCaller caller) {
caller.run();//注释1
} catch (RuntimeException ex) {
Log.e(TAG, "Zygote died with exception", ex);
closeServerSocket();
throw ex;
}
}
在注释1 调用了 run方法,进入这个run方法:
public static class MethodAndArgsCaller extends Exception
implements Runnable {
...
public MethodAndArgsCaller(Method method, String[] args) {
mMethod = method;
mArgs = args;
}
public void run() {
try { //此处反射区调用 SystemServer的 main方法
mMethod.invoke(null, new Object[] { mArgs });
}
...
}
}
首先进入SystemServer进程的main函数:
public static void main(String[] args) {
new SystemServer().run();
}
,进入了run :
private void run() { try { //初始化时间,最早只能是1970年 if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) { Slog.w(TAG, "System clock is before 1970; setting to 1970."); SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); } ... // Mmmmmm... more memory! VMRuntime.getRuntime().clearGrowthLimit(); //由于SystemServer进程一直在运行,所以内存使用率要尽可能高一些 VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); // 有些设备依赖于运行时指纹生成,因此请确保在进一步启动之前已经定义了指纹。 Build.ensureFingerprintProperty(); // 调用当前进程的mainLooper的 prepare android.os.Process.setThreadPriority( android.os.Process.THREAD_PRIORITY_FOREGROUND); android.os.Process.setCanSelfBackground(false); Looper.prepareMainLooper(); // SystemServer的 JNI代码 System.loadLibrary("android_servers"); ... // 【注释1】初始化当前进程的 Context createSystemContext(); // Create the system service manager. mSystemServiceManager = new SystemServiceManager(mSystemContext); LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); } finally { Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } try { startBootstrapServices();//【注释2】 启动引导服务 startCoreServices();//【注释3】 启动核心服务 startOtherServices();//【注释4】 启动其他服务 } ... // 开启消息死循环 Looper.loop(); throw new RuntimeException("Main thread loop unexpectedly exited"); }
run方法内容很多,我们把关键的找出来,上面注释1 初始了当前进程的上下文Context:
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar);
}
在SystemServer中,其他应用的Activity等Context都是以 ActivityThread的形式存在。
注释2、3、4就是启动SystemServer管理的各种Android系统服务:
系统服务有很多,这里只展示一部分,以后再筛选用的比较多的来进行分析。我们接着刚刚的启动服务代码看:
private void startBootstrapServices() {
//需要在安装应用前启动此服务,才能创建关键目录,如具有适当权限的/data/user。我们需要在初始化其他服务之前完成此操作。
Installer installer = mSystemServiceManager.startService(Installer.class);
//启动 Activity manager
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
...
}
在代码中看到,在上述注释【3】【4】【5】启动的各种服务,通常都是通过 mSystemServiceManager.startService()来启动的,然后会调用add(service) :
/** * Starts a service by class name. * @return The service instance. */ public SystemService startService(String className) { final Class<SystemService> serviceClass;//此处泛型为SystemService,说明所有的服务类都必须实现SystemService try { serviceClass = (Class<SystemService>)Class.forName(className); } catch (ClassNotFoundException ex) { Slog.i(TAG, "Starting " + className); throw new RuntimeException("Failed to create service " + className + ": service class not found, usually indicates that the caller should " + "have called PackageManager.hasSystemFeature() to check whether the " + "feature is available on this device before trying to start the " + "services that implement it", ex); } return startService(serviceClass); // 注释1 }
此处注释1 继续往下跟:
/** * 创建一个系统服务,该服务必须实现SystemService接口 * * @return 返回实例或者 null * @throws RuntimeException if the service fails to start. */ public <T extends SystemService> T startService(Class<T> serviceClass) { try { final String name = serviceClass.getName(); // Create the service. if (!SystemService.class.isAssignableFrom(serviceClass)) { throw new RuntimeException("Failed to create " + name + ": service must extend " + SystemService.class.getName()); } final T service; try { Constructor<T> constructor = serviceClass.getConstructor(Context.class); service = constructor.newInstance(mContext); } catch (InstantiationException ex) { throw new RuntimeException("Failed to create service " + name + ": service could not be instantiated", ex); } catch (IllegalAccessException ex) { throw new RuntimeException("Failed to create service " + name + ": service must have a public constructor with a Context argument", ex); } catch (NoSuchMethodException ex) { throw new RuntimeException("Failed to create service " + name + ": service must have a public constructor with a Context argument", ex); } catch (InvocationTargetException ex) { throw new RuntimeException("Failed to create service " + name + ": service constructor threw an exception", ex); } // Register it. mServices.add(service);//【注释1】 添加服务,注册到SystemServer // Start it. try { service.onStart();//【注释2】 启动服务 } catch (RuntimeException ex) { throw new RuntimeException("Failed to start service " + name + ": onStart threw an exception", ex); } return service; } finally { Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } }
创建服务成功后,在注释1 处 将服务注册到SystemServer, 注释2 启动服务
SyetemServer启动流程梳理:
1.Zygote进程fork出SystemServer进程,并关闭没用的socket;
3.创建SystemServiceManager用于对系统的服务进行创建、启动和生命周期管理;
4.SystemServer进程主要用于启动系统中的服务并进行管理。
5.服务对象都有自己的异步消息对象,并运行在单独的线程中;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。