在Java层常用FileObserver去监听文件的变化,它是基于Inotify实现的,在文件的信息发生变更以后,通过Inotify通知事件的变更。 图片文件事件FileObserver事件(FileObserver.java)Inotify事件(inotify.h)说明ACCESSIN_ACCESS读取文件内容MODIFYIN_MODIFY修改文件内容 FileObserver原理文件目录frameworks/base/core/java/android/os/FileObserver.java frameworks/base/core/jni/android_util_FileObserver.cppFileObserver 内部定义了一个静态线程类ObserverThread,随着FileObserver的实例对象初始化而创建。
android.os下的FileObserver类是一个用于监听文件访问、创建、修改、删除、移动等操作的监听器,基于linux的inotify。 FileObserver 是个抽象类,必须继承它才能使用。 每个FileObserver对象监听一个单独的文件或者文件夹,如果监视的是一个文件夹,那么文件夹下所有的文件和级联子目录的改变都会触发监听的事件。 比如,我要监听sd卡的目录创建事件,新建一个类SDCardListener继承FileObserver: import android.os.FileObserver; import android.util.Log 最后补充一点,比较重要 : FileObserver对象必须保持一个引用,确保不被垃圾收集器回收掉,否则就不会触发事件了。
当app被安装时,会在/data/data/目录下新建相应包名的文件夹,而java中有一个工具类:FileObserver,可以监听文件和文件夹的变化,我们利用在native层调用FileObserver 的方法 首先查看FileObserver的源码发现,它内部就是一个线程 static { s_observerThread = new ObserverThread(); FileObserver observer = null; synchronized (m_observers) { WeakReference android_os_fileobserver_observe() got a short event!") *)android_os_fileobserver_stopWatching } }; int register_android_os_FileObserver(JNIEnv* env) {
getWorkerTag()).release(); mWorkerLock.unlock(); } } } OK,实现完基础服务类,我们可以关注业务需求了,监测文件夹文件创建事件可用FileObserver ,代码如下: import android.content.Intent; import android.os.FileObserver; import android.util.Log; import start watching directory " + observeDir); } } private class RecordFileListener extends FileObserver public void onEvent(int event, String path) { switch (event) { case FileObserver.CREATE
其次,一些读取数据库动态注册广播没有及时关闭注销也是容易造成内存泄露的 例如例如BroadcastReceiver、ContentObserver,FileObserver在Activity的onDeatory
如果单例对象持有外部对象的引用,那么这个外部对象将不能被 JVM 正常回收,导致内存泄露 3.Android 组件或特殊集合对象的使用 BraodcastReceiver,ContentObserver,FileObserver
系统记录热方法的数据文件存在 /data/misc/profiles/cur/0/packageName/primary.prof下,我们可以通过FileObserver监听这个这个文件修改判断是否需要
GitHub Demo项目链接:https://github.com/DoubleD0721/Screenshot前瞻目前Android针对截屏的监控主要有三种方式:利用FileObserver监听某个目录中资源的变化利用
//申请这把锁 synchronized (MainActivity.this){ LogUtils.i(""); } ANR 监控 通过FileObserver
tv.getViewTreeObserver().removeOnWindowFocusChangeListener(this); 资源未关闭造成的内存泄漏 比如:BroadcastReceiver,ContentObserver,FileObserver
tv.getViewTreeObserver().removeOnWindowFocusChangeListener(this); 资源未关闭造成的内存泄漏 比如:BroadcastReceiver,ContentObserver,FileObserver
影响 ● Android 6.0以后,由于动态权限管理的需要,会存在多个fuse挂载点,这导致inotify/FileObserver对外部存储进行文件事件监控时,会丢失事件。
影响 ● Android 6.0以后,由于动态权限管理的需要,会存在多个fuse挂载点,这导致inotify/FileObserver对外部存储进行文件事件监控时,会丢失事件。
他们可能会生成不同类型的日志,并写入到指定的文件目录临时文件目录:根据文件类型、优先级设置不同目录来存放临时文件上报数据目录:临时文件目录中的文件会通过rename方案写到上报数据目录消费者:上报进程,上报进程会通过FileObserver
影响 Android 6.0以后,由于动态权限管理的需要,会存在多个fuse挂载点,这导致inotify/FileObserver对外部存储进行文件事件监控时,会丢失事件。
observer; if (useTombstonedForJavaTraces) { observer = null; } else { // Use a FileObserver
4.3 典型实例分析 4.3.1 页面泄漏 android.os.FileObserver$ObserverThread.contextClassLoader dalvik.system.PathClassLoader.runtimeInternalObjects
register_android_database_SQLiteDebug), REG_JNI(register_android_os_Debug), REG_JNI(register_android_os_FileObserver
ANR处理方法: 使用 FileObserver 监听 /data/anr/traces.txt 的变化。非常不幸的是,很多高版本的 ROM,已经没有读取这个文件的权限了。