Android Framework重要服务之PackageManagerService(一) PMS启动流程

1,215 阅读7分钟

PackageManagerServices(程序包管理服务)是安卓系统核心服务之一,简称PMS,在安卓系统中负责管理应用,常见的比如安装、卸载应用等,本章将结合安卓11源码梳理PMS相关流程。

一、启动PMS服务

PMS作为系统核心服务之一,其启动流程位于frameworks/base/services/java/com/android/server/SystemServer.java,相关代码如下:

// 在startBootstrapServices下启动PMS
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
    ...

    // 启动installer,该服务会创建具有适当权限的关键目录,如/data/user
    // installer服务必须在其他服务启动之前启动
    t.traceBegin("StartInstaller");
    Installer installer = mSystemServiceManager.startService(Installer.class);
    t.traceEnd();

    ...
    // 启动PMS
    t.traceBegin("StartPackageManagerService");
    try {
        Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain");
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
            domainVerificationService, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF,
            mOnlyCore);
    } finally {
        Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");
    }
}

// 在startOtherServices下确保PMS启动完成
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
    ...
    
    t.traceBegin("MakePackageManagerServiceReady");
    mPackageManagerService.systemReady();
    t.traceEnd();
    
    ...
}

二、PMS启动流程

PMS在SystemServer.java中被启动后,会前往 frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java中继续其启动流程,PMS的Main函数如下:

