我想监视另一个应用程序SQLite数据库的更改。由于Android不允许我访问其他应用程序的内部数据,因此我需要一个root应用程序,这正是我的。
有没有办法可以监控系统中文件的更改并在我的应用程序中触发事件?
我已经Google搜索并看到人们建议使用FileObserver
类,但这不适用于受保护的文件。还有其他建议吗?
-
我一直在寻找答案,但我没有找到任何答案。我尝试过这两种有希望的技术,但我无法让它们发挥作用。
FileObserver
尊重Linux权限,因此我似乎无法使用它来监视另一个应用程序的数据目录中的数据库/文件。我想知道如果我能以某种方式提升我的应用程序的Linux进程以root
运行,这是否可行。这也不容易,因为它意味着使用我不太了解的setuid
,setguid
机制。
FileObserver
来监视它,但这也不起作用。也许我做错了什么,但我最好猜测in Linux, symbolic-link permissions are useless。符号链接上的权限是目标文件/目录的权限。可能有办法使用JNI和inotify.h
文件,但我不知道如何解决这个问题。
我不想从我的应用程序中轮询数据库。我想要一个事件触发机制。
答案 0 :(得分:7)
您无法从Java访问它。
一种方式是民意调查:运行ls -l /data/data/com.target.app/databases/data.db
并定期获得时间戳。
或者也许使用watch
或tail
命令。
可能是后台服务可以运行此并发出本地广播。
其他方式是使用您的应用发送SQLite3 binary,以root用户身份启动流程,然后supply commands to it。我认为像钛等许多应用都可以做到这一点。
<强>更新强> 这是一个SQLite3项目:http://code.google.com/p/sqlite3-android/
答案 1 :(得分:4)
一种选择是使用content provider封装数据库,然后另一个应用程序可以使用ContentObserver类订阅表/ URI中的更改
答案 2 :(得分:2)
如果您具有超级用户权限,为什么不更新文件权限以允许对相关文件进行组读取访问? 即。
App2用户现在应该具有对文件的读访问权,FileObserver将起作用。
FYI符号链接镜像(即尊重)所指向文件的权限。
答案 3 :(得分:1)
inotify
是前往此处的方式,但您需要inotifywait
之类的命令行inotify-tools
实用程序,以便您可以使用{{1}来提升它}}。
您可以自己编写(非常简单)或使用existing port。
然后,您在一个单独的线程中提升它,并等待它告诉您更改或关闭(取决于您是运行su
还是inotifywatch
)。
P.S。使用SELinux上下文和诸如此类的东西,这可能会在4.3以后惨败。