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

来源:互联网 发布:linux oracle tns配置 编辑:程序博客网 时间:2024/06/13 23:21

继续看构造函数:

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()函数,里面做了一大堆事情,设计的东西很多,比较复杂。

1 0
原创粉丝点击