美文网首页
PMS的启动

PMS的启动

作者: Wi1ls努力努力再努力 | 来源:发表于2019-02-25 18:13 被阅读0次

    SystemServer.java

    private void run(){
      ...
      startBootstrapServices();
      startCoreServices();
      startOtherServices();
      ...
    }
    
    private void startBootstrapServices(){
      ...
      mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                    mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
      ...
    }
    
    private void startCoreServices(){
      ...
    // Update after UsageStatsService is available, needed before performBootDexOpt.
            mPackageManagerService.getUsageStatsIfNoPackageUsageInfo();
      ...
    }
    
    private void startOtherServices(){
      ...
      mPackageManagerService.performBootDexOpt();
      ...
      mPackageManagerService.systemReady();
      ...
    }  
    

    public static PackageManagerService main(Context context, Installer installer,
                boolean factoryTest, boolean onlyCore) {
            PackageManagerService m = new PackageManagerService(context, installer,
                    factoryTest, onlyCore);
            ServiceManager.addService("package", m);
            return m;
        }
    
    public PackageManagerService(Context context, Installer installer,
                boolean factoryTest, boolean onlyCore) {
            EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,
                    SystemClock.uptimeMillis());
    
            if (mSdkVersion <= 0) {
                Slog.w(TAG, "**** ro.build.version.sdk not set!");
            }
    
            mContext = context;
            mFactoryTest = factoryTest;
            mOnlyCore = onlyCore;
            //根据是否是"eng"版本判断 dexopt 是否延迟执行
            mLazyDexOpt = "eng".equals(SystemProperties.get("ro.build.type"));
            mMetrics = new DisplayMetrics();
            //  关于 Settings 见https://www.jianshu.com/p/a9e81b6b590e
            mSettings = new Settings(mPackages);
            //添加sharedUserId到 mSettings
            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);
    
            // TODO: add a property to control this?
            long dexOptLRUThresholdInMinutes;
            // eng 版本,只 optDex30分钟内使用的 app,佛则一周
            if (mLazyDexOpt) {
                dexOptLRUThresholdInMinutes = 30; // only last 30 minutes of apps for eng builds.
            } else {
                dexOptLRUThresholdInMinutes = 7 * 24 * 60; // apps used in the 7 days for users.
            }
            mDexOptLRUThresholdInMills = dexOptLRUThresholdInMinutes * 60 * 1000;
    
            String separateProcesses = SystemProperties.get("debug.separate_processes");
            if (separateProcesses != null && separateProcesses.length() > 0) {
                if ("*".equals(separateProcesses)) {
                    mDefParseFlags = PackageParser.PARSE_IGNORE_PROCESSES;
                    mSeparateProcesses = null;
                    Slog.w(TAG, "Running with debug.separate_processes: * (ALL)");
                } else {
                    mDefParseFlags = 0;
                    mSeparateProcesses = separateProcesses.split(",");
                    Slog.w(TAG, "Running with debug.separate_processes: "
                            + separateProcesses);
                }
            } else {
                mDefParseFlags = 0;
                mSeparateProcesses = null;
            }
    
            mInstaller = installer;
            mPackageDexOptimizer = new PackageDexOptimizer(this);
            mMoveCallbacks = new MoveCallbacks(FgThread.get().getLooper());
    
            mOnPermissionChangeListeners = new OnPermissionChangeListeners(
                    FgThread.get().getLooper());
    
            getDefaultDisplayMetrics(context, mMetrics);
            //获取系统配置信息
            //https://www.jianshu.com/p/fd370fad6e39
            SystemConfig systemConfig = SystemConfig.getInstance();
            mGlobalGids = systemConfig.getGlobalGids();
            mSystemPermissions = systemConfig.getSystemPermissions();
            mAvailableFeatures = systemConfig.getAvailableFeatures();
    
            synchronized (mInstallLock) {
            // writer
            synchronized (mPackages) {
                //消息处理线程
                mHandlerThread = new ServiceThread(TAG,
                        Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/);
                mHandlerThread.start();
                mHandler = new PackageHandler(mHandlerThread.getLooper());
                Watchdog.getInstance().addThread(mHandler, WATCHDOG_TIMEOUT);
                // /data
                File dataDir = Environment.getDataDirectory();
                // /date/data
                mAppDataDir = new File(dataDir, "data");
                //  /data/app
                mAppInstallDir = new File(dataDir, "app");
                // /data/app-lib
                mAppLib32InstallDir = new File(dataDir, "app-lib");
                // /data/app-asec
                mAsecInternalPath = new File(dataDir, "app-asec").getPath();
                // /data/user
                mUserAppDataDir = new File(dataDir, "user");
                // /data/app-private
                mDrmAppPrivateInstallDir = new File(dataDir, "app-private");
    
                sUserManager = new UserManagerService(context, this,
                        mInstallLock, mPackages);
    
                // Propagate permission configuration in to package manager.
                //权限相关,SystemConfig 中解析的permission信息
                ArrayMap<String, SystemConfig.PermissionEntry> permConfig
                        = systemConfig.getPermissions();
                for (int i=0; i<permConfig.size(); i++) {
                    SystemConfig.PermissionEntry perm = permConfig.valueAt(i);
                    BasePermission bp = mSettings.mPermissions.get(perm.name);
                    if (bp == null) {
                        bp = new BasePermission(perm.name, "android", BasePermission.TYPE_BUILTIN);
                        mSettings.mPermissions.put(perm.name, bp);
                    }
                    if (perm.gids != null) {
                        bp.setGids(perm.gids, perm.perUser);
                    }
                }
                //共享库,SystemConfig中解析的library信息
                ArrayMap<String, String> libConfig = systemConfig.getSharedLibraries();
                for (int i=0; i<libConfig.size(); i++) {
                    mSharedLibraries.put(libConfig.keyAt(i),
                            new SharedLibraryEntry(libConfig.valueAt(i), null));
                }
    
                mFoundPolicyFile = SELinuxMMAC.readInstallPolicy();
    
                mRestoredSettings = mSettings.readLPw(this, sUserManager.getUsers(false),
                        mSdkVersion, mOnlyCore);
    
                String customResolverActivity = Resources.getSystem().getString(
                        R.string.config_customResolverActivity);
                if (TextUtils.isEmpty(customResolverActivity)) {
                    customResolverActivity = null;
                } else {
                    mCustomResolverComponentName = ComponentName.unflattenFromString(
                            customResolverActivity);
                }
    
                long startTime = SystemClock.uptimeMillis();
    
                EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SYSTEM_SCAN_START,
                        startTime);
    
                // Set flag to monitor and not change apk file paths when
                // scanning install directories.
                final int scanFlags = SCAN_NO_PATHS | SCAN_DEFER_DEX | SCAN_BOOTING | SCAN_INITIAL;
                // 已经优化或者不需要 dexOpt 的文件
                final ArraySet<String> alreadyDexOpted = new ArraySet<String>();
    
                /**
                 * Add everything in the in the boot class path to the
                 * list of process files because dexopt will have been run
                 * if necessary during zygote startup.
                 */
                final String bootClassPath = System.getenv("BOOTCLASSPATH");
                final String systemServerClassPath = System.getenv("SYSTEMSERVERCLASSPATH");
                // BOOTCLASSPATH路径
                if (bootClassPath != null) {
                    String[] bootClassPathElements = splitString(bootClassPath, ':');
                    for (String element : bootClassPathElements) {
                        alreadyDexOpted.add(element);
                    }
                } else {
                    Slog.w(TAG, "No BOOTCLASSPATH found!");
                }
                // SYSTEMSERVERCLASSPATH 路径
                if (systemServerClassPath != null) {
                    String[] systemServerClassPathElements = splitString(systemServerClassPath, ':');
                    for (String element : systemServerClassPathElements) {
                        alreadyDexOpted.add(element);
                    }
                } else {
                    Slog.w(TAG, "No SYSTEMSERVERCLASSPATH found!");
                }
    
                final List<String> allInstructionSets = InstructionSets.getAllInstructionSets();
                final String[] dexCodeInstructionSets =
                        getDexCodeInstructionSets(
                                allInstructionSets.toArray(new String[allInstructionSets.size()]));
    
                /**
                 * Ensure all external libraries have had dexopt run on them.
                 */
                //由SystemConfig解析得到的
                if (mSharedLibraries.size() > 0) {
                    // NOTE: For now, we're compiling these system "shared libraries"
                    // (and framework jars) into all available architectures. It's possible
                    // to compile them only when we come across an app that uses them (there's
                    // already logic for that in scanPackageLI) but that adds some complexity.
                    for (String dexCodeInstructionSet : dexCodeInstructionSets) {
                        for (SharedLibraryEntry libEntry : mSharedLibraries.values()) {
                            final String lib = libEntry.path;
                            if (lib == null) {
                                continue;
                            }
    
                            try {
                                int dexoptNeeded = DexFile.getDexOptNeeded(lib, null, dexCodeInstructionSet, false);
                                if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
                                    alreadyDexOpted.add(lib);
                                    //进行 dex 操作
                                    mInstaller.dexopt(lib, Process.SYSTEM_UID, true, dexCodeInstructionSet, dexoptNeeded, false);
                                }
                            } catch (FileNotFoundException e) {
                                Slog.w(TAG, "Library not found: " + lib);
                            } catch (IOException e) {
                                Slog.w(TAG, "Cannot dexopt " + lib + "; is it an APK or JAR? "
                                        + e.getMessage());
                            }
                        }
                    }
                }
    
                File frameworkDir = new File(Environment.getRootDirectory(), "framework");
    
                // Gross hack for now: we know this file doesn't contain any
                // code, so don't dexopt it to avoid the resulting log spew.
                //  /system/framework/framework-res.apk不需要 dexOpt
                alreadyDexOpted.add(frameworkDir.getPath() + "/framework-res.apk");
    
                // Gross hack for now: we know this file is only part of
                // the boot class path for art, so don't dexopt it to
                // avoid the resulting log spew.
                //   /system/framework/core-libart.jar 不需要 dexOpt
                alreadyDexOpted.add(frameworkDir.getPath() + "/core-libart.jar");
    
                /**
                 * There are a number of commands implemented in Java, which
                 * we currently need to do the dexopt on so that they can be
                 * run from a non-root shell.
                 */
                String[] frameworkFiles = frameworkDir.list();
                if (frameworkFiles != null) {
                    // TODO: We could compile these only for the most preferred ABI. We should
                    // first double check that the dex files for these commands are not referenced
                    // by other system apps.
                    for (String dexCodeInstructionSet : dexCodeInstructionSets) {
                        for (int i=0; i<frameworkFiles.length; i++) {
                            File libPath = new File(frameworkDir, frameworkFiles[i]);
                            String path = libPath.getPath();
                            // Skip the file if we already did it.
                            //跳过不需要 dexOpt 的文件
                            if (alreadyDexOpted.contains(path)) {
                                continue;
                            }
                            // Skip the file if it is not a type we want to dexopt.
                            //非.apk 非.jar跳过
                            if (!path.endsWith(".apk") && !path.endsWith(".jar")) {
                                continue;
                            }
                            try {
                                int dexoptNeeded = DexFile.getDexOptNeeded(path, null, dexCodeInstructionSet, false);
                                if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
                                    //进行 dexOpt
                                    mInstaller.dexopt(path, Process.SYSTEM_UID, true, dexCodeInstructionSet, dexoptNeeded, false);
                                }
                            } catch (FileNotFoundException e) {
                                Slog.w(TAG, "Jar not found: " + path);
                            } catch (IOException e) {
                                Slog.w(TAG, "Exception reading jar: " + path, e);
                            }
                        }
                    }
                }
    
                final VersionInfo ver = mSettings.getInternalVersion();
                mIsUpgrade = !Build.FINGERPRINT.equals(ver.fingerprint);
                // when upgrading from pre-M, promote system app permissions from install to runtime
                mPromoteSystemApps =
                        mIsUpgrade && ver.sdkVersion <= Build.VERSION_CODES.LOLLIPOP_MR1;
    
                // save off the names of pre-existing system packages prior to scanning; we don't
                // want to automatically grant runtime permissions for new system apps
                if (mPromoteSystemApps) {
                    Iterator<PackageSetting> pkgSettingIter = mSettings.mPackages.values().iterator();
                    while (pkgSettingIter.hasNext()) {
                        PackageSetting ps = pkgSettingIter.next();
                        if (isSystemApp(ps)) {
                            mExistingSystemPackages.add(ps.name);
                        }
                    }
                }
    
                // Collect vendor overlay packages.
                // (Do this before scanning any apps.)
                // For security and version matching reason, only consider
                // overlay packages if they reside in VENDOR_OVERLAY_DIR.
                File vendorOverlayDir = new File(VENDOR_OVERLAY_DIR);
                scanDirLI(vendorOverlayDir, PackageParser.PARSE_IS_SYSTEM
                        | PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags | SCAN_TRUSTED_OVERLAY, 0);
    
                // Find base frameworks (resource packages without code).
                scanDirLI(frameworkDir, PackageParser.PARSE_IS_SYSTEM
                        | PackageParser.PARSE_IS_SYSTEM_DIR
                        | PackageParser.PARSE_IS_PRIVILEGED,
                        scanFlags | SCAN_NO_DEX, 0);
    
                // Collected privileged system packages.
                final File privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app");
                scanDirLI(privilegedAppDir, PackageParser.PARSE_IS_SYSTEM
                        | PackageParser.PARSE_IS_SYSTEM_DIR
                        | PackageParser.PARSE_IS_PRIVILEGED, scanFlags, 0);
    
                // Collect ordinary system packages.
                final File systemAppDir = new File(Environment.getRootDirectory(), "app");
                scanDirLI(systemAppDir, PackageParser.PARSE_IS_SYSTEM
                        | PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);
    
                // Collect all vendor packages.
                File vendorAppDir = new File("/vendor/app");
                try {
                    vendorAppDir = vendorAppDir.getCanonicalFile();
                } catch (IOException e) {
                    // failed to look up canonical path, continue with original one
                }
                scanDirLI(vendorAppDir, PackageParser.PARSE_IS_SYSTEM
                        | PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);
    
                // Collect all OEM packages.
                final File oemAppDir = new File(Environment.getOemDirectory(), "app");
                scanDirLI(oemAppDir, PackageParser.PARSE_IS_SYSTEM
                        | PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);
                // 上面收集了 /vendor/overlay | /system/framework | /system/priv-app | /system/app | vendor/priv-app | /vendor/app | /oem/app 的包名
    
                if (DEBUG_UPGRADE) Log.v(TAG, "Running installd update commands");
                mInstaller.moveFiles();
    
                // Prune any system packages that no longer exist.
                //清理不存在的包
                final List<String> possiblyDeletedUpdatedSystemApps = new ArrayList<String>();
                if (!mOnlyCore) {
                    Iterator<PackageSetting> psit = mSettings.mPackages.values().iterator();
                    while (psit.hasNext()) {
                        PackageSetting ps = psit.next();
    
                        /*
                         * If this is not a system app, it can't be a
                         * disable system app.
                         */
                        if ((ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) == 0) {
                            continue;
                        }
    
                        /*
                         * If the package is scanned, it's not erased.
                         */
                        final PackageParser.Package scannedPkg = mPackages.get(ps.name);
                        if (scannedPkg != null) {
                            /*
                             * If the system app is both scanned and in the
                             * disabled packages list, then it must have been
                             * added via OTA. Remove it from the currently
                             * scanned package so the previously user-installed
                             * application can be scanned.
                             */
                            if (mSettings.isDisabledSystemPackageLPr(ps.name)) {
                                logCriticalInfo(Log.WARN, "Expecting better updated system app for "
                                        + ps.name + "; removing system app.  Last known codePath="
                                        + ps.codePathString + ", installStatus=" + ps.installStatus
                                        + ", versionCode=" + ps.versionCode + "; scanned versionCode="
                                        + scannedPkg.mVersionCode);
                                removePackageLI(ps, 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; wiping its data");
                            removeDataDirsLI(null, ps.name);
                        } else {
                            final PackageSetting disabledPs = mSettings.getDisabledSystemPkgLPr(ps.name);
                            if (disabledPs.codePath == null || !disabledPs.codePath.exists()) {
                                possiblyDeletedUpdatedSystemApps.add(ps.name);
                            }
                        }
                    }
                }
    
                //look for any incomplete package installations
                //清理安装不完整的包
                ArrayList<PackageSetting> deletePkgsList = mSettings.getListOfIncompleteInstallPackagesLPr();
                //clean up list
                for(int i = 0; i < deletePkgsList.size(); i++) {
                    //clean up here
                    cleanupInstallFailedPackage(deletePkgsList.get(i));
                }
                //delete tmp files
                deleteTempPackageFiles();
    
                // Remove any shared userIDs that have no associated packages
                //移除不相干包中的所有共享 userId
                mSettings.pruneSharedUsersLPw();
    
                if (!mOnlyCore) {
                    EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,
                            SystemClock.uptimeMillis());
                    scanDirLI(mAppInstallDir, 0, scanFlags | SCAN_REQUIRE_KNOWN, 0);
    
                    scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK,
                            scanFlags | SCAN_REQUIRE_KNOWN, 0);
    
                    /**
                     * Remove disable package settings for any updated system
                     * apps that were removed via an OTA. If they're not a
                     * previously-updated app, remove them completely.
                     * Otherwise, just revoke their system-level permissions.
                     */
                    for (String deletedAppName : possiblyDeletedUpdatedSystemApps) {
                        PackageParser.Package deletedPkg = mPackages.get(deletedAppName);
                        mSettings.removeDisabledSystemPackageLPw(deletedAppName);
    
                        String msg;
                        if (deletedPkg == null) {
                            msg = "Updated system package " + deletedAppName
                                    + " no longer exists; wiping its data";
                            removeDataDirsLI(null, deletedAppName);
                        } else {
                            msg = "Updated system app + " + deletedAppName
                                    + " no longer present; removing system privileges for "
                                    + deletedAppName;
    
                            deletedPkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_SYSTEM;
    
                            PackageSetting deletedPs = mSettings.mPackages.get(deletedAppName);
                            deletedPs.pkgFlags &= ~ApplicationInfo.FLAG_SYSTEM;
                        }
                        logCriticalInfo(Log.WARN, msg);
                    }
    
                    /**
                     * Make sure all system apps that we expected to appear on
                     * the userdata partition actually showed up. If they never
                     * appeared, crawl back and revive the system version.
                     */
                    for (int i = 0; i < mExpectingBetter.size(); i++) {
                        final String packageName = mExpectingBetter.keyAt(i);
                        if (!mPackages.containsKey(packageName)) {
                            final File scanFile = mExpectingBetter.valueAt(i);
    
                            logCriticalInfo(Log.WARN, "Expected better " + packageName
                                    + " but never showed up; reverting to system");
    
                            final int reparseFlags;
                            if (FileUtils.contains(privilegedAppDir, scanFile)) {
                                reparseFlags = PackageParser.PARSE_IS_SYSTEM
                                        | PackageParser.PARSE_IS_SYSTEM_DIR
                                        | PackageParser.PARSE_IS_PRIVILEGED;
                            } else if (FileUtils.contains(systemAppDir, scanFile)) {
                                reparseFlags = PackageParser.PARSE_IS_SYSTEM
                                        | PackageParser.PARSE_IS_SYSTEM_DIR;
                            } else if (FileUtils.contains(vendorAppDir, scanFile)) {
                                reparseFlags = PackageParser.PARSE_IS_SYSTEM
                                        | PackageParser.PARSE_IS_SYSTEM_DIR;
                            } else if (FileUtils.contains(oemAppDir, scanFile)) {
                                reparseFlags = PackageParser.PARSE_IS_SYSTEM
                                        | PackageParser.PARSE_IS_SYSTEM_DIR;
                            } else {
                                Slog.e(TAG, "Ignoring unexpected fallback path " + scanFile);
                                continue;
                            }
    
                            mSettings.enableSystemPackageLPw(packageName);
    
                            try {
                                scanPackageLI(scanFile, reparseFlags, scanFlags, 0, null);
                            } catch (PackageManagerException e) {
                                Slog.e(TAG, "Failed to parse original system package: "
                                        + e.getMessage());
                            }
                        }
                    }
                }
                mExpectingBetter.clear();
    
                // Now that we know all of the shared libraries, update all clients to have
                // the correct library paths.
                updateAllSharedLibrariesLPw();
    
                for (SharedUserSetting setting : mSettings.getAllSharedUsersLPw()) {
                    // NOTE: We ignore potential failures here during a system scan (like
                    // the rest of the commands above) because there's precious little we
                    // can do about it. A settings error is reported, though.
                    adjustCpuAbisForSharedUserLPw(setting.packages, null /* scanned package */,
                            false /* force dexopt */, false /* defer dexopt */,
                            false /* boot complete */);
                }
    
                // Now that we know all the packages we are keeping,
                // read and update their last usage times.
                mPackageUsage.readLP();
    
                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.
                int updateFlags = UPDATE_PERMISSIONS_ALL;
                if (ver.sdkVersion != mSdkVersion) {
                    Slog.i(TAG, "Platform changed from " + ver.sdkVersion + " to "
                            + mSdkVersion + "; regranting permissions for internal storage");
                    updateFlags |= UPDATE_PERMISSIONS_REPLACE_PKG | UPDATE_PERMISSIONS_REPLACE_ALL;
                }
                updatePermissionsLPw(null, null, StorageManager.UUID_PRIVATE_INTERNAL, updateFlags);
                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.
                if (!onlyCore && (mPromoteSystemApps || !mRestoredSettings)) {
                    for (UserInfo user : sUserManager.getUsers(true)) {
                        mSettings.applyDefaultPreferredAppsLPw(this, user.id);
                        applyFactoryDefaultBrowserLPw(user.id);
                        primeDomainVerificationsLPw(user.id);
                    }
                }
    
                // If this is first boot after an OTA, and a normal boot, then
                // we need to clear code cache directories.
                if (mIsUpgrade && !onlyCore) {
                    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)) {
                            deleteCodeCacheDirsLI(ps.volumeUuid, ps.name);
                        }
                    }
                    ver.fingerprint = Build.FINGERPRINT;
                }
    
                checkDefaultBrowser();
    
                // clear only after permissions and other defaults have been updated
                mExistingSystemPackages.clear();
                mPromoteSystemApps = false;
    
                // All the changes are done during package scanning.
                ver.databaseVersion = Settings.CURRENT_DATABASE_VERSION;
    
                // can downgrade to reader
                mSettings.writeLPr();
    
                EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_READY,
                        SystemClock.uptimeMillis());
    
                mRequiredVerifierPackage = getRequiredVerifierLPr();
                mRequiredInstallerPackage = getRequiredInstallerLPr();
    
                mInstallerService = new PackageInstallerService(context, this);
    
                mIntentFilterVerifierComponent = getIntentFilterVerifierComponentNameLPr();
                mIntentFilterVerifier = new IntentVerifierProxy(mContext,
                        mIntentFilterVerifierComponent);
    
            } // synchronized (mPackages)
            } // synchronized (mInstallLock)
    
            // Now after opening every single application zip, make sure they
            // are all flushed.  Not really needed, but keeps things nice and
            // tidy.
            Runtime.getRuntime().gc();
    
            // Expose private service for system components to use.
            LocalServices.addService(PackageManagerInternal.class, new PackageManagerInternalImpl());
        }
    

    相关文章

      网友评论

          本文标题:PMS的启动

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