ATMS和AMS的启动分析

194 阅读2分钟

ATMS和AMS是systemServer进程的两个服务,它们的启动分析如下。 本文以Android 13代码为例。
1,在frameworks/base/services/java/com/android/server/SystemServer.java中

public final class SystemServer implements Dumpable {

	private SystemServiceManager mSystemServiceManager;
    /**
     * The main entry point from zygote.
     */
    public static void main(String[] args) {
        new SystemServer().run();
    }
    private void run() {
    	Looper.prepareMainLooper();
    	createSystemContext(); // 加载系统资源
    	mSystemServiceManager = new SystemServiceManager(mSystemContext);
    	startBootstrapServices(t); // 启动引导服务
    	Looper.loop();
    }
    private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
    	t.traceBegin("StartActivityManager");
        // TODO: Might need to move after migration to WM.
        ActivityTaskManagerService atm = mSystemServiceManager.startService(
                ActivityTaskManagerService.Lifecycle.class).getService();// 启动ATMS
        mActivityManagerService = ActivityManagerService.Lifecycle.startService(
                mSystemServiceManager, atm);// 启动AMS
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        mWindowManagerGlobalLock = atm.getGlobalLock();
        t.traceEnd();
    	
    	// Set up the Application instance for the system process and get started.
    	t.traceBegin("SetSystemProcess");
    	mActivityManagerService.setSystemProcess(); //将AMS加入到ServiceManager中
    	t.traceEnd();
    }
}

上面的代码调用了SystemServiceManager类的startService函数。
2,在frameworks/base/services/core/java/com/android/server/SystemServiceManager.java中

public final class SystemServiceManager implements Dumpable {
	private List<SystemService> mServices;
    SystemServiceManager(Context context) {
    	mServices = new ArrayList<>();
    }
    public <T extends SystemService> T startService(Class<T> serviceClass) { // 泛型方法,它定义了一个类型参数T,这个类型参数必须是SystemService或其子类
    	final String name = serviceClass.getName();
    	// 使用serviceClass.getConstructor(Context.class)获取一个接受Context作为参数的构造函数。这要求服务类必须有一个公开的构造函数,该构造函数接受一个Context类型的参数
        Constructor<T> constructor = serviceClass.getConstructor(Context.class);
        service = constructor.newInstance(mContext); // 通过constructor.newInstance(mContext)创建服务实例
    	startService(service);
        return service;
    }
    public void startService(@NonNull final SystemService service) {
    	String className = service.getClass().getName(); // 获取服务的类名
    	mServices.add(service);
    	try {
            service.onStart(); // 调用服务的onStart()方法来启动服务
        } catch (RuntimeException ex) {
            throw new RuntimeException("Failed to start service " + service.getClass().getName()
                    + ": onStart threw an exception", ex);
        }
    }
}

代码走到SystemService.java中的onStart抽象函数中,public abstract void onStart();会进一步走到ActivityTaskManagerService中定义的继承自SystemService的内部类Lifecycle中
3,在frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java中

public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
    final ActivityTaskManagerInternal mInternal; //在ActivityTaskManagerService的构造函数中,mInternal = new LocalService();
	  public static final class Lifecycle extends SystemService { //定义内部类Lifecycle继承自SystemService
        private final ActivityTaskManagerService mService;
    
        public Lifecycle(Context context) {
            super(context);
            mService = new ActivityTaskManagerService(context);
        }
    
        @Override
        public void onStart() {
            publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService); // 将ATMS保存到ServiceManager
            mService.start();
        }
    
        @Override
        public void onUserUnlocked(@NonNull TargetUser user) {
            synchronized (mService.getGlobalLock()) {
                mService.mTaskSupervisor.onUserUnlocked(user.getUserIdentifier());
            }
        }
    
        @Override
        public void onUserStopped(@NonNull TargetUser user) {
            synchronized (mService.getGlobalLock()) {
                mService.mTaskSupervisor.mLaunchParamsPersister
                        .onCleanupUser(user.getUserIdentifier());
            }
        }
    
        public ActivityTaskManagerService getService() {
            return mService;
        }
    }
    
    private void start() {
	    LocalServices.addService(ActivityTaskManagerInternal.class, mInternal);
	}
    
}

4,在frameworks/base/services/core/java/com/android/server/SystemService.java中

public abstract class SystemService {
	public abstract void onStart();
	
	protected final void publishBinderService(String name, IBinder service,boolean allowIsolated, int dumpPriority) {
		ServiceManager.addService(name, service, allowIsolated, dumpPriority); 
	}
}

5,在frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java中

public class ActivityManagerService extends IActivityManager.Stub implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback, ActivityManagerGlobalLock {
  public final ActivityManagerInternal mInternal;//在ActivityManagerService的构造函数中,mInternal = new LocalService();
	public static final class Lifecycle extends SystemService {
        private final ActivityManagerService mService;
        private static ActivityTaskManagerService sAtm;
    
        public Lifecycle(Context context) {
            super(context);
            mService = new ActivityManagerService(context, sAtm);
        }
    
        public static ActivityManagerService startService(
                SystemServiceManager ssm, ActivityTaskManagerService atm) {
            sAtm = atm;
            return ssm.startService(ActivityManagerService.Lifecycle.class).getService(); //同ATMS一样调用SystemServiceManager的startService函数和getService函数。
        }
    
        @Override
        public void onStart() {
            mService.start();
        }
    
        @Override
        public void onBootPhase(int phase) {
            mService.mBootPhase = phase;
            if (phase == PHASE_SYSTEM_SERVICES_READY) {
                mService.mBatteryStatsService.systemServicesReady();
                mService.mServices.systemServicesReady();
            } else if (phase == PHASE_ACTIVITY_MANAGER_READY) {
                mService.startBroadcastObservers();
            } else if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
                mService.mPackageWatchdog.onPackagesReady();
            }
        }
    
        @Override
        public void onUserStopped(@NonNull TargetUser user) {
            mService.mBatteryStatsService.onCleanupUser(user.getUserIdentifier());
        }
    
        public ActivityManagerService getService() {
            return mService;
        }
    }
	private void start() {
	    LocalServices.addService(ActivityManagerInternal.class, mInternal);
	}
        
	public void setSystemProcess() {
	    ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
  }
}

经过上面的步骤,ATMS和AMS就可以启动并加入到ServiceManager中。