android AMS服务的解析

AMS和ATMS

AMS是ActivityManagerService的简称,在Android 10 之前,AMS主要负责对四大组件进行管理和调度,同时,AMS也 对进程、电池、内存、权限等进行管理。但在Android 10开始,系统发现AMS要承载的事务太多,就将Activity的管理迁移到了ActivityTaskManagerService中,ActivityTaskManagerService也被缩写为ATMS。所以本篇我们把AMS和ATMS放在一起分析。

AMS与ATMS都是SystemServer进程中的系统服务,他们并不是独立的进程,所以,他们的启动和管理全部都是在 SystemServer进程中进行的。

ATMS的启动

从前面的android启动流程-SystemServer一文中可知,SystemServer最终会调用三个启动服务的方法:

private void run() { 
 
        try { 
            // 3.使用SystemServiceManager启动引导服务 
            startBootstrapServices(t); 
            // 4.启动核心服务 
            startCoreServices(t); 
            // 5.启动其他服务 
            startOtherServices(t); 
        } 
 
} 

上面这3个方法会启动android系统中的90多种服务,其中就包括AMS的启动和ATMS的启动。

startBootstrapServices

我们先来看看ATMS是如何启动的,在startBootstrapServices方法中,ATMS并不是直接启动,而是SystemServiceManager通过 Lifecycle类来间接实现。

Lifecycle 是 ATMS 里的静态内部类,静态内部类不依赖于外部类,它封装 了ATMS对象,同时实现了SystemService接口。Lifecycle 构造方法调用时,会初始化内部成员变量 mService,即调用ATMS的构造方法,构造方法中会执行一些初始化操作。

private void startBootstrapServices() { 
    //...... 
    //1、启动ATMS服务 
    ActivityTaskManagerService atm = mSystemServiceManager.startService( 
    ActivityTaskManagerService.Lifecycle.class).getService(); 
    //2、启动AMS服务 
    mActivityManagerService = ActivityManagerService.Lifecycle.startService( 
    mSystemServiceManager, atm); 
    //3、将SystemServiceManager设置给AMS 
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager); 
    //3、将installer设置给AMS 
    mActivityManagerService.setInstaller(installer); 
    //4、初始化电源管理功能 
    mActivityManagerService.initPowerManagement(); 
    //5、设置系统进程 
    mActivityManagerService.setSystemProcess(); 
    //6、初始化看门狗 
    watchdog.init(mSystemContext, mActivityManagerService); 
} 



// ActivityTaskManagerService的内部类
public static final class Lifecycle extends SystemService { 
    private final ActivityTaskManagerService mService; 

    public Lifecycle(Context context) { 
        super(context); 
        mService = new ActivityTaskManagerService(context); 
    } 


} 

然后在SystemManagerService中执行startService方法。

SystemServiceManager是一个辅助类,它用于辅助SystemServer进程启动和管理SystemServer进程中的各类服务 Service。由于需要管理的服务非常多,所以SystemServiceManager是通过管理所有实现了SystemService接口的类的方式来统一的运用反射启动这些服务。这个类通过反射获取到ATMS,然后调用startService方法执行到service.onStart()。

public <T extends SystemService> T startService(Class<T> serviceClass) { 
    try { 
        final String name = serviceClass.getName(); 
        ... 

        final T service; 
        try { 
            Constructor<T> constructor = serviceClass.getConstructor(Context.class); 
            service = constructor.newInstance(mContext); 
        } catch (InstantiationException ex) { 
            ... 
        } 
        startService(service); 
        return service;   
    } finally { 
        Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); 
    } 
} 

/*通过上面的代码我们不难发现,startService()方法内部是运用了反射获取到了serviceClass类的对象实 
 */例service,然后再调用startService(service)如下所示:
public void startService(@NonNull final SystemService service) {
    // 注册服务
    mServices.add(service);
    // 开启服务
    long time = SystemClock.elapsedRealtime();
    try {
        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");
}


上面代码通过反射获取到AMS,调用service.onStart()就是走Lifecycle中实现的方法onStart(),然后最终走到start(),启动服务。

// ActivityManagerService的内部类
public static final class Lifecycle extends SystemService {
    
    ...

    @Override
    public void onStart() {
        publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
        mService.start();
    }

    ...
}


private void start() {
    LocalServices.addService(ActivityTaskManagerInternal.class, mInternal);
}

我们看一下,在onStart和start方法中,其实都只是执行了一句代码,那么这两句代码什么意思呢?

我们先看一下publishBinderService():

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

这个方法的主要目的就是ATMS将自己的binder 发布到了ServcieManager这个进程上面,方便后期其他进程 调用ATMS的服务。

再看start()方法:

private void start() {
    LocalServices.addService(ActivityTaskManagerInternal.class, mInternal);
}

实际上,start函数就是在将ATMS的本地服务保存到LocalServices列表中,将来进程内别的服务需要使用他们的时候 可以去LocalServices中找到。当然,ATMS的本地服务大家理解为就是 ATMS的服务就好了。

AMS的启动

其实,AMS的启动基本和ATMS一致,但是在发布binder服务的时候,AMS通过setSystemProcess来发布。

public void setSystemProcess() {
    try {
             ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
                      DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
        }
}
 

其他的逻辑基本一致:


// ActivityManagerService的内部类
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();
    }

}
// ActivityManagerService的内部类
public static final class Lifecycle extends SystemService {

    @Override
    public void onStart() {
        mService.start();
    }

}


private void start() {
    mBatteryStatsService.publish();
    mAppOpsService.publish();
    mProcessStats.publish();
    Slog.d("AppOps", "AppOpsService published");
    LocalServices.addService(ActivityManagerInternal.class, mInternal);
    LocalManagerRegistry.addManager(ActivityManagerLocal.class,
        (ActivityManagerLocal) mInternal);
    mActivityTaskManager.onActivityManagerInternalAdded();
    mPendingIntentController.onActivityManagerInternalAdded();
    mAppProfiler.onActivityManagerInternalAdded();
    CriticalEventLog.init()
}

总结

首先,他们都是SystemServer进程中的服务,都是在SystemServer进程启动的时候进行启动;

其次,在他们启动的过程中,并不是直接自己启动的,而是由SystemServer进程通过SystemServiceManager对象 进行统一的启动;

然后,ATMS&AMS 启动后会将自己的本地服务公布到LocalServices列表,将来进程内别的服务需要使用他们的时候可以去LocalServices中找到;

最后,ATMS&AMS 会将自己的binder 公布给ServiceManager进程,由这个进程去进程存储,方便后面其他进程获取AMS和ATMS的binder 代理。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值