如何监视另一个应用程序的数据库以进行更改?

时间:2013-07-03 08:26:19

标签: java android

我想监视另一个应用程序SQLite数据库的更改。由于Android不允许我访问其他应用程序的内部数据,因此我需要一个root应用程序,这正是我的。

有没有办法可以监控系统中文件的更改并在我的应用程序中触发事件?

我已经Google搜索并看到人们建议使用FileObserver类,但这不适用于受保护的文件。还有其他建议吗?

-

我一直在寻找答案,但我没有找到任何答案。我尝试过这两种有希望的技术,但我无法让它们发挥作用。

  1. 应用程序数据目录中的所有文件都归该应用程序的用户和组所有。 FileObserver尊重Linux权限,因此我似乎无法使用它来监视另一个应用程序的数据目录中的数据库/文件。
  2. 我想知道如果我能以某种方式提升我的应用程序的Linux进程以root运行,这是否可行。这也不容易,因为它意味着使用我不太了解的setuidsetguid机制。

    1. 我尝试从其他应用程序的数据库文件创建一个符号链接到我的应用程序的数据目录中。我在符号链接上添加了所有权限,然后使用FileObserver来监视它,但这也不起作用。也许我做错了什么,但我最好猜测in Linux, symbolic-link permissions are useless。符号链接上的权限是目标文件/目录的权限。
    2. 可能有办法使用JNI和inotify.h文件,但我不知道如何解决这个问题。

      我不想从我的应用程序中轮询数据库。我想要一个事件触发机制。

4 个答案:

答案 0 :(得分:7)

您无法从Java访问它。

一种方式是民意调查:运行ls -l /data/data/com.target.app/databases/data.db并定期获得时间戳。

或者也许使用watchtail命令。

可能是后台服务可以运行此并发出本地广播。

其他方式是使用您的应用发送SQLite3 binary,以root用户身份启动流程,然后supply commands to it。我认为像钛等许多应用都可以做到这一点。

<强>更新 这是一个SQLite3项目:http://code.google.com/p/sqlite3-android/

答案 1 :(得分:4)

一种选择是使用content provider封装数据库,然后另一个应用程序可以使用ContentObserver类订阅表/ URI中的更改

答案 2 :(得分:2)

如果您具有超级用户权限,为什么不更新文件权限以允许对相关文件进行组读取访问? 即。

  • 根据需要创建新组,例如SQLLiteGroup
  • 将SQLLite db文件的组所有权更新为SQLLiteGroup
  • 为SQLLite db文件的组读取设置文件权限
  • App2将用户添加到组SQLLiteGroup

App2用户现在应该具有对文件的读访问权,FileObserver将起作用。

FYI符号链接镜像(即尊重)所指向文件的权限。

答案 3 :(得分:1)

inotify是前往此处的方式,但您需要inotifywait之类的命令行inotify-tools实用程序,以便您可以使用{{1}来提升它}}。

您可以自己编写(非常简单)或使用existing port

然后,您在一个单独的线程中提升它,并等待它告诉您更改或关闭(取决于您是运行su还是inotifywatch )。

P.S。使用SELinux上下文和诸如此类的东西,这可能会在4.3以后惨败。