一、AMS的启动流程
1.SystemServer.java里面启动main()函数
public static void main(String[] args) {
new SystemServer().run(); }
2.SystemServer
.java里面的run方法
System.loadLibrary("android_servers"); //加载service动态链接库
startBootstrapServices(); //启动ActivityManagerService、PowerManagerService、PackageManagerService等引导服务
startCoreServices(); //启动核心服务
startOtherServices(); //启动其他的服务
3.SystemServiceManager.java的startService
public <T extends SystemService> T startService(Class<T> serviceClass) {
......
Constructor<T> constructor = serviceClass.getConstructor(Context.class);//1
service = constructor.newInstance(mContext);//2 constructor的newInstance方法来创建Lifecycle类型的service对象
mServices.add(service);//3 service添加到ArrayList类型的mServices对象中来完成注册
service.onStart();//4 service(Lifecycle)的onStart方法来启动service,并返回该service
.......}
Lifecycle
实际上是ActivityManagerService.java的一个内部类
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
public Lifecycle(Context context) {
super(context); mService = new ActivityManagerService(context);//1}
当调用Lifecycle类型的service的onStart方法时,实际上是调用了注释2处AMS的start方法
二、AMS与进程启动
AMS在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求Zygote进程将需要的应用程序进程启动。Service的启动过程中会调用ActiveServices的bringUpServiceLocked方法
private String bringUpServiceLocked(ServiceRecord r, int intentFlags, boolean execInFg, boolean whileRestarting, boolean permissionsReviewRequired) throws TransactionTooLargeException { ... final String procName = r.processName;//1 ProcessRecord app; if (!isolated) { app = mAm.getProcessRecordLocked(procName, r.appInfo.uid, false);//2 if (DEBUG_MU) Slog.v(TAG_MU, "bringUpServiceLocked: appInfo.uid=" + r.appInfo.uid + " app=" + app); if (app != null && app.thread != null) {//3 try { app.addPackage(r.appInfo.packageName, r.appInfo.versionCode, mAm.mProcessStats); realStartServiceLocked(r, app, execInFg);//4 return null; } catch (TransactionTooLargeException e) { ... } } else { app = r.isolatedProc; } if (app == null && !permissionsReviewRequired) {//5 if ((app=mAm.startProcessLocked(procName, r.appInfo, true, intentFlags, "service", r.name, false, isolated, false)) == null) {//6 ... } if (isolated) { r.isolatedProc = app; } } ... }
1.ServiceRecord的processName的值赋值给procName ,其中ServiceRecord用来描述Service的android:process属性
2.将procName和Service的uid传入到AMS的getProcessRecordLocked方法中,来查询是否存在一个与Service对应的ProcessRecord类型的对象app,ProcessRecord主要用来记录运行的应用程序进程的信息
5.判断Service对应的app为null则说明用来运行Service的应用程序进程不存在,
6.AMS的startProcessLocked方法来创建对应的应用程序进程