重拾系列之——Android AMS

概述

AMS是系统的引导服务,管理着应用进程的启动、切换和调度,管理四大组件的启动和生命周期。

初始化

AMS的初始化是在SystemServer中完成的,关于SystemServer,在上一篇重拾系列之——Android系统启动流程中有做过简单的介绍。

在SystemServer中

private void run() {
            createSystemContext();
            // Create the system service manager.
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setStartInfo(mRuntimeRestart,
                    mRuntimeStartElapsedTime, mRuntimeStartUptime);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
   
            traceBeginAndSlog("StartServices");
            startBootstrapServices();
            startCoreServices();
            startOtherServices();
    }

先在createSystemContext()中创建了两个context,分别是mSystemContext和systemUiContext,其中mSystemContext会在初始化SystemServiceManager时传入。

ActivityThread.systemMain()中绑定SystemServer进程,注意这里的attach传的是true;如果启动的是应用进程,attach传的是false(在ActivityThread.main()中可看到),方法中attachApplication。

private void createSystemContext() {
    ActivityThread activityThread = ActivityThread.systemMain();
    mSystemContext = activityThread.getSystemContext();
    mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);

    final Context systemUiContext = activityThread.getSystemUiContext();
    systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}

 #ActivityThread.systemMain()
 public static ActivityThread systemMain() {
     //......
     ActivityThread thread = new ActivityThread();
     thread.attach(true, 0);
     return thread;
 }

AMS就在启动引导服务 startBootstrapServices()中启动。

    private void startBootstrapServices() {
        // Activity manager runs the show.
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
	}

startService()最终在SystemServiceManager中调用了Lifecycle的onStart()方法,Lifecycle是AMS的内部类,在onStart()方法调用了AMS的start()方法。

public static final class Lifecycle extends SystemService {
    private final ActivityManagerService mService;

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

    @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();
        }
    }

    @Override
    public void onCleanupUser(int userId) {
        mService.mBatteryStatsService.onCleanupUser(userId);
    }

    public ActivityManagerService getService() {
        return mService;
    }
}

这里看了一圈都没看到哪里有初始化Lifecycle的地方,乍一看,原来是在SystemServiceManager的startService(Class serviceClass)中通过反射调用Lifecycle的构造方法。

public <T extends SystemService> T startService(Class<T> serviceClass) {
    try {
        final String name = serviceClass.getName();
        // Create the service.
        final T service;
        Constructor<T> constructor = serviceClass.getConstructor(Context.class);
        service = constructor.newInstance(mContext);
        startService(service);
        return service;
    } finally {
        Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
    }
}

回到上一步,在new ActivityManagerService(context)中,主要做了创建处理AMS消息的Handler,创建四大组件相关管理对象,还有内存、权限、电池等监控。代码太多这里就不贴出来了。

整体来看

//1、启动服务
mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();
//2、SystemServiceManager传入AMS
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
//3、Installer传入AMS,应用安装相关
mActivityManagerService.setInstaller(installer);
//4、初始化电源相关服务
mActivityManagerService.initPowerManagement();
 //5、设置系统进程
mActivityManagerService.setSystemProcess();
//6、
mActivityManagerService.setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class));
//7、初始化系统Provider相关
mActivityManagerService.installSystemProviders();
//8、传入WindowManager
mActivityManagerService.setWindowManager(wm);
//9、
mActivityManagerService.enterSafeMode();
//10、
mActivityManagerService.showSafeModeOverlay();
//11、在这里启动Launcher
mActivityManagerService.systemReady(...)
//12、
mActivityManagerService.startObservingNativeCrashes()

最后

附上思维导图一张
在这里插入图片描述

欢迎关注我的个人微信公众号,【优了个秀】和你每天进步一点点
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值