android 前台服务_“无处不在”的系统核心服务—ActivityManagerService 启动流程

264d79173dc93c88dbb5b3191a9fac04.png

本文基于 Android 9.0 , 代码仓库地址 : https://github.com/lulululbj/android_9.0.0_r45

系列文章目录:

https://juejin.im/post/5d8f73bf51882555b149dc64

https://juejin.im/post/5da341f451882561ba64b9da

https://juejin.im/post/5da5e7da518825740064f951

文中相关源码链接:

https://github.com/lulululbj/android_9.0.0_r45/blob/master/frameworks/base/services/java/com/android/server/SystemServer.java

https://github.com/lulululbj/android_9.0.0_r45/blob/master/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

之前介绍 https://juejin.im/post/5da341f451882561ba64b9da 的时候说到,SystemServer 进程启动了一系列的系统服务,ActivityManagerService 是其中最核心的服务之一。它和四大组件的启动、切换、调度及应用进程的管理和调度息息相关,其重要性不言而喻。本文主要介绍其启动流程,它是在 SystemServer 的 main() 中启动的,整个启动流程经历了 startBootstrapServices 、startCoreService() 、startOtherService()。下面就顺着源码来捋一捋 ActivityManagerService 的启动流程,下文中简称 AMS。

private void startBootstrapServices() {

...

// 1. AMS 初始化

mActivityManagerService = mSystemServiceManager.startService(

ActivityManagerService.Lifecycle.class).getService();

// 设置 AMS 的系统服务管理器

mActivityManagerService.setSystemServiceManager(mSystemServiceManager);

// 设置 AMS 的应用安装器

mActivityManagerService.setInstaller(installer);

...

mActivityManagerService.initPowerManagement();

...

// 2. AMS.setSystemProcess()

mActivityManagerService.setSystemProcess();

...

}

private void startCoreServices{

...

mActivityManagerService.setUsageStatsManager(

LocalServices.getService(UsageStatsManagerInternal.class));

...

}

private void startherService{

...

// 3. 安装系统 Provider

mActivityManagerService.installSystemProviders();

...

final Watchdog watchdog = Watchdog.getInstance();

watchdog.init(context, mActivityManagerService);

...

mActivityManagerService.setWindowManager(wm);

...

networkPolicy = new NetworkPolicyManagerService(context, mActivityManagerService,

networkManagement);

...

if (safeMode) {

traceBeginAndSlog("EnterSafeModeAndDisableJitCompilation");

mActivityManagerService.enterSafeMode();

// Disable the JIT for the system_server process

VMRuntime.getRuntime().disableJitCompilation();

traceEnd();

}

...

mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());

...

// 4. AMS.systemReady()

mActivityManagerService.systemReady(() -> {

...

mActivityManagerService.startObservingNativeCrashes();

}

}

AMS 初始化

mActivityManagerService = mSystemServiceManager.startService(

ActivityManagerService.Lifecycle.class).getService();

AMS 通过 SystemServiceManager.startService() 方法初始化,startService() 在之前的文章中已经分析过,其作用是根据参数传入的类通过反射进行实例化,并回调其 onStart() 方法。注意这里传入的是 ActivityManagerService.Lifecycle.class,LifeCycle 是 AMS 的一个静态内部类。

public static final class Lifecycle extends SystemService {

private final ActivityManagerService mService;

// 构造函数中新建 ActivityManagerService 对象

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 的构造函数中初始化了 AMS。再来看看 AMS 的构造函数。

public ActivityManagerService(Context systemContext) {

mInjector = new Injector();

// AMS 上下文

mContext = systemContext;

mFactoryTest = FactoryTest.getMode();

// ActivityThread 对象

mSystemThread = ActivityThread.currentActivityThread();

// ContextImpl 对象

mUiContext = mSystemThread.getSystemUiContext();

mPermissionReviewRequired = mContext.getResources().getBoolean(

com.android.internal.R.bool.config_permissionReviewRequired);

// 线程名为 ActivityManager 的前台线程,ServiceThread 继承于 HandlerThread

mHandlerThread = new ServiceThread(TAG,

THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);

mHandlerThread.start();

// 获取 mHandlerThread 的 Handler 对象

mHandler = new MainHandler(mHandlerThread.getLooper());

// 创建名为 android.ui 的线程

mUiHandler = mInjector.getUiHandler(this);

// 不知道什么作用

mProcStartHandlerThread = new ServiceThread(TAG + ":procStart

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值