public static PackageManagerService main(Context context, Installer installer,
        @NonNull DomainVerificationService domainVerificationService, boolean factoryTest,
        boolean onlyCore) {
    // 检查初始化配置
    PackageManagerServiceCompilerMapping.checkProperties();
    ...
    
Injector injector = new Injector(
    context, lock, installer, installLock, new PackageAbiHelperImpl(),
    backgroundHandler,
    SYSTEM_PARTITIONS,
    (i, pm) -> new ComponentResolver(i.getUserManagerService(), pm.mPmInternal, lock),
    (i, pm) -> PermissionManagerService.create(context,
            i.getSystemConfig().getAvailableFeatures()),
    // 创建多用户管理服务
    (i, pm) -> new UserManagerService(context, pm,
            new UserDataPreparer(installer, installLock, context, onlyCore),
            lock),
    // 初始化Settings对象
    (i, pm) -> new Settings(Environment.getDataDirectory(),
            RuntimePermissionsPersistence.createInstance(),
            i.getPermissionManagerServiceInternal(),
            domainVerificationService, lock),
    (i, pm) -> AppsFilter.create(pm.mPmInternal, i),
    (i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat"),
    (i, pm) -> SystemConfig.getInstance(),
    (i, pm) -> new PackageDexOptimizer(i.getInstaller(), i.getInstallLock(),
            i.getContext(), "*dexopt*"),
    (i, pm) -> new DexManager(i.getContext(), pm, i.getPackageDexOptimizer(),
            i.getInstaller(), i.getInstallLock()),
    (i, pm) -> new ArtManagerService(i.getContext(), pm, i.getInstaller(),
            i.getInstallLock()),
    (i, pm) -> ApexManager.getInstance(),
    (i, pm) -> new ViewCompiler(i.getInstallLock(), i.getInstaller()),
    (i, pm) -> (IncrementalManager)
            i.getContext().getSystemService(Context.INCREMENTAL_SERVICE),
    (i, pm) -> new DefaultAppProvider(() -> context.getSystemService(RoleManager.class),
            () -> LocalServices.getService(UserManagerInternal.class)),
    (i, pm) -> new DisplayMetrics(),
    (i, pm) -> new PackageParser2(pm.mSeparateProcesses, pm.mOnlyCore,
            i.getDisplayMetrics(), pm.mCacheDir,
            pm.mPackageParserCallback) /* scanningCachingPackageParserProducer */,
    (i, pm) -> new PackageParser2(pm.mSeparateProcesses, pm.mOnlyCore,
            i.getDisplayMetrics(), null,
            pm.mPackageParserCallback) /* scanningPackageParserProducer */,
    (i, pm) -> new PackageParser2(pm.mSeparateProcesses, false, i.getDisplayMetrics(),
            null, pm.mPackageParserCallback) /* preparingPackageParserProducer */,
    // Prepare a supplier of package parser for the staging manager to parse apex file
    // during the staging installation.
    (i, pm) -> new PackageInstallerService(
            i.getContext(), pm, i::getScanningPackageParser),
    (i, pm, cn) -> new InstantAppResolverConnection(
            i.getContext(), cn, Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE),
    (i, pm) -> new ModuleInfoProvider(i.getContext(), pm),
    (i, pm) -> LegacyPermissionManagerService.create(i.getContext()),
    (i, pm) -> domainVerificationService,
    (i, pm) -> {
        HandlerThread thread = new ServiceThread(TAG,
                Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/);
        thread.start();
        return pm.new PackageHandler(thread.getLooper());
    },
    new DefaultSystemWrapper(),
    LocalServices::getService,
    context::getSystemService);
    ...
    
    // 创建PMS对象
    PackageManagerService m = new PackageManagerService(injector, onlyCore, factoryTest,
        Build.FINGERPRINT, Build.IS_ENG, Build.IS_USERDEBUG, Build.VERSION.SDK_INT,
        Build.VERSION.INCREMENTAL);  
   ...
   
    // 为用户安装系统应用
    m.installWhitelistedSystemPackages();
    // 向ServiceManager注册PMS服务
    ServiceManager.addService("package", m);
    // 向ServiceManager注册PMS的Binder接口服务
    final PackageManagerNative pmn = m.new PackageManagerNative();
    ServiceManager.addService("package_native", pmn);
    return m;
 }

PMS的构造方法代码较多,可以分为5个阶段:

1. PMS_START阶段

public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest,
        final String buildFingerprint, final boolean isEngBuild,
        final boolean isUserDebugBuild, final int sdkVersion, final String incrementalVersion) {
    ...
    
    // 打印启动日志
    EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START, SystemClock.uptimeMillis());
    ...
    
    // 创建Settings对象
    mSettings = injector.getSettings();
    ...
    
    // 调用addSharedUserLPw函数添加共享ID
    t.traceBegin("addSharedUsers");
    mSettings.addSharedUserLPw("android.uid.system", Process.SYSTEM_UID,
        ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
    mSettings.addSharedUserLPw("android.uid.phone", RADIO_UID,
        ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
    mSettings.addSharedUserLPw("android.uid.log", LOG_UID,
        ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
    mSettings.addSharedUserLPw("android.uid.nfc", NFC_UID,
        ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
    mSettings.addSharedUserLPw("android.uid.bluetooth", BLUETOOTH_UID,
        ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
    mSettings.addSharedUserLPw("android.uid.shell", SHELL_UID,
        ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
    mSettings.addSharedUserLPw("android.uid.se", SE_UID,
        ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
    mSettings.addSharedUserLPw("android.uid.networkstack", NETWORKSTACK_UID,
        ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
    mSettings.addSharedUserLPw("android.uid.uwb", UWB_UID,
        ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
    t.traceEnd();
    ...
    
    // 获取dex优化对象
    mPackageDexOptimizer = injector.getPackageDexOptimizer();
    // 获取dex管理对象
    mDexManager = injector.getDexManager();
    ...
    
    // 获取系统配置信息
    t.traceBegin("get system config");
    SystemConfig systemConfig = injector.getSystemConfig();
    mAvailableFeatures = systemConfig.getAvailableFeatures();
    t.traceEnd();
    ...
    
    // 在Data分区创建app目录
    mAppInstallDir = new File(Environment.getDataDirectory(), "app");
    
    // 在Data分区创建framework目录
    File frameworkDir = new File(Environment.getRootDirectory(), "framework");
    
    ...
}

总体来说,PMS_START阶段可以分为以下几个部分

  • 获取Settings类,这个类在Android中是在PMS的Main函数下初始化的,Settings的具体构造函数如下:
Settings(File dataDir, RuntimePermissionsPersistence runtimePermissionsPersistence,
        LegacyPermissionDataProvider permissionDataProvider,
        @NonNull DomainVerificationManagerInternal domainVerificationManager,
        @NonNull PackageManagerTracedLock lock)  {
        ...
        
        // 创建/data/system文件夹
        mSystemDir = new File(dataDir, "system");
        mSystemDir.mkdirs();
        // 设置文件夹权限
        FileUtils.setPermissions(mSystemDir.toString(),
                FileUtils.S_IRWXU|FileUtils.S_IRWXG
                |FileUtils.S_IROTH|FileUtils.S_IXOTH,
                -1, -1);
        mSettingsFilename = new File(mSystemDir, "packages.xml");
        mBackupSettingsFilename = new File(mSystemDir, "packages-backup.xml");
        mPackageListFilename = new File(mSystemDir, "packages.list");
        FileUtils.setPermissions(mPackageListFilename, 0640, SYSTEM_UID, PACKAGE_INFO_GID);

        final File kernelDir = new File("/config/sdcardfs");
        mKernelMappingFilename = kernelDir.exists() ? kernelDir : null;

        // Deprecated: Needed for migration
        mStoppedPackagesFilename = new File(mSystemDir, "packages-stopped.xml");
        mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml");

        mDomainVerificationManager = domainVerificationManager;

        registerObservers();
        Watchable.verifyWatchedAttributes(this, mObserver);

            mSnapshot = makeCache();     
}

/data/system目录下存在以下5个文件:

文件功能
packages.xml记录所有安装app的信息
packages-backup.xml备份文件
packages-stopped.xml记录系统被强制停止的文件
packages-stopped-backup.xml备份文件
packages.list记录应用的数据信息
  • 向Settings中添加信息
  • 获取系统配置信息,包括全局属性、groupid以及系统权限。将一些类进行绑定,包括:PackageDexOptimizer (dex优化工具类) 、 DexManager(dex管理类)、PackageHandler(建立package相关操作的消息循环)等
  • 创建data下的各种目录

2. PMS_SYSTEM_SCAN_START阶段

public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest,
        final String buildFingerprint, final boolean isEngBuild,
        final boolean isUserDebugBuild, final int sdkVersion, final String incrementalVersion) {
        ...
        
    // 打印启动日志
    EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SYSTEM_SCAN_START, startTime);
       
    // 读取环境变量BOOTCLASSPATH,用于之后的类加载和优化
    final String bootClassPath = System.getenv("BOOTCLASSPATH");
    
    final String systemServerClassPath = System.getenv("SYSTEMSERVERCLASSPATH");
    ...
    
    // 在system/下创建framework目录
    File frameworkDir = new File(Environment.getRootDirectory(), "framework");
    ...
    

    // 在扫描APK之前准备APEX包信息
    mApexManager.scanApexPackagesTraced(packageParser, executorService);
    
    // 在vendor/product/system_ext分区的收集包名
    for (int i = mDirsToScanAsSystem.size() - 1; i >= 0; i--) {
        final ScanPartition partition = mDirsToScanAsSystem.get(i);
        if (partition.getOverlayFolder() == null) {
            continue;
        }
        scanDirTracedLI(partition.getOverlayFolder(), systemParseFlags,
                systemScanFlags | partition.scanFlag, 0,
                packageParser, executorService);
    }

    // 在system/framework目录下收集包名
    scanDirTracedLI(frameworkDir, systemParseFlags,
            systemScanFlags | SCAN_NO_DEX | SCAN_AS_PRIVILEGED, 0,
            packageParser, executorService);
    if (!mPackages.containsKey("android")) {
        throw new IllegalStateException(
                "Failed to load frameworks package; check log for warnings");
    }
    for (int i = 0, size = mDirsToScanAsSystem.size(); i < size; i++) {
        final ScanPartition partition = mDirsToScanAsSystem.get(i);
        if (partition.getPrivAppFolder() != null) {
            scanDirTracedLI(partition.getPrivAppFolder(), systemParseFlags,
                    systemScanFlags | SCAN_AS_PRIVILEGED | partition.scanFlag, 0,
                    packageParser, executorService);
        }
        scanDirTracedLI(partition.getAppFolder(), systemParseFlags,
                systemScanFlags | partition.scanFlag, 0,
                packageParser, executorService);
    }
    
     // 收集可能不再存在的系统App
     final List<String> possiblyDeletedUpdatedSystemApps = new ArrayList<>();
     final List<String> stubSystemApps = new ArrayList<>();
     if (!mOnlyCore) {
        // do this first before mucking with mPackages for the "expecting better" case
        final Iterator<AndroidPackage> pkgIterator = mPackages.values().iterator();
        while (pkgIterator.hasNext()) {
             final AndroidPackage pkg = pkgIterator.next();
             if (pkg.isStub()) {
                 stubSystemApps.add(pkg.getPackageName());
           }
      }
      
    final Iterator<PackageSetting> psit = mSettings.mPackages.values().iterator();
   // 将packages.xml文件中读取的记录和实时扫描得到的记录做比较,看看有哪些变化
   // OTA升级往往会带来一些变化
   while (psit.hasNext()) {
       PackageSetting ps = psit.next();

       // 非系统App跳过
       if ((ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) {
            continue;
        }
        final AndroidPackage scannedPkg = mPackages.get(ps.name);
        if (scannedPkg != null) {
             if (mSettings.isDisabledSystemPackageLPr(ps.name)) {
                   logCriticalInfo(Log.WARN,
                   "Expecting better updated system app for " + ps.name
                   + "; removing system app.  Last known"
                   + " codePath=" + ps.codePathString
                   + ", versionCode=" + ps.versionCode
                   + "; scanned versionCode=" + scannedPkg.getLongVersionCode());
                   removePackageLI(scannedPkg, true);
                   mExpectingBetter.put(ps.name, ps.codePath);
                 }
             continue;
         }

         if (!mSettings.isDisabledSystemPackageLPr(ps.name)) {
             psit.remove();
             logCriticalInfo(Log.WARN, "System package " + ps.name
             + " no longer exists; it's data will be wiped");
             mPermissionManager.updatePermissions(ps.name, null);
          } else {
             final PackageSetting disabledPs =
             mSettings.getDisabledSystemPkgLPr(ps.name);
             if (disabledPs.codePath == null || !disabledPs.codePath.exists()
                      || disabledPs.pkg == null) {
                  possiblyDeletedUpdatedSystemApps.add(ps.name);
                } else {
                    mExpectingBetter.put(disabledPs.name, disabledPs.codePath);
                 }
             }
         }
     }
     ...
     
}

可以看出,这里的主要工作是对系统区进行扫描,扫描顺序是OverlayFolder -> frameworkDir -> PrivAppFolder -> AppFolder(), 这里主要操作如下:

  1. 扫描各个系统分区的的App
  2. 解析系统App信息
  3. 把解析结果存储起来,存储在PMS的相关属性和mSettings里

3. PMS_DATA_SCAN_START阶段

if (!mOnlyCore) {
    EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,
            SystemClock.uptimeMillis());
            
    // 在/data/app目录扫描用户安装文件
    scanDirTracedLI(sAppInstallDir, 0, scanFlags | SCAN_REQUIRE_KNOWN, 0,
            packageParser, executorService);

}

// 关闭packageParser
packageParser.close();

List<Runnable> unfinishedTasks = executorService.shutdownNow();
if (!unfinishedTasks.isEmpty()) {
    throw new IllegalStateException("Not all tasks finished before calling close: "
            + unfinishedTasks);
}

if (!mOnlyCore) {
    // 删除OTA升级中移除的系统App,如果OTA对这个App的操作是“删除”,则完全删除App相关的东西,否则剥夺它的“系统App”权限
    for (int i = possiblyDeletedUpdatedSystemApps.size() - 1; i >= 0; --i) {
        final String packageName = possiblyDeletedUpdatedSystemApps.get(i);
        final AndroidPackage pkg = mPackages.get(packageName);
        final String msg;

        // 从disabled清单删除
        mSettings.removeDisabledSystemPackageLPw(packageName);

        if (pkg == null) {
            // should have found an update, but, we didn't; remove everything
            // pkg
            msg = "Updated system package " + packageName
                    + " no longer exists; removing its data";
            // Actual deletion of code and data will be handled by later
            // reconciliation step
        } else {
            // found an update; revoke system privileges
            msg = "Updated system package " + packageName
                    + " no longer exists; rescanning package on data";
             
            //  从系统中删除该包并重新扫描权限
            removePackageLI(pkg, true);
            try {
                final File codePath = new File(pkg.getCodePath());
                scanPackageTracedLI(codePath, 0, scanFlags, 0, null);
            } catch (PackageManagerException e) {
                Slog.e(TAG, "Failed to parse updated, ex-system package: "
                        + e.getMessage());
            }
        }
        
        final PackageSetting ps = mSettings.mPackages.get(packageName);
        if (ps != null && mPackages.get(packageName) == null) {
            removePackageDataLIF(ps, null, null, 0, false);

        }
        logCriticalInfo(Log.WARN, msg);
    }
    
    //遍历mExpectingBetter列表
    for (int i = 0; i < mExpectingBetter.size(); i++) {
        final String packageName = mExpectingBetter.keyAt(i);
        if (!mPackages.containsKey(packageName)) {
            //得到系统App的升级包路径
            final File scanFile = mExpectingBetter.valueAt(i);

            logCriticalInfo(Log.WARN, "Expected better " + packageName
                    + " but never showed up; reverting to system");

            @ParseFlags int reparseFlags = 0;
            @ScanFlags int rescanFlags = 0;
            for (int i1 = mDirsToScanAsSystem.size() - 1; i1 >= 0; i1--) {
                final ScanPartition partition = mDirsToScanAsSystem.get(i1);
                if (partition.containsPrivApp(scanFile)) {
                    reparseFlags = systemParseFlags;
                    rescanFlags = systemScanFlags | SCAN_AS_PRIVILEGED
                            | partition.scanFlag;
                    break;
                }
                if (partition.containsApp(scanFile)) {
                    reparseFlags = systemParseFlags;
                    rescanFlags = systemScanFlags | partition.scanFlag;
                    break;
                }
            }
            if (rescanFlags == 0) {
                Slog.e(TAG, "Ignoring unexpected fallback path " + scanFile);
                continue;
            }
            // 将packageName对应的包设置数据(PackageSetting)添加到mSettings的mPackages中
            mSettings.enableSystemPackageLPw(packageName);

            try {
                // 扫描系统App的升级包
                scanPackageTracedLI(scanFile, reparseFlags, rescanFlags, 0, null);
            } catch (PackageManagerException e) {
                Slog.e(TAG, "Failed to parse original system package: "
                        + e.getMessage());
            }
        }
    }

    installSystemStubPackages(stubSystemApps, scanFlags);

    final int cachedNonSystemApps = PackageCacher.sCachedPackageReadCount.get()
                    - cachedSystemApps;

    final long dataScanTime = SystemClock.uptimeMillis() - systemScanTime - startTime;
    final int dataPackagesCount = mPackages.size() - systemPackagesCount;
    Slog.i(TAG, "Finished scanning non-system apps. Time: " + dataScanTime
            + " ms, packageCount: " + dataPackagesCount
            + " , timePerPackage: "
            + (dataPackagesCount == 0 ? 0 : dataScanTime / dataPackagesCount)
            + " , cached: " + cachedNonSystemApps);
    if (mIsUpgrade && dataPackagesCount > 0) {
        //CHECKSTYLE:OFF IndentationCheck
        FrameworkStatsLog.write(
            FrameworkStatsLog.BOOT_TIME_EVENT_DURATION_REPORTED,
            BOOT_TIME_EVENT_DURATION__EVENT__OTA_PACKAGE_MANAGER_DATA_APP_AVG_SCAN_TIME,
            dataScanTime / dataPackagesCount);
        //CHECKSTYLE:OFF IndentationCheck
    }
}
mExpectingBetter.clear();

mStorageManagerPackage = getStorageManagerPackageName();
...

这里就是对/data/app进行了扫描,主要工作与扫描系统App目录是一样的,只是细节处理上有些不同。除此之外还做了一些收尾工作。

4. PMS_SCAN_END阶段

// 打印相关日志
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SCAN_END,
        SystemClock.uptimeMillis());
Slog.i(TAG, "Time to scan packages: "
        + ((SystemClock.uptimeMillis()-startTime)/1000f)
        + " seconds");

// If the platform SDK has changed since the last time we booted,
// we need to re-grant app permission to catch any new ones that
// appear.  This is really a hack, and means that apps can in some
// cases get permissions that the user didn't initially explicitly
// allow...  it would be nice to have some better way to handle
// this situation.
// 如果SDK版本发生了变化(升级系统),重新对App进行授权
final boolean sdkUpdated = (ver.sdkVersion != mSdkVersion);
if (sdkUpdated) {
    Slog.i(TAG, "Platform changed from " + ver.sdkVersion + " to "
            + mSdkVersion + "; regranting permissions for internal storage");
}
mPermissionManager.updateAllPermissions(
        StorageManager.UUID_PRIVATE_INTERNAL, sdkUpdated);
ver.sdkVersion = mSdkVersion;

// If this is the first boot or an update from pre-M, and it is a normal
// boot, then we need to initialize the default preferred apps across
// all defined users.
// 如果是首次启动或者从6.0以前的系统升级,初始化用户首选App
if (!mOnlyCore && (mPromoteSystemApps || mFirstBoot)) {
    for (UserInfo user : mInjector.getUserManagerInternal().getUsers(true)) {
        mSettings.applyDefaultPreferredAppsLPw(user.id);
        primeDomainVerificationsLPw(user.id);
    }
}

// Prepare storage for system user really early during boot,
// since core system apps like SettingsProvider and SystemUI
// can't wait for user to start
// 为系统用户准备存储空间,因为SettingsProvider和SystemUI等核心系统App不可能等用户去启动
final int storageFlags;
if (StorageManager.isFileEncryptedNativeOrEmulated()) {
    storageFlags = StorageManager.FLAG_STORAGE_DE;
} else {
    storageFlags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE;
}
List<String> deferPackages = reconcileAppsDataLI(StorageManager.UUID_PRIVATE_INTERNAL,
        UserHandle.USER_SYSTEM, storageFlags, true /* migrateAppData */,
        true /* onlyCoreApps */);
mPrepareAppDataFuture = SystemServerInitThreadPool.submit(() -> {
    TimingsTraceLog traceLog = new TimingsTraceLog("SystemServerTimingAsync",
            Trace.TRACE_TAG_PACKAGE_MANAGER);
    traceLog.traceBegin("AppDataFixup");
    try {
        mInstaller.fixupAppData(StorageManager.UUID_PRIVATE_INTERNAL,
                StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE);
    } catch (InstallerException e) {
        Slog.w(TAG, "Trouble fixing GIDs", e);
    }
    traceLog.traceEnd();

    traceLog.traceBegin("AppDataPrepare");
    if (deferPackages == null || deferPackages.isEmpty()) {
        return;
    }
    int count = 0;
    for (String pkgName : deferPackages) {
        AndroidPackage pkg = null;
        synchronized (mLock) {
            PackageSetting ps = mSettings.getPackageLPr(pkgName);
            if (ps != null && ps.getInstalled(UserHandle.USER_SYSTEM)) {
                pkg = ps.pkg;
            }
        }
        if (pkg != null) {
            synchronized (mInstallLock) {
                prepareAppDataAndMigrateLIF(pkg, UserHandle.USER_SYSTEM, storageFlags,
                        true /* maybeMigrateAppData */);
            }
            count++;
        }
    }
    traceLog.traceEnd();
    Slog.i(TAG, "Deferred reconcileAppsData finished " + count + " packages");
}, "prepareAppData");

// 如果是升级后第一次正常启动,需要清除代码缓存,但不是会清除应用的配置文件
if (mIsUpgrade && !mOnlyCore) {
    Slog.i(TAG, "Build fingerprint changed; clearing code caches");
    for (int i = 0; i < mSettings.mPackages.size(); i++) {
        final PackageSetting ps = mSettings.mPackages.valueAt(i);
        if (Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, ps.volumeUuid)) {
            // No apps are running this early, so no need to freeze
            clearAppDataLIF(ps.pkg, UserHandle.USER_ALL,
                    FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL
                            | Installer.FLAG_CLEAR_CODE_CACHE_ONLY
                            | Installer.FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES);
        }
    }
    ver.fingerprint = Build.FINGERPRINT;
}

// Grandfather existing (installed before Q) non-system apps to hide
// their icons in launcher.
if (!mOnlyCore && mIsPreQUpgrade) {
    Slog.i(TAG, "Whitelisting all existing apps to hide their icons");
    int size = mSettings.mPackages.size();
    for (int i = 0; i < size; i++) {
        final PackageSetting ps = mSettings.mPackages.valueAt(i);
        if ((ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0) {
            continue;
        }
        ps.disableComponentLPw(PackageManager.APP_DETAILS_ACTIVITY_CLASS_NAME,
                UserHandle.USER_SYSTEM);
    }
}

// clear only after permissions and other defaults have been updated
mPromoteSystemApps = false;

// All the changes are done during package scanning.
ver.databaseVersion = Settings.CURRENT_DATABASE_VERSION;

// can downgrade to reader
t.traceBegin("write settings");
// 把更新后的mSettings中更新后的相关信息写入packages.xml等对应文件中
mSettings.writeLPr();
t.traceEnd();

这里主要做了如下几件事情:

  1. 如果SDK版本发生了变化(升级系统),重新对App进行授权
  2. 为系统核心服务准备存储空间
  3. 如果是升级后第一次正常启动,需要清除代码缓存,但不是会清除应用的配置文件
  4. 把更新后的信息写回对应的xml文件中

5. PMS_READY阶段

public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) {
    ...
    synchronized (mInstallLock) {
    // writer
    synchronized (mLock) {
        ...

        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_READY,
                SystemClock.uptimeMillis());

        if (!mOnlyCore) {
            mRequiredVerifierPackage = getRequiredButNotReallyRequiredVerifierLPr();
            mRequiredInstallerPackage = getRequiredInstallerLPr();
            mRequiredUninstallerPackage = getRequiredUninstallerLPr();
            mIntentFilterVerifierComponent = getIntentFilterVerifierComponentNameLPr();
            if (mIntentFilterVerifierComponent != null) {
                mIntentFilterVerifier = new IntentVerifierProxy(mContext,
                        mIntentFilterVerifierComponent);
            } else {
                mIntentFilterVerifier = null;
            }
            mServicesExtensionPackageName = getRequiredServicesExtensionPackageLPr();
            mSharedSystemSharedLibraryPackageName = getRequiredSharedLibraryLPr(
                    PackageManager.SYSTEM_SHARED_LIBRARY_SHARED,
                    SharedLibraryInfo.VERSION_UNDEFINED);
        } else {
            mRequiredVerifierPackage = null;
            mRequiredInstallerPackage = null;
            mRequiredUninstallerPackage = null;
            mIntentFilterVerifierComponent = null;
            mIntentFilterVerifier = null;
            mServicesExtensionPackageName = null;
            mSharedSystemSharedLibraryPackageName = null;
        }

        // PermissionController hosts default permission granting and role management, so it's a
        // critical part of the core system.
        mRequiredPermissionControllerPackage = getRequiredPermissionControllerLPr();

        mSettings.setPermissionControllerVersion(
                getPackageInfo(mRequiredPermissionControllerPackage, 0,
                        UserHandle.USER_SYSTEM).getLongVersionCode());

        // Initialize InstantAppRegistry's Instant App list for all users.
        final int[] userIds = UserManagerService.getInstance().getUserIds();
        for (AndroidPackage pkg : mPackages.values()) {
            if (pkg.isSystem()) {
                continue;
            }
            for (int userId : userIds) {
                final PackageSetting ps = getPackageSetting(pkg.getPackageName());
                if (ps == null || !ps.getInstantApp(userId) || !ps.getInstalled(userId)) {
                    continue;
                }
                mInstantAppRegistry.addInstantAppLPw(userId, ps.appId);
            }
        }

        // Prepare a supplier of package parser for the staging manager to parse apex file
        // during the staging installation.
        final Supplier<PackageParser2> apexParserSupplier = () -> new PackageParser2(
                mSeparateProcesses, mOnlyCore, mMetrics, null /* cacheDir */,
                mPackageParserCallback);
        // 初始化PackageInstallerService
        mInstallerService = new PackageInstallerService(mContext, this, apexParserSupplier);
        final Pair<ComponentName, String> instantAppResolverComponent =
                getInstantAppResolverLPr();
        if (instantAppResolverComponent != null) {
            if (DEBUG_INSTANT) {
                Slog.d(TAG, "Set ephemeral resolver: " + instantAppResolverComponent);
            }
            mInstantAppResolverConnection = new InstantAppResolverConnection(
                    mContext, instantAppResolverComponent.first,
                    instantAppResolverComponent.second);
            mInstantAppResolverSettingsComponent =
                    getInstantAppResolverSettingsLPr(instantAppResolverComponent.first);
        } else {
            mInstantAppResolverConnection = null;
            mInstantAppResolverSettingsComponent = null;
        }
        updateInstantAppInstallerLocked(null);

        // 读取并更新dex文件的使用情况
        final Map<Integer, List<PackageInfo>> userPackages = new HashMap<>();
        for (int userId : userIds) {
            userPackages.put(userId, getInstalledPackages(/*flags*/ 0, userId).getList());
        }
        mDexManager.load(userPackages);
        if (mIsUpgrade) {
            FrameworkStatsLog.write(
                    FrameworkStatsLog.BOOT_TIME_EVENT_DURATION_REPORTED,
                    BOOT_TIME_EVENT_DURATION__EVENT__OTA_PACKAGE_MANAGER_INIT_TIME,
                    SystemClock.uptimeMillis() - startTime);
        }
    } // synchronized (mLock)
    } // synchronized (mInstallLock)
    // CHECKSTYLE:ON IndentationCheck

    mModuleInfoProvider = new ModuleInfoProvider(mContext, this);

    // Uncork cache invalidations and allow clients to cache package information.
    PackageManager.uncorkPackageInfoCache();

    // Now after opening every single application zip, make sure they
    // are all flushed.  Not really needed, but keeps things nice and
    // tidy.
    t.traceBegin("GC");
    Runtime.getRuntime().gc();
    t.traceEnd();

    // The initial scanning above does many calls into installd while
    // holding the mPackages lock, but we're mostly interested in yelling
    // once we have a booted system.
    mInstaller.setWarnIfHeld(mLock);

    PackageParser.readConfigUseRoundIcon(mContext.getResources());

    mServiceStartWithDelay = SystemClock.uptimeMillis() + (60 * 1000L);
}

这里又对一些属性进行了赋值。

6、总结

以上就是对PMS的启动总体流程做了大致的梳理,现在总结出PMS启动流程的时序图,其中一些值得关注的细节将在之后的文章中逐一介绍和分析。

PMS启动流程.png