和你一起终身学习,这里是程序员 Android
本篇文章主要介绍 Android
开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:
一、AMS 是如何启动的?
二、通过 Lifecycle 启动初始化 AMS 系统服务
三、AMS 构造函数实例实现
四、启动AMS.Start()方法实现
五、AMS设置系统进程实现
六、AMS 安装系统 Provider实现
七、AMS.systemReady准备完成
八、AMS 启动 Launcher实现
一、AMS 是如何启动的?
AMS(ActivityManagerService 简称)
是通过SystemServer.java (frameworks\base\services\java\com\android\server\SystemServer.java)
类中的 startBootstrapServices()
方法启动的。
1. startBootstrapServices主要作用
startBootstrapServices 主要是启动以下引导服务,引导系统Service 起来。
部分通过系统服务如下:
- Installer安装服务、
- Activity管理服务AMS、
- 电源管理服务PowerManagerService、
- Recovery管理服务RecoverySystemService、
- LED 背光显示服务LightsService、
- 显示管理服务DisplayManagerService、
- app 包管理服务PackageManagerService等。
2.AMS启动流程
AMS启动大致流程如下:
- SystemServer.main
- SystemServer.SystemServer()
- SystemServer.run()
- SystemServer.startBootstrapServices()
AMS启动详细流程如下:
public final class SystemServer {
... ...
/**
* The main entry point from zygote.
*/
public static void main(String[] args) {
new SystemServer().run();
}
public SystemServer() {
... ...
mRuntimeRestart = "1".equals(SystemProperties.get("sys.boot_completed"));
... ...
}
private void run() {
... ...
//启动系统服务
try {
traceBeginAndSlog("StartServices");
// 系统引导服务启动,比如:AMS 启动
startBootstrapServices();
startCoreServices();
startOtherServices();
resetSerial();
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
} finally {
traceEnd();
}
... ...
// Set up the Application instance for the system process and get started.
traceBeginAndSlog("SetSystemProcess");
//设置系统进程 详见 五
mActivityManagerService.setSystemProcess();
traceEnd();
... ...
}
//系统引导服务启动的方法
private void startBootstrapServices() {
... ...
// Activity manager runs the show.
traceBeginAndSlog("StartActivityManager");
// 通过 Lifecycle 启动 AMS 系统服务流程,详见 二
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
traceEnd();
... ...
}
private void startOtherServices() {
... ...
// 调用AMS 的 安装系统Provider installSystemProviders 方法,详见步骤 六
traceBeginAndSlog("InstallSystemProviders");
mActivityManagerService.installSystemProviders();
// Now that SettingsProvider is ready, reactivate SQLiteCompatibilityWalFlags
SQLiteCompatibilityWalFlags.reset();
traceEnd();
... ...
// 系统准备完毕,可以让第三代码调用 详见 步骤七
mActivityManagerService.systemReady(() -> {
Slog.i(TAG, "Making services ready");
traceBeginAndSlog("StartActivityManagerReadyPhase");
// ActivityManager 准备完毕
mSystemServiceManager.startBootPhase(
SystemService.PHASE_ACTIVITY_MANAGER_READY);
traceEnd();
... ...
}, BOOT_TIMINGS_TRACE_LOG);
}
... ...
}
二、 通过 Lifecycle 启动初始化 AMS 系统服务
1. 静态全局 Lifecycle 类
在 AMS 中,我们看到静态全局的 final Lifecycle 类对外提供 getService()方法,方便供 SystemServer
类调用。
调用方法如下:
// 通过 Lifecycle 启动 AMS 系统服务流程,详见 二
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
2. AMS 继承实现关系
AMS 的继承关系如下:
public class ActivityManagerService extends IActivityManager.Stub
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
... ...
}
AMS 继承实现关系图如下:
从上图我们可以看出
1.AMS 继承IActivityManager.Stub
类
2.AMS 实现Watchdog.Monitor
和BatteryStatsImpl.BatteryCallback
接口。
3.通过 Lifecycle 启动初始化 AMS 系统服务实现
AMS 是通过Lifecycle启动 AMS 并实现初始化。
具体实现代码如下:
public class ActivityManagerService extends IActivityManager.Stub
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
... ...
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
public Lifecycle(Context context) {
super(context);
// new ActivityManagerService 实例 见分析三
mService = new ActivityManagerService(context);
}
@Override
public void onStart() {
// 启动AMS ,见分析四
mService.start();
}
... ...
public ActivityManagerService getService() {
return mService;
}
}
... ...
}
三、AMS 构造函数实例实现
通过 mService = new ActivityManagerService(context);
,调用 AMS 构造函数,并运行在主线程中(main Thread),需要注意的是,AMS 中有多个Handler,请在loop 的时候注意,不要使用错了。
1. AMS 构造函数主要实现的功能
- 创建
ActivityManager
、android.ui
、ActivityManager:procStart
、ActivityManager:kill
服务线程。 - 设置前台广播、后台广播的超时时间。
- 设置后台Service 最大个数(8个,低 RAM 1个)
- 初始化 系统 Provider,以及AppErrors、AppWarnings。
- 创建
/data/system
目录,并保存procstats、appops.xml
等文件。 - 创建 Intent 防火墙
IntentFirewall
,以及Activity 带来对象ActivityStartController
。 - 创建
CpuTracker
线程 ,收集ANRS
,电池电量信息,更新CPU 状态等。 - 获取 Watchdog 实例,并将AMS 添加到看门狗Monitor中,以及将mHandler 添加到看门狗 线程中。
- 更新 oom_adj 状态。
2. AMS 构造函数实现方法
AMS 构造函数实现如下:
public ActivityManagerService(Context systemContext) {
... ...
//创建名为"ActivityManager"的前台线程,并获取mHandler
// TAG 线程名,请看ActivityManagerDebugConfig,
//默认 TAG_AM 即为 ActivityManager
mHandlerThread = new ServiceThread(TAG,
THREAD_PRIORITY_FOREGROUND, false /*allow