美文网首页
Android ActivityManagerService--

Android ActivityManagerService--

作者: DarcyZhou | 来源:发表于2023-10-27 08:42 被阅读0次

本文转载自:ActivityManagerService安装SettingsProvider的过程详解—Android 12(三)

本文基于Android 11.0源码分析

前言

  前一篇中已经分析了SystemServer.startBootstrapServices()中AMS和ATMS启动相关业务,本章将介绍startOtherServices()中与AMS和ATMS相关的业务,安装SettingsProvider的过程。

  安装SettingsProvider的过程如下图所示:

AMS02.PNG

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()。

  该方法的主要逻辑:

  1. 获取AMS中process="system"且UID="SYSTEM_UID"的ProcessRecord。
  2. 从PKMS中查找符合上述信息的Providers,即SettingsProvider,并把这些providers保存到AMS和ProcessRecord中对应的数据结构中。
  3. 接着把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过程就分析到这里。

相关文章

网友评论

      本文标题:Android ActivityManagerService--

      本文链接:https://www.haomeiwen.com/subject/uhgmvdtx.html