PackageManagerService中运用inotify去监控目录中的APK更新、安装和删除

原创 2015年07月08日 17:26:20

这是linux下inotify的一个demo程序,inotify 是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户态得知, 這裏主要去监控/work/test目录下的文件增加、删除事件

 1 #include <sys/types.h>
 2 #include <sys/stat.h>
 3 #include <fcntl.h>
 4 #include <sys/mman.h>
 5 #include <stdio.h>
 6 #include <sys/inotify.h>

 8 #define BUF_LEN 1024
 9 #define PATH "/work/test"
 10 
 11 struct EventMask {
 12     int flag;
 13     const char* name;
 14 };
  16 struct EventMask event_masks[] = {
 17     {IN_ACCESS , "IN_ACCESS"} ,
 18     {IN_ATTRIB , "IN_ATTRIB"} ,
 19     {IN_CLOSE_WRITE , "IN_CLOSE_WRITE"} ,
 20     {IN_CLOSE_NOWRITE , "IN_CLOSE_NOWRITE"} ,
 21     {IN_CREATE , "IN_CREATE"} ,
 22     {IN_DELETE , "IN_DELETE"} ,
 23     {IN_DELETE_SELF , "IN_DELETE_SELF"} ,
 24     {IN_MODIFY , "IN_MODIFY"} ,
 25     {IN_MOVE_SELF , "IN_MOVE_SELF"} ,
 26     {IN_MOVED_FROM , "IN_MOVED_FROM"} ,
 27     {IN_MOVED_TO , "IN_MOVED_TO"} ,
 28     {IN_OPEN , "IN_OPEN"} ,
 29     {IN_DONT_FOLLOW , "IN_DONT_FOLLOW"} ,
 30     {IN_EXCL_UNLINK , "IN_EXCL_UNLINK"} ,
 31     {IN_MASK_ADD , "IN_MASK_ADD"} ,
 32     {IN_ONESHOT , "IN_ONESHOT"} ,
 33     {IN_ONLYDIR , "IN_ONLYDIR"} ,
 34     {IN_IGNORED , "IN_IGNORED"} ,
 35     {IN_ISDIR , "IN_ISDIR"} ,
 36     {IN_Q_OVERFLOW , "IN_Q_OVERFLOW"} ,
 37     {IN_UNMOUNT , "IN_UNMOUNT"} ,
 38 };
 39 
 40 int main()
 41 {
 42 
 43 char buf[BUF_LEN];
 44     struct inotify_event *event;
 45     int fd = inotify_init();     //初始化inotify
    //監控PATH目錄下的IN_DELETE | IN_CREATE事件
 46     int state = inotify_add_watch(fd, PATH,IN_DELETE | IN_CREATE); 
 47     while (state > 0) {
     // 通过 read 调用可以一次获得多个事件,只要提供的 buf 足够大;如果沒有事件會一直阻塞在這
 48          size_t len = read (fd, buf, BUF_LEN);
 49          event = (struct inotify_event *)buf;
 50          int i = 0;
 51          for (i=0; i <22; ++i) {
 52          if (event->mask & event_masks[i].flag) {
 53              printf("\t%s\n", event_masks[i].name);
 54          }   
 55          }      
 56     }
 57 }
 15 

Android中PackageManagerService來監控目錄中的apk的更新以及刪除就是用linux下的inotify來實現的,不過它是調用class FileObserver提供的接口, FileObserver也只是對inotify的封裝。

