美文网首页
Android杂谈:pms构造函数

Android杂谈:pms构造函数

作者: 我在等你回复可你没回 | 来源:发表于2017-05-19 17:05 被阅读127次

    下面居然是一段长长的代码!!!根据理解以后会更新!!先占坑!

       public PackageManagerService(Context context, Installer installer,
                boolean factoryTest, boolean onlyCore) {
            EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,
                    SystemClock.uptimeMillis());//写event log
    
            if (mSdkVersion <= 0) {
                Slog.w(TAG, "**** ro.build.version.sdk not set!");
            }
    
            mContext = context;
            mFactoryTest = factoryTest;
            mOnlyCore = onlyCore;
            mLazyDexOpt = "eng".equals(SystemProperties.get("ro.build.type"));
            mMetrics = new DisplayMetrics();
            mSettings = new Settings(mPackages);
            mSettings.addSharedUserLPw("android.uid.system", Process.SYSTEM_UID,
                    ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
            //增加share user,name与uid对应
            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;
          //莫非是延迟dex
            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);
    
            SystemConfig systemConfig = SystemConfig.getInstance();
            //gids permissions和features
            mGlobalGids = systemConfig.getGlobalGids();
            mSystemPermissions = systemConfig.getSystemPermissions();
            mAvailableFeatures = systemConfig.getAvailableFeatures();
    
            synchronized (mInstallLock) {
            // writer
            synchronized (mPackages) {
                //主要handler,后台的
                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();
                  //data/data
                mAppDataDir = new File(dataDir, "data");
                //data/app
                mAppInstallDir = new File(dataDir, "app");
                mAppLib32InstallDir = new File(dataDir, "app-lib");
                mAsecInternalPath = new File(dataDir, "app-asec").getPath();
                mUserAppDataDir = new File(dataDir, "user");
                mDrmAppPrivateInstallDir = new File(dataDir, "app-private");
                 //用户管理服务
                sUserManager = new UserManagerService(context, this,
                        mInstallLock, mPackages);
    
                // Propagate permission configuration in to package manager.
                //搞个base权限社么用
                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);
                    }
                }
                //sharelib的入口
                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));
                }
               //install的selinux
                mFoundPolicyFile = SELinuxMMAC.readInstallPolicy();
                 //保存的设置
                mRestoredSettings = mSettings.readLPw(this, sUserManager.getUsers(false),
                        mSdkVersion, mOnlyCore);
                //客制化的activity
                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;
                //已经优化的set
                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");
    
                if (bootClassPath != null) {
                    String[] bootClassPathElements = splitString(bootClassPath, ':');
                    for (String element : bootClassPathElements) {
                        alreadyDexOpted.add(element);
                    }
                } else {
                    Slog.w(TAG, "No BOOTCLASSPATH found!");
                }
    
                if (systemServerClassPath != null) {
                    String[] systemServerClassPathElements = splitString(systemServerClassPath, ':');
                    for (String element : systemServerClassPathElements) {
                        alreadyDexOpted.add(element);
                    }
                } else {
                    Slog.w(TAG, "No SYSTEMSERVERCLASSPATH found!");
                }
                //instuctionset是什么鬼
                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.
                 */
                //对share lib进行优化
                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);
                                    mInstaller.dexopt(lib, Process.SYSTEM_UID, true, dexCodeInstructionSet, dexoptNeeded);
                                }
                            } 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());
                            }
                        }
                    }
                }
                 //一些boot.oat里面的就不做dexopt了
                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.
                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.
                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.
                            if (alreadyDexOpted.contains(path)) {
                                continue;
                            }
                            // Skip the file if it is not a type we want to dexopt.
                            if (!path.endsWith(".apk") && !path.endsWith(".jar")) {
                                continue;
                            }
                            try {
                                int dexoptNeeded = DexFile.getDexOptNeeded(path, null, dexCodeInstructionSet, false);
                                if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
                                    //优化下framework 的东西
                                    mInstaller.dexopt(path, Process.SYSTEM_UID, true, dexCodeInstructionSet, dexoptNeeded);
                                }
                            } 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);
                        }
                    }
                }
                 //扫描vendor
                // 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);
    
                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
                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 */);
                }
    
                // 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, 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());
        }
    

    几大数据结构

    Settings

    这个记录着跟包相关的设置。

    final Settings mSettings
    
    settings.mPackages 这个记录着系统所有的安装包
    

    ResolveInfo

    这个是一个组件的信息,下面是进一步获取activity的信息

    ActivityInfo ait = r.activityInfo;
    

    /frameworks/base/services/core/java/com/android/server/pm/PackageSetting.java
    这个类是关于包的设置

    Paste_Image.png

    相关文章

      网友评论

          本文标题:Android杂谈:pms构造函数

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