赞
踩
SystemServer启动流程从ZygoteInit.main()
方法开始执行
1. ZygoteInit.java main()
@UnsupportedAppUsage public static void main(String[] argv) { ... ... if (startSystemServer) { Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer); //创建SystemServer,r就是后面反射返回的MethodAndArgsCaller // {@code r == null} in the parent (zygote) process, and {@code r != null} in the // child (system_server) process. if (r != null) { // 如果是zygote进行,r就为null r.run(); //执行MethodAndArgsCaller的run方法 return; } } ... ... }
2. ZygoteInit.java forkSystemServer()
在这个方法中有几个点需要注意:
① args数组中的nice-name表示进程名
② pid = Zygote.forkSystemServer() 表示fork SystemServer进程,这个pid与进程id(PID)不一样,父进程的pid=子进程的PID, 子进程pid=0
例如SystemServer进程的PID=1000, 则zygote的pid=1000, SystemServer的pid=0
③ if (pid == 0) 这个if语句里面的代码只有SystemServer进程才会进入执行,也就是这个语句中的handleSystemServerProcess()方法启动SystemServer,zygote进程不会执行
private static Runnable forkSystemServer(String abiList, String socketName, ZygoteServer zygoteServer) { ... ... /* Hardcoded command line to start the system server */ String[] args = { "--setuid=1000", //uid "--setgid=1000", //gid "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023," + "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010,3011", "--capabilities=" + capabilities + "," + capabilities, "--nice-name=system_server", //进程名 "--runtime-args", "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT, "com.android.server.SystemServer", //全类名 }; ZygoteArguments parsedArgs; int pid; try { ZygoteCommandBuffer commandBuffer = new ZygoteCommandBuffer(args); try { parsedArgs = ZygoteArguments.getInstance(commandBuffer); } catch (EOFException e) { throw new AssertionError("Unexpected argument error for forking system server", e); } commandBuffer.close(); Zygote.applyDebuggerSystemProperty(parsedArgs); Zygote.applyInvokeWithSystemProperty(parsedArgs); if (Zygote.nativeSupportsMemoryTagging()) { /* The system server has ASYNC MTE by default, in order to allow * system services to specify their own MTE level later, as you * can't re-enable MTE once it's disabled. */ String mode = SystemProperties.get("arm64.memtag.process.system_server", "async"); if (mode.equals("async")) { parsedArgs.mRuntimeFlags |= Zygote.MEMORY_TAG_LEVEL_ASYNC; } else if (mode.equals("sync")) { parsedArgs.mRuntimeFlags |= Zygote.MEMORY_TAG_LEVEL_SYNC; } else if (!mode.equals("off")) { /* When we have an invalid memory tag level, keep the current level. */ parsedArgs.mRuntimeFlags |= Zygote.nativeCurrentTaggingLevel(); Slog.e(TAG, "Unknown memory tag level for the system server: \"" + mode + "\""); } } else if (Zygote.nativeSupportsTaggedPointers()) { /* Enable pointer tagging in the system server. Hardware support for this is present * in all ARMv8 CPUs. */ parsedArgs.mRuntimeFlags |= Zygote.MEMORY_TAG_LEVEL_TBI; } /* Enable gwp-asan on the system server with a small probability. This is the same * policy as applied to native processes and system apps. */ parsedArgs.mRuntimeFlags |= Zygote.GWP_ASAN_LEVEL_LOTTERY; if (shouldProfileSystemServer()) { parsedArgs.mRuntimeFlags |= Zygote.PROFILE_SYSTEM_SERVER; } //fork system_server进程,这个pid与进程id(PID)不一样,父进程的pid=子进程的PID, 子进程pid=0 //例如system_server进程的PID=1000, 则zygote的pid=1000, system_server的pid=0 /* Request to fork the system server process */ pid = Zygote.forkSystemServer( parsedArgs.mUid, parsedArgs.mGid, parsedArgs.mGids, parsedArgs.mRuntimeFlags, null, parsedArgs.mPermittedCapabilities, parsedArgs.mEffectiveCapabilities); } catch (IllegalArgumentException ex) { throw new RuntimeException(ex); } /* For child process */ if (pid == 0) { //pid=0表示fork出的子进程,也就是说这if语句中的代码只有system server进程才会执行,zygote进程不会执行 if (hasSecondZygote(abiList)) { waitForSecondaryZygote(socketName); } zygoteServer.closeServerSocket(); return handleSystemServerProcess(parsedArgs); //启动 system server,之前只是创建了system server,但是还没有执行 } return null; }
下面先理Zygote.forkSystemServer()
语句的执行流程
3. Zygote.java forkSystemServer()
static int forkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
ZygoteHooks.preFork();
int pid = nativeForkSystemServer(
uid, gid, gids, runtimeFlags, rlimits,
permittedCapabilities, effectiveCapabilities);
// Set the Java Language thread priority to the default value for new apps.
Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
ZygoteHooks.postForkCommon();
return pid;
}
执行nativeForkSystemServer()
语句流程
4. Zygote.java nativeForkSystemServer()
正常情况下native方法能在AndroidRuntime.cpp中能够搜到,但是nativeForkSystemServer可能是命名不够规范,需要在AndroidRuntime.cpp中搜索com_android_internal_os_Zygote,从而找到register_com_android_internal_os_Zygote
,
最后跳转到com_android_internal_os_zygote.cpp
中,在gMethods变量数组中可以查找到nativeForkSystemServer对应的 native方法为com_android_internal_os_Zygote_nativeForkSystemServer
,最后会通过fork创建生成pid
private static native int nativeForkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
int[][] rlimits, long permittedCapabilities, long effectiveCapabilities);
返回到第2步流程中的pid==0流程中执行handleSystemServerProcess()
启动SystemServer
5. ZygoteInit.java handleSystemServerProcess()
/** * Finish remaining work for the newly forked system server process. */ //其实就是通过反射进行启动的 private static Runnable handleSystemServerProcess(ZygoteArguments parsedArgs) { // set umask to 0077 so new files and directories will default to owner-only permissions. Os.umask(S_IRWXG | S_IRWXO); if (parsedArgs.mNiceName != null) { Process.setArgV0(parsedArgs.mNiceName); } final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH"); if (systemServerClasspath != null) { performSystemServerDexOpt(systemServerClasspath); // Capturing profiles is only supported for debug or eng builds since selinux normally // prevents it. if (shouldProfileSystemServer() && (Build.IS_USERDEBUG || Build.IS_ENG)) { try { Log.d(TAG, "Preparing system server profile"); prepareSystemServerProfile(systemServerClasspath); } catch (Exception e) { Log.wtf(TAG, "Failed to set up system server profile", e); } } } if (parsedArgs.mInvokeWith != null) { String[] args = parsedArgs.mRemainingArgs; // If we have a non-null system server class path, we'll have to duplicate the // existing arguments and append the classpath to it. ART will handle the classpath // correctly when we exec a new process. if (systemServerClasspath != null) { String[] amendedArgs = new String[args.length + 2]; amendedArgs[0] = "-cp"; amendedArgs[1] = systemServerClasspath; System.arraycopy(args, 0, amendedArgs, 2, args.length); args = amendedArgs; } WrapperInit.execApplication(parsedArgs.mInvokeWith, parsedArgs.mNiceName, parsedArgs.mTargetSdkVersion, VMRuntime.getCurrentInstructionSet(), null, args); throw new IllegalStateException("Unexpected return from WrapperInit.execApplication"); } else { ClassLoader cl = getOrCreateSystemServerClassLoader(); if (cl != null) { Thread.currentThread().setContextClassLoader(cl); } /* * Pass the remaining arguments to SystemServer. */ return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion, parsedArgs.mDisabledCompatChanges, parsedArgs.mRemainingArgs, cl); } /* should never reach here */ }
6. ZygoteInit.java zygoteInit()
ZygoteInit.nativeZygoteInit() --> 开启binder线程池
RuntimeInit.applicationInit --> 运行SystemServer.main()
public static Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges, String[] argv, ClassLoader classLoader) { if (RuntimeInit.DEBUG) { Slog.d(RuntimeInit.TAG, "RuntimeInit: Starting application from zygote"); } Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ZygoteInit"); RuntimeInit.redirectLogStreams(); RuntimeInit.commonInit(); //开启binder线程池 ZygoteInit.nativeZygoteInit(); // 运行SystemServer.main() return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv, classLoader); }
下面先跟踪ZygoteInit.nativeZygoteInit()
流程,nativeZygoteInit是native方法,跳转到AndroidRuntime类中执行对应native方法com_android_internal_os_ZygoteInit_nativeZygoteInit()
7. AndroidRuntime.cpp com_android_internal_os_ZygoteInit_nativeZygoteInit()
gCurRuntime变量是 AndroidRuntime* 类型
static void com_android_internal_os_ZygoteInit_nativeZygoteInit(JNIEnv* env, jobject clazz)
{
gCurRuntime->onZygoteInit(); //gCurRuntime变量是 AndroidRuntime* 类型
}
8. app_main.cpp onZygoteInit()
通过proc->startThreadPool()
语句启动线程池
virtual void onZygoteInit()
{
sp<ProcessState> proc = ProcessState::self();
ALOGV("App process: starting thread pool.\n");
proc->startThreadPool(); //启动线程池
}
返回到步骤6中,执行RuntimeInit.applicationInit()
语句
9. RuntimeInit.java applicationInit()
protected static Runnable applicationInit(int targetSdkVersion, long[] disabledCompatChanges, String[] argv, ClassLoader classLoader) { // If the application calls System.exit(), terminate the process // immediately without running any shutdown hooks. It is not possible to // shutdown an Android application gracefully. Among other things, the // Android runtime shutdown hooks close the Binder driver, which can cause // leftover running threads to crash before the process actually exits. nativeSetExitWithoutCleanup(true); VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion); VMRuntime.getRuntime().setDisabledCompatChanges(disabledCompatChanges); final Arguments args = new Arguments(argv); // The end of of the RuntimeInit event (see #zygoteInit). Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); // Remaining arguments are passed to the start class's static main return findStaticMain(args.startClass, args.startArgs, classLoader); }
执行findStaticMain()
语句往下执行
10. RuntimeInit.java findStaticMain()
注意, 这个方法new了一个MethodAndArgsCaller对象并返回回去
protected static Runnable findStaticMain(String className, String[] argv, ClassLoader classLoader) { Class<?> cl; try { cl = Class.forName(className, true, classLoader); //className就是上面传的SystemServer } 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); } /* * This throw gets caught in ZygoteInit.main(), which responds * by invoking the exception's run() method. This arrangement * clears up all the stack frames that were required in setting * up the process. */ return new MethodAndArgsCaller(m, argv); //new了一个MethodAndArgsCaller对象并返回回去 }
11. RuntimeInit.java MethodAndArgsCaller
static class MethodAndArgsCaller implements Runnable { /** method to call */ private final Method mMethod; /** argument array */ private final String[] mArgs; public MethodAndArgsCaller(Method method, String[] args) { mMethod = method; mArgs = args; } public void run() { try { mMethod.invoke(null, new Object[] { mArgs }); //通过反射执行SystemServer.main方法 } catch (IllegalAccessException ex) { throw new RuntimeException(ex); } catch (InvocationTargetException ex) { Throwable cause = ex.getCause(); if (cause instanceof RuntimeException) { throw (RuntimeException) cause; } else if (cause instanceof Error) { throw (Error) cause; } throw new RuntimeException(ex); } } }
之后进入SystemServer进程中,首先进入SystemServer的main()
方法
12. SystemServer.java main()
跳转到run()
方法中执行
public static void main(String[] args) {
new SystemServer().run(); //跳转到run()方法
}
13. SystemServer.java run()
在run()方法中有5个重要的执行流程
① createSystemContext();
//创建系统上下文
② mSystemServiceManager = new SystemServiceManager(mSystemContext);
//创建SystemServiceManager系统服务管理
SystemServiceManager 与serviceManager的区别:
- SystemServiceManager:管理服务的生命周期
- ServiceManager:管理binder服务的
③ startBootstrapServices(t);
// 引导服务–AMS
从Android10开始多了一个 ATMS
- ATMS–管理Activity
- AMS – 管理其他的三个服务及其他服务,会持有ATMS的引用
④ startCoreServices(t);
//核心服务,指系统用到的相关服务
⑤ startOtherServices(t);
// 其他服务–WMS
private void run() { ... ... // Initialize the system context. createSystemContext(); //创建系统上下文 // Create the system service manager. mSystemServiceManager = new SystemServiceManager(mSystemContext); //创建SystemServiceManager系统服务管理 mSystemServiceManager.setStartInfo(mRuntimeRestart, mRuntimeStartElapsedTime, mRuntimeStartUptime); mDumper.addDumpable(mSystemServiceManager); ... ... // Start services. try { t.traceBegin("StartServices"); //三类服务的启动,重要是引导服务和核心服务 startBootstrapServices(t); // 引导服务--AMS startCoreServices(t); //核心服务,指系统用到的相关服务 startOtherServices(t); // 其他服务--WMS } catch (Throwable ex) { Slog.e("System", "******************************************"); Slog.e("System", "************ Failure starting system services", ex); throw ex; } finally { t.traceEnd(); // StartServices } .. ... }
下面先跟踪createSystemContext()
流程
14. SystemServer.java createSystemContext()
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain(); //调用这个方法进入ActivityThread类中
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
final Context systemUiContext = activityThread.getSystemUiContext();
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
15. ActivityThread.java systemMain()
@UnsupportedAppUsage
public static ActivityThread systemMain() {
ThreadedRenderer.initForSystemProcess();
ActivityThread thread = new ActivityThread();
thread.attach(true, 0); //执行attach()方法
return thread;
}
16. ActivityThread.java attach()
这个attach()
方法比较重要,里面分两种情况,一种是非系统流程,即应用层app分支,另外一个系统流程,比如SystemServer进程。
@UnsupportedAppUsage private void attach(boolean system, long startSeq) { sCurrentActivityThread = this; mConfigurationController = new ConfigurationController(this); mSystemThread = system; //下面分两种情况,一种非系统流程,一种是系统流程 if (!system) { //应用层app所走流程 android.ddm.DdmHandleAppName.setAppName("<pre-initialized>", UserHandle.myUserId()); RuntimeInit.setApplicationObject(mAppThread.asBinder()); final IActivityManager mgr = ActivityManager.getService(); try { mgr.attachApplication(mAppThread, startSeq); } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } // Watch for getting close to heap limit. BinderInternal.addGcWatcher(new Runnable() { @Override public void run() { if (!mSomeActivitiesChanged) { return; } Runtime runtime = Runtime.getRuntime(); long dalvikMax = runtime.maxMemory(); long dalvikUsed = runtime.totalMemory() - runtime.freeMemory(); if (dalvikUsed > ((3*dalvikMax)/4)) { if (DEBUG_MEMORY_TRIM) Slog.d(TAG, "Dalvik max=" + (dalvikMax/1024) + " total=" + (runtime.totalMemory()/1024) + " used=" + (dalvikUsed/1024)); mSomeActivitiesChanged = false; try { ActivityTaskManager.getService().releaseSomeActivities(mAppThread); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } } }); } else { //系统流程,SystemServer走这个流程 // Don't set application object here -- if the system crashes, // we can't display an alert, we just want to die die die. android.ddm.DdmHandleAppName.setAppName("system_process", UserHandle.myUserId()); try { mInstrumentation = new Instrumentation(); mInstrumentation.basicInit(this); // 这里面创建了两个Context,getSystemContext()创建系统的Context, // ContextImpl.createAppContext()创建当前线程的Context ContextImpl context = ContextImpl.createAppContext( this, getSystemContext().mPackageInfo); //创建Application mInitialApplication = context.mPackageInfo.makeApplication(true, null); mInitialApplication.onCreate(); } catch (Exception e) { throw new RuntimeException( "Unable to instantiate Application():" + e.toString(), e); } } ViewRootImpl.ConfigChangedCallback configChangedCallback = (Configuration globalConfig) -> { synchronized (mResourcesManager) { // TODO (b/135719017): Temporary log for debugging IME service. if (Build.IS_DEBUGGABLE && mHasImeComponent) { Log.d(TAG, "ViewRootImpl.ConfigChangedCallback for IME, " + "config=" + globalConfig); } // We need to apply this change to the resources immediately, because upon returning // the view hierarchy will be informed about it. if (mResourcesManager.applyConfigurationToResources(globalConfig, null /* compat */, mInitialApplication.getResources().getDisplayAdjustments())) { mConfigurationController.updateLocaleListFromAppContext( mInitialApplication.getApplicationContext()); // This actually changed the resources! Tell everyone about it. final Configuration updatedConfig = mConfigurationController.updatePendingConfiguration(globalConfig); if (updatedConfig != null) { sendMessage(H.CONFIGURATION_CHANGED, globalConfig); mPendingConfiguration = updatedConfig; } } } }; ViewRootImpl.addConfigCallback(configChangedCallback); }
在 ContextImpl context = ContextImpl.createAppContext(
this, getSystemContext().mPackageInfo);
这个语句中,getSystemContext()创建系统Context, ContextImpl.createAppContext()创建当前线程的Context
17. ActivityThread.java getSystemContext()
@Override
@UnsupportedAppUsage
public ContextImpl getSystemContext() {
synchronized (this) {
if (mSystemContext == null) {
mSystemContext = ContextImpl.createSystemContext(this); //创建系统Context
}
return mSystemContext;
}
}
18. ContextImpl.java createSystemContext()
一个app对应一个LoadApk
@UnsupportedAppUsage
static ContextImpl createSystemContext(ActivityThread mainThread) {
LoadedApk packageInfo = new LoadedApk(mainThread);//一个 app 对应一个 LoadApk
//创建context
ContextImpl context = new ContextImpl(null, mainThread, packageInfo,
ContextParams.EMPTY, null, null, null, null, null, 0, null, null);
context.setResources(packageInfo.getResources());
context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(),
context.mResourcesManager.getDisplayMetrics());
context.mContextType = CONTEXT_TYPE_SYSTEM_OR_SYSTEM_UI;
return context; //返回context
}
返回到步骤16 执行 ContextImpl.createAppContext()语句
19. ContextImpl.java createAppContext()
static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo,
String opPackageName) {
if (packageInfo == null) throw new IllegalArgumentException("packageInfo");
//创建context
ContextImpl context = new ContextImpl(null, mainThread, packageInfo,
ContextParams.EMPTY, null, null, null, null, null, 0, null, opPackageName);
context.setResources(packageInfo.getResources());
context.mContextType = isSystemOrSystemUI(context) ? CONTEXT_TYPE_SYSTEM_OR_SYSTEM_UI
: CONTEXT_TYPE_NON_UI;
return context;
}
返回步骤16,执行context.mPackageInfo.makeApplication(true, null)语句创建Application
在系统层面,代码块中的if语句不会进入,因为系统层面instrumentation为null
在ActivityThread.attach()分支语句中 mInitialApplication = context.mPackageInfo.makeApplication(true, null); 传过来的参数为null
@UnsupportedAppUsage public Application makeApplication(boolean forceDefaultAppClass, Instrumentation instrumentation) { if (mApplication != null) { return mApplication; } Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "makeApplication"); Application app = null; String appClass = mApplicationInfo.className; if (forceDefaultAppClass || (appClass == null)) { appClass = "android.app.Application"; } try { final java.lang.ClassLoader cl = getClassLoader(); if (!mPackageName.equals("android")) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "initializeJavaContextClassLoader"); initializeJavaContextClassLoader(); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); } // Rewrite the R 'constants' for all library apks. SparseArray<String> packageIdentifiers = getAssets().getAssignedPackageIdentifiers( false, false); for (int i = 0, n = packageIdentifiers.size(); i < n; i++) { final int id = packageIdentifiers.keyAt(i); if (id == 0x01 || id == 0x7f) { continue; } rewriteRValues(cl, packageIdentifiers.valueAt(i), id); } ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this); // The network security config needs to be aware of multiple // applications in the same process to handle discrepancies NetworkSecurityConfigProvider.handleNewApplication(appContext); // 通过newApplication创建application app = mActivityThread.mInstrumentation.newApplication( cl, appClass, appContext); appContext.setOuterContext(app); } catch (Exception e) { if (!mActivityThread.mInstrumentation.onException(app, e)) { Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); throw new RuntimeException( "Unable to instantiate application " + appClass + " package " + mPackageName + ": " + e.toString(), e); } } mActivityThread.mAllApplications.add(app); mApplication = app; //在系统层面,下面的if语句不会进入,因为系统层面instrumentation为null // 在ActivityThread.attach()分支中 mInitialApplication = context.mPackageInfo.makeApplication(true, null); // 传过来的参数为null if (instrumentation != null) { try { instrumentation.callApplicationOnCreate(app); //执行oncreate()方法 } catch (Exception e) { if (!instrumentation.onException(app, e)) { Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); throw new RuntimeException( "Unable to create application " + app.getClass().getName() + ": " + e.toString(), e); } } } Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); return app; }
下面是AMS启动流程
回到第13步的第②个语句块mSystemServiceManager = new SystemServiceManager(mSystemContext);
下面先分析下SystemServiceManager类的startService(),这个方法后续会用到。
21. SystemServiceManager.java startService()
public SystemService startService(String className) {
//通过loadClassFromLoader返回服务的名称
final Class<SystemService> serviceClass = loadClassFromLoader(className,
this.getClass().getClassLoader());
return startService(serviceClass); //启动服务
}
// 泛型T继承SystemService public <T extends SystemService> T startService(Class<T> serviceClass) { try { final String name = serviceClass.getName(); Slog.i(TAG, "Starting " + name); Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name); // 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); } startService(service); //往下执行 return service; } finally { Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } }
public void startService(@NonNull final SystemService service) { // Register it. mServices.add(service); // Start it. long time = SystemClock.elapsedRealtime(); try { // 执行onStart()方法,service继承SystemService的服务, // 在创建ATMS语句中 ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService(); // service对应的就是ActivityTaskManagerService.Lifecycle service.onStart(); } catch (RuntimeException ex) { throw new RuntimeException("Failed to start service " + service.getClass().getName() + ": onStart threw an exception", ex); } warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart"); }
startService()最终会调用service.onStart(),其中service是继承自SystemService的服务。
回到第13步的第③个语句块startBootstrapServices(t);
启动引导服务
24. SystemServer.java startBootstrapServices()
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
...
// 从android10开始多了一个ATMS, 用于管理ativity,即管理任务
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
// 创建AMS,管理除activity其他的服务,AMS会持有ATMS的句柄
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
...
//通过startBootPhase()方法进行SystemService的状态设置
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
}
public static final class Lifecycle extends SystemService {
private final ActivityTaskManagerService mService;
public Lifecycle(Context context) {
super(context);
mService = new ActivityTaskManagerService(context); //创建ATMS服务
}
@Override
public void onStart() {
publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
mService.start(); //执行ATMS服务的start()方法
}
...
}
ActivityTaskManagerService类中的内部类Lifecycle继承SystemService,
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public ActivityTaskManagerService(Context context) {
mContext = context;
mFactoryTest = FactoryTest.getMode();
mSystemThread = ActivityThread.currentActivityThread(); //拿到当前ActivityThread
mUiContext = mSystemThread.getSystemUiContext();
mLifecycleManager = new ClientLifecycleManager(); //创建生命周期管理方法
mVisibleActivityProcessTracker = new VisibleActivityProcessTracker(this);
mInternal = new LocalService();
GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version", GL_ES_VERSION_UNDEFINED);
mWindowOrganizerController = new WindowOrganizerController(this);
mTaskOrganizerController = mWindowOrganizerController.mTaskOrganizerController;
}
回到25步的publishBinderService()方法流程,这个是跳转到SystemService类的publishBinderService()方法
protected final void publishBinderService(String name, IBinder service,
boolean allowIsolated, int dumpPriority) {
ServiceManager.addService(name, service, allowIsolated, dumpPriority); //将ATMS放到ServiceManager中,注册binder服务
}
将ATMS放到ServiceManager中,注册binder服务
其中AMS跟ATMS类似
ActivityManagerService.java 内部类Lifecycle
public static final class Lifecycle extends SystemService { private final ActivityManagerService mService; private static ActivityTaskManagerService sAtm; public Lifecycle(Context context) { super(context);fuw mService = new ActivityManagerService(context, sAtm); //创建AMS } public static ActivityManagerService startService( SystemServiceManager ssm, ActivityTaskManagerService atm) { sAtm = atm; return ssm.startService(ActivityManagerService.Lifecycle.class).getService(); } @Override public void onStart() { mService.start(); } ... }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。