frameworks/base/core/java/android/os/FileObserver.java
 42 public abstract class FileObserver {
......
 88         public int startWatching(String path, int mask, FileObserver observer) {
 89             int wfd = startWatching(m_fd, path, mask);
 90 
 91             Integer i = new Integer(wfd);
 92             if (wfd >= 0) {
 93                 synchronized (m_observers) {
 94                     m_observers.put(i, new WeakReference(observer));
 95                 }
 96             }
 97 
 98             return i;
 99         }
101         public void stopWatching(int descriptor) {
102             stopWatching(m_fd, descriptor);
103         }
131         private native int startWatching(int fd, String path, int mask);
132         private native void stopWatching(int fd, int wfd);

line 89调用startWatching添加一個m_fd監控,line 102调用stopWatching刪除一個m_fd監控,它們都是Jni method

105 static jint android_os_fileobserver_startWatching(JNIEnv* env, jobject object, jint fd, jstring pathString, jint mask)
106 {
107     int res = -1;
108 
109 #ifdef HAVE_INOTIFY
110 
111     if (fd >= 0)
112     {
113         const char* path = env->GetStringUTFChars(pathString, NULL);
114 
115         res = inotify_add_watch(fd, path, mask);
116 
117         env->ReleaseStringUTFChars(pathString, path);
118     }
119 
120 #endif // HAVE_INOTIFY
121 
122     return res;
123 }
124 
125 static void android_os_fileobserver_stopWatching(JNIEnv* env, jobject object, jint fd, jint wfd)
126 {
127 #ifdef HAVE_INOTIFY
128 
129     inotify_rm_watch((int)fd, (uint32_t)wfd);
130 
131 #endif // HAVE_INOTIFY
132 }
133 
134 static JNINativeMethod sMethods[] = {
135      /* name, signature, funcPtr */
136     { "init", "()I", (void*)android_os_fileobserver_init },
137     { "observe", "(I)V", (void*)android_os_fileobserver_observe },
138     { "startWatching", "(ILjava/lang/String;I)I", (void*)android_os_fileobserver_startWatching },
139     { "stopWatching", "(II)V", (void*)android_os_fileobserver_stopWatching }
140 
141 };

startWatching對應的Jni method是android_os_fileobserver_startWatching ,line 115也是调用inotify_add_watch去添加一个fd监控,同樣的stopWatching對應的Jni method是android_os_fileobserver_stopWatching,line 129调用inotify_rm_watch來刪除fd監控。

inotify一些相关函数介绍

相关文章推荐

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

继续看构造函数:public PackageManagerService(Context context, Installer installer, boolean factoryTe...
  • rjdeng
  • rjdeng
  • 2015年11月14日 12:44
  • 782

linux使用Inotify监控目录或者文件状态变更

基本概念: Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。 需求: 1.有一...

inotify结合select监控目录下文件变动

#include #include #include #include #include #include #include #define EVENT_SIZE ( sizeof...

inotify监控linux系统下的目录变化

最近,有个项目需要及时删除Nginx服务生成的缓存文件,由于不是很了解Nginx缓存生成的策略,在网上也没有仔细找,经过大家讨论,最终希望引入liunx的inotify功能,监控某个liunx目录下的...

C 使用 Inotify 监控目录和文件

1. 监控路径并打印所有发生在该路径的事件.  代码如下: /*****************************************************************...

Android8.0 PackageManagerService相关 -- APK安装和install 的变更和源码浅析

1.1           APK安装和install   installd服务是用来执行程序包的安装与卸载的。   1.1.1          参考资料 //各版本支持的命令 ...

Android7.0 PackageManagerService (3) APK安装

在本篇博客中,我们分析一下Android中的APK是如何安装的,以及PKMS在这个过程中进行了哪些工作。APK的安装方式有很多,我们先来看看如何用adb命令进行安装。...

Android5.1--APK包的安装、卸载和优化(PackageManagerService)

Android的应用管理主要是通过PackageManagerService来完成的。PackageManagerService服务负责各种APK包的安装、卸载、优化和查询。 PackageMa...

Android -- PackageManagerService APK安装流程简要分析

Android -- PackageManagerService APK安装流程简要分析 在Android系统下,我们一般会使用"adb install -r"命令来安装应用;此时应用会被安装到/...

Android PackageManagerService分析二:安装APK

这一章我们开始分析APK的安装过程,
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PackageManagerService中运用inotify去监控目录中的APK更新、安装和删除
举报原因:
原因补充:

(最多只允许输入30个字)