「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。
ActivityManagerService服务启动流程分析
在前篇AMS服务启动流程分析(上)中,我们分析了AMS服务的初始化流程,接下来我们接着从SystemServer类中进行分析
SystemServer.startBootstrapServices
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
// ......
mActivityManagerService.initPowerManagement();
// ......
mActivityManagerService.setSystemProcess();
// ......
watchdog.init(mSystemContext, mActivityManagerService);
// ......
}
ActivityManagerService.initPowerManagement
首先先看ActivityManagerService.initPowerManagement函数的函数调用时序图:
从上述的时序图来看,这个函数主要做了
- 首先调用ActivityTaskManagerService.initPowerManagement函数,在这个函数中, 首先调用ActivityStackSupervisor.initPowerManagement函数,在ActivityStackSupervisor对象中,初始化两个WakeLock,mGoingToSleepWakeLock和mLaunchingActivityWakeLock 其次赋值参数mPowerManagerInternal为PowerManagerService.LocalService对象 最后,初始化一个对象名为mVoiceWakeLock的PowerManager.WakeLock对象
- 其次调用BatteryStatsService.initPowerManagement函数,在这个函数中,主要注册一个低电量ContentObserver对象,用作监听低电量模式,并根据当前是否为低电量模式设置系统,最后记录系统被唤醒的原因
- 最后赋值参数mLocalPowerManager为PowerManagerService.LocalService对象
ActivityManagerService.setSystemProcess
public void setSystemProcess() {
try {
// 注册AMS服务到ServiceManager
ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
// 注册ProcessStats服务到ServiceManager
ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
// 注册ActivityManagerService.MemBinder到ServiceManager
ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,
DUMP_FLAG_PRIORITY_HIGH);
// 注册GraphicsBinder到ServiceManager
ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
// 注册DbBinder到ServiceManager
ServiceManager.addService("dbinfo", new DbBinder(this));
if (MONITOR_CPU_USAGE) {
// 注册CpuBinder到ServiceManager
ServiceManager.addService("cpuinfo", new CpuBinder(this),
/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
}
// 注册PermissionController到ServiceManager
// AMS的权限管理类
ServiceManager.addService("permission", new PermissionController(this));
// 注册ProcessInfoService对象到ServiceManager
// AMS进程管理类
ServiceManager.addService("processinfo", new ProcessInfoService(this));
// 注册CacheBinder对象到ServiceManager
ServiceManager.addService("cacheinfo", new CacheBinder(this));
// 获取一个包名为"android"的应用信息,并注册,这个在后续深入分析
ApplicationInfo info = mContext.getPackageManager().getApplicationInfo(
"android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
synchronized (this) {
// 初始化一个ProcessRecord对象
ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,
false,
0,
new HostingRecord("system"));
app.setPersistent(true);
app.pid = app.mPidForCompact = MY_PID;
app.getWindowProcessController().setPid(MY_PID);
app.maxAdj = ProcessList.SYSTEM_ADJ;
app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
addPidLocked(app);
mProcessList.updateLruProcessLocked(app, false, null);
updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
}
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException(
"Unable to find android system package", e);
}
// Start watching app ops after we and the package manager are up and running.
// 开始监听模式
mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null,
new IAppOpsCallback.Stub() {
@Override public void opChanged(int op, int uid, String packageName) {
if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) {
if (getAppOpsManager().checkOpNoThrow(op, uid, packageName)
!= AppOpsManager.MODE_ALLOWED) {
runInBackgroundDisabled(uid);
}
}
}
});
final int[] cameraOp = {AppOpsManager.OP_CAMERA};
mAppOpsService.startWatchingActive(cameraOp, new IAppOpsActiveCallback.Stub() {
@Override
public void opActiveChanged(int op, int uid, String packageName, boolean active) {
cameraActiveChanged(uid, active);
}
});
}
这边主要注册了一些服务。然后初始化了一个ApplicationInfo并安装,通过ApplicationInfo对象创建一个ProcessRecord对象,并初始化,最后穹顶后台应用监听和Camera活跃监听
watchdog.init
public void init(Context context, ActivityManagerService activity) {
mActivity = activity;
context.registerReceiver(new RebootRequestReceiver(),
new IntentFilter(Intent.ACTION_REBOOT),
android.Manifest.permission.REBOOT, null);
}
这边主要是注册了一个Reboot的广播监听,并且在接收到广播的时候,触发重启操作
SystemServer.startCoreServices
private void startCoreServices(@NonNull TimingsTraceAndSlog t) {
// ......
mActivityManagerService.setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class));
// ......
}
public void setUsageStatsManager(UsageStatsManagerInternal usageStatsManager) {
mUsageStatsService = usageStatsManager;
mActivityTaskManager.setUsageStatsManager(usageStatsManager);
}
初始化操作
SystemServer.startOtherServices
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
// ......
// 注册拥有系统权限的所有ContentProvider
mActivityManagerService.installSystemProviders();
// ......
// 设置WindowManagerService对象
mActivityManagerService.setWindowManager(wm);
// ......
mActivityManagerService.systemReady(() -> {
// ...... 功能无关代码,省略
// 调用SystemServiceManager.startBootPhase函数
// 此前SystemServiceManager.startService函数调用的时候,会将所有启动的服务添加到该对象的mServices中
// 此时会在这个函数中调用所有mServices包含的服务的onBootPhase函数
// 需要注意的是第二个参数,它标识着onBootPhase响应的阶段
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_ACTIVITY_MANAGER_READY);
// ...... 功能无关代码,省略
try {
// 启动监听Native Crash异常
mActivityManagerService.startObservingNativeCrashes();
}
// ...... 功能无关代码,省略
// No dependency on Webview preparation in system server. But this should
// be completed before allowing 3rd party
final String WEBVIEW_PREPARATION = "WebViewFactoryPreparation";
Future<?> webviewPrep = null;
if (!mOnlyCore && mWebViewUpdateService != null) {
webviewPrep = SystemServerInitThreadPool.submit(() -> {
Slog.i(TAG, WEBVIEW_PREPARATION);
TimingsTraceAndSlog traceLog = TimingsTraceAndSlog.newAsyncLog();
traceLog.traceBegin(WEBVIEW_PREPARATION);
ConcurrentUtils.waitForFutureNoInterrupt(mZygotePreload, "Zygote preload");
mZygotePreload = null;
mWebViewUpdateService.prepareWebViewInSystemServer();
traceLog.traceEnd();
}, WEBVIEW_PREPARATION);
}
// ...... 功能无关代码,省略
try {
// 启动SystemUI服务
startSystemUi(context, windowManagerF);
}
// ...... 功能无关代码,省略
// Enable airplane mode in safe mode. setAirplaneMode() cannot be called
// earlier as it sends broadcasts to other services.
// TODO: This may actually be too late if radio firmware already started leaking
// RF before the respective services start. However, fixing this requires changes
// to radio firmware and interfaces.
// 判断当前是否为安全模式,当安全模式时,飞行模式会被打开
if (safeMode) {
t.traceBegin("EnableAirplaneModeInSafeMode");
try {
connectivityF.setAirplaneMode(true);
}
// ...... catch语句,此处省略
}
// ...... 功能无关代码,省略
try {
// AMS启动完成后,准备守护进程的相关资源
if (networkManagementF != null) {
networkManagementF.systemReady();
}
}
// ...... 功能无关代码,省略
// 网络准备完成,注册必要的广播,注册省电模式的状态变化等
CountDownLatch networkPolicyInitReadySignal = null;
if (networkPolicyF != null) {
networkPolicyInitReadySignal = networkPolicyF
.networkScoreAndNetworkManagementServiceReady();
}
// ...... 功能无关代码,省略
try {
if (ipSecServiceF != null) {
ipSecServiceF.systemReady();
}
}
// ...... 功能无关代码,省略
try {
if (networkStatsF != null) {
networkStatsF.systemReady();
}
}
// ...... 功能无关代码,省略
try {
if (connectivityF != null) {
connectivityF.systemReady();
}
}
// ...... 功能无关代码,省略
try {
if (networkPolicyF != null) {
networkPolicyF.systemReady(networkPolicyInitReadySignal);
}
}
// ...... 功能无关代码,省略
// Wait for all packages to be prepared
// 等待系统应用的Data数据的加载
mPackageManagerService.waitForAppDataPrepared();
// It is now okay to let the various system services start their
// third party code...
// ...... 功能无关代码,省略
// confirm webview completion before starting 3rd party
if (webviewPrep != null) {
ConcurrentUtils.waitForFutureNoInterrupt(webviewPrep, WEBVIEW_PREPARATION);
}
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
// ...... 功能无关代码,省略
try {
// Note : the network stack is creating on-demand objects that need to send
// broadcasts, which means it currently depends on being started after
// ActivityManagerService.mSystemReady and ActivityManagerService.mProcessesReady
// are set to true. Be careful if moving this to a different place in the
// startup sequence.
NetworkStackClient.getInstance().start();
}
// ...... 功能无关代码,省略
try {
// TODO: hide implementation details, b/146312721.
ConnectivityModuleConnector.getInstance().startModuleService(
TETHERING_CONNECTOR_CLASS,
PERMISSION_MAINLINE_NETWORK_STACK, service -> {
ServiceManager.addService(Context.TETHERING_SERVICE, service,
false /* allowIsolated */,
DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL);
});
}
// ...... 功能无关代码,省略
try {
if (countryDetectorF != null) {
countryDetectorF.systemRunning();
}
}
// ...... 功能无关代码,省略
try {
if (networkTimeUpdaterF != null) {
networkTimeUpdaterF.systemRunning();
}
}
// ...... 功能无关代码,省略
try {
// TODO(BT) Pass parameter to input manager
if (inputManagerF != null) {
inputManagerF.systemRunning();
}
}
// ...... 功能无关代码,省略
try {
if (telephonyRegistryF != null) {
telephonyRegistryF.systemRunning();
}
}
// ...... 功能无关代码,省略
try {
if (mediaRouterF != null) {
mediaRouterF.systemRunning();
}
}
// ...... 功能无关代码,省略
try {
if (mmsServiceF != null) {
mmsServiceF.systemRunning();
}
}
// ...... 功能无关代码,省略
try {
// TODO: Switch from checkService to getService once it's always
// in the build and should reliably be there.
final IIncidentManager incident = IIncidentManager.Stub.asInterface(
ServiceManager.getService(Context.INCIDENT_SERVICE));
if (incident != null) {
incident.systemRunning();
}
}
// ...... 功能无关代码,省略
if (mIncrementalServiceHandle != 0) {
t.traceBegin("MakeIncrementalServiceReady");
setIncrementalServiceSystemReady(mIncrementalServiceHandle);
t.traceEnd();
}
}, t);
// ......
}
可以看到,这个函数表明AMS服务的启动已经完成,在完成的同时会通知其他应用完成自己的加载,由于这块会有多个模块加载完成,而且流程比较复杂,对于这部分的分析待后续对特定的类或者模块分析时再行实际分析,暂时只更新流程时序图