本文转载自:ActivityManagerService安装SettingsProvider的过程详解—Android 12(三)
本文基于Android 11.0源码分析
前言
前一篇中已经分析了SystemServer.startBootstrapServices()中AMS和ATMS启动相关业务,本章将介绍startOtherServices()中与AMS和ATMS相关的业务,安装SettingsProvider的过程。
安装SettingsProvider的过程如下图所示:
1.startOtherServices()
前一篇文档中已经分析到了startOtherServices()方法,这里就从该方法开始分析:
// frameworks/base/services/java/com/android/server/SystemServer.java
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
//1.加载SettingsProvider到systemserver进程中
mActivityManagerService.installSystemProviders();
//2.启动WMS, 注册WMS到systemserver进程中
wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,
new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
//注册IMS到systemserver进程
ServiceManager.addService(Context.INPUT_SERVICE, inputManager,
/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
t.traceEnd();
t.traceBegin("SetWindowManagerService");
//3\. 设置AMS的WM
mActivityManagerService.setWindowManager(wm);
t.traceEnd();
t.traceBegin("WindowManagerServiceOnInitReady");
wm.onInitReady();
t.traceEnd();
...
try {
// TODO: use boot phase
//PowerMS启动完成
mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());
} catch (Throwable e) {
reportWtf("making Power Manager Service ready", e);
}
...
//4.AMS.systemReady()
mActivityManagerService.systemReady(() -> {
Slog.i(TAG, "Making services ready");
t.traceBegin("StartActivityManagerReadyPhase");
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_ACTIVITY_MANAGER_READY);
t.traceEnd();
t.traceBegin("StartObservingNativeCrashes");
try {
mActivityManagerService.startObservingNativeCrashes();
} catch (Throwable e) {
reportWtf("observing native crashes", e);
}
t.traceEnd();
...
}
2.AMS.installSystemProviders()
startOtherServices()方法中,有很多的流程,这里只关注installSystemProviders(),继续流程会调用ActivityManagerService.java中的installSystemProviders()。
该方法的主要逻辑:
- 获取AMS中process="system"且UID="SYSTEM_UID"的ProcessRecord。
- 从PKMS中查找符合上述信息的Providers,即SettingsProvider,并把这些providers保存到AMS和ProcessRecord中对应的数据结构中。
- 接着把SettingsProvider安装到系统的主进程中,即systemserver进程。
// frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
public final void installSystemProviders() {
List<ProviderInfo> providers;
synchronized (this) {
//1.从AMS的processList中找到进程为"system"且uid="SYSTEM_UID"的ProcessRecord
ProcessRecord app = mProcessList.mProcessNames.get("system", SYSTEM_UID);
//从PKMS查询满足条件的ProviderInfo,保存到AMS和ProcessRecord中对应的数据结构中
providers = generateApplicationProvidersLocked(app);
if (providers != null) {
for (int i=providers.size()-1; i>=0; i--) {
ProviderInfo pi = (ProviderInfo)providers.get(i);
if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
Slog.w(TAG, "Not installing system proc provider " + pi.name
+ ": not system .apk");
//去除providers中非系统APK(没有设置SYSTEM_UID的apk)的Provider
providers.remove(i);
}
}
}
}
if (providers != null) {
//2.为AMS的mSystemThread(它是systemserver的主线程)安装SystemProviders,
//因此是为systemserver安装系统providers
mSystemThread.installSystemProviders(providers);
}
synchronized (this) {
mSystemProvidersInstalled = true;
}
mConstants.start(mContext.getContentResolver());
mCoreSettingsObserver = new CoreSettingsObserver(this);
mActivityTaskManager.installSystemProviders();
mDevelopmentSettingsObserver = new DevelopmentSettingsObserver();
SettingsToPropertiesMapper.start(mContext.getContentResolver());
mOomAdjuster.initSettings();
// Now that the settings provider is published we can consider sending
// in a rescue party.
RescueParty.onSettingsProviderPublished(mContext);
//mUsageStatsService.monitorPackages();
}
上述代码的中查找process="system"且有"SYSTEM_UID"权限,得到的Providers就是SettingsProvider,因为它的AndroidManifest.xml中就表明了如下所示:
// frameworks/base/packages/SettingsProvider/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.providers.settings"
coreApp="true"
android:sharedUserId="android.uid.system"><!-- SYSTEM_UID权限 -->
<application android:allowClearUserData="false"
android:label="@string/app_label"
android:process="system" <!-- process=system -->
android:backupAgent="SettingsBackupAgent"
android:killAfterRestore="false"
android:restoreAnyVersion="true"
android:icon="@mipmap/ic_launcher_settings"
android:defaultToDeviceProtectedStorage="true"
android:forceQueryable="true"
android:directBootAware="true">
<provider android:name="SettingsProvider"
android:authorities="settings"
android:multiprocess="false"
android:exported="true"
android:singleUser="true"
android:initOrder="100"
android:visibleToInstantApps="true" />
<service
android:name="WriteFallbackSettingsFilesJobService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="true"/>
</application>
</manifest>
从上述文件可以看到SettingsProvider中只有一个provider组件,之后会安装该provider。
3.ActivityThread.installSystemProviders()
继续流程,mSystemThread调用installSystemProviders(),mSystemThread就是SystemServer启动时为systemserver进程创建的ActivityThread对象,即mSystemThread就是systemserver进程的主线程。
if (providers != null) {
//2.为AMS的mSystemThread(它是systemserver的主线程)安装SystemProviders,
//因此是为systemserver安装系统providers
mSystemThread.installSystemProviders(providers);
}
该方法是实际上调用自身的installContentProvides()来实现,参数providers是SettinsProvider的AndroidManifest.xml中声明的一个provider。
// frameworks/base/core/java/android/app/ActivityThread.java
public final void installSystemProviders(List<ProviderInfo> providers) {
if (providers != null) {
installContentProviders(mInitialApplication, providers);
}
}
private void installContentProviders(
Context context, List<ProviderInfo> providers) {
final ArrayList<ContentProviderHolder> results = new ArrayList<>();
for (ProviderInfo cpi : providers) {
...
//遍历安装provider
ContentProviderHolder cph = installProvider(context, null, cpi,
false /*noisy*/, true /*noReleaseNeeded*/, true /*stable*/);
if (cph != null) {
cph.noReleaseNeeded = true;
results.add(cph);
}
}
try {
//向AMS发布这个SettingsProvider,之后settings数据库相关操作均由它管理
ActivityManager.getService().publishContentProviders(
getApplicationThread(), results);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
}
安装SettingsProvider过程就分析到这里。
网友评论