Android PackageManagerService流程详细分析(七)之监控扫描指定APP目录

继续看构造函数:

public PackageManagerService(Context context, Installer installer,
        boolean factoryTest, boolean onlyCore) {

    ......

    // 1
    // Find base frameworks (resource packages without code).
    mFrameworkInstallObserver = new AppDirObserver(
        mFrameworkDir.getPath(), OBSERVER_EVENTS, true);
    mFrameworkInstallObserver.startWatching();
    scanDirLI(mFrameworkDir, PackageParser.PARSE_IS_SYSTEM
            | PackageParser.PARSE_IS_SYSTEM_DIR,
            scanMode | SCAN_NO_DEX, 0);

    // 2
    // Collect all system packages.
    mSystemAppDir = new File(Environment.getRootDirectory(), "app");
    mSystemInstallObserver = new AppDirObserver(
        mSystemAppDir.getPath(), OBSERVER_EVENTS, true);
    mSystemInstallObserver.startWatching();
    scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM
            | PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0);

    // 3
    // Collect all vendor packages.
    mVendorAppDir = new File("/vendor/app");
    mVendorInstallObserver = new AppDirObserver(
        mVendorAppDir.getPath(), OBSERVER_EVENTS, true);
    mVendorInstallObserver.startWatching();
    scanDirLI(mVendorAppDir, PackageParser.PARSE_IS_SYSTEM
            | PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0);

    ......

   if (!mOnlyCore) {
       EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,
                     SystemClock.uptimeMillis());
       // 4
       mAppInstallObserver = new AppDirObserver(
       mAppInstallDir.getPath(), OBSERVER_EVENTS, false);
       mAppInstallObserver.startWatching();
       scanDirLI(mAppInstallDir, 0, scanMode, 0);

       // 5
       mDrmAppInstallObserver = new AppDirObserver(
       mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false);
       mDrmAppInstallObserver.startWatching();
       scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK,
               scanMode, 0);
    }

    ......
}

说明:
系统目录:
1、/system/framework/ 该目录中的文件都是系统库,例如 framework.jar、servers.jar、framework-res.apk等等。不过scanDirLI只扫描APK文件,所以这里的目标只有framework-res.apk。

2、/system/app/ 该目录下全是默认的系统APP,例如浏览器、桌面、系统设置等等。

3、/vendor/app/ 该目录文件由厂商提供,目前市面的机器基本都是把自己的系统应用放在/system/app/ 目录下面,我们的产品也是这样的。

非系统目录:
4、/data/app

5、/data/app-private

启动 AppDirObserver 线程监测1、2、3、4、5目录的事件,主要监听 add 和 remove 事件。对于目录监听底层通过inotify机制实现,inotify 是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户态得知,它为用户态监视文件系统的变化提供了强大的支持。当有 add event 时调用 scanPackageLI(File , int , int)处理;当有 remove event 时调用 removePackageLI()处理。

下一节重点介绍下scanPackageLI()函数,里面做了一大堆事情,设计的东西很多,比较复杂。

    原文作者:Rjdeng
    原文地址: https://blog.csdn.net/rjdeng/article/details/49834987
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