目的:监听系统/data/system/dropbox目录,解析出crash和ANR,并上传云端。
这里只记录如何监听这个目录和实践中遇到的问题。
使用的到技术:
1.inotify
2.epoll
3.thread
环境:android系统
demo测试:
1.通过UI按钮触发启动监听,观察监听过程日志;
2.通过UI按钮触发读取新增文件内容。
首先,利用linux系统接口inotify来监听该目录新增文件。
inotify_fd = inotify_init();
inotify_add_watch(inotify_fd, path.c_str(), IN_CREATE | IN_MODIFY | IN_DELETE) // 根据需要添加要监听的事件
然后,通过epoll监听
// 创建epoll句柄
int epfd = epoll_create(256);
struct epoll_event ev;
ev.data.fd = inotify_fd;
ev.events = EPOLLIN | EPOLLET;
// 注册 epoll 事件
LOGD("epoll_ctl");
epoll_ctl(epfd, EPOLL_CTL_ADD, inotify_fd, &ev);
// 循环监听事件
char buffer[BUF_LEN];
struct epoll_event events[20]; // 存储从内核得到的事件集合
while (!isStopped) {
LOGD("epoll wait");
// 等待事件发生。返回需要处理的事件数目
int nfds = epoll_wait(epfd, events, 20, 500);
LOGD("Event count: %d", nfds);
sleep(3);
// 遍历events
。。。
}
测试时,发现在监听过程中,点击读取文件内容,出现ANR,最后发现整个监听需要放到子线程完成
work_thread = new std::thread([this, path] { startWatchImpl(path.c_str()); });
记得释放申请的内存和各种句柄
close(epfd);
close(inotify_fd);