14

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

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

我在 Google 上四处搜索,看到人们推荐使用FileObserver类,但这不适用于受保护的文件。还有其他建议吗?

--

我一直在寻找这个问题的答案,但我没有找到任何答案。我已经尝试过这两种有前途的技术,但我无法让它们发挥作用。

  1. 应用程序数据目录中的所有文件都归该应用程序的用户和组所有。FileObserver尊重 Linux 权限,因此我似乎无法使用它来监视另一个应用程序数据目录中的数据库/文件。

我想知道如果我能以某种方式将我的应用程序的 Linux 进程提升为以root. 这也不容易,因为这意味着玩弄 , 我不太了解的setuid机制setguid

  1. 我尝试从另一个应用程序的数据库文件创建一个符号链接到我的应用程序的数据目录。我在符号链接上添加了所有权限,然后用来FileObserver监视它,但这也不起作用。也许我做错了什么,但我最好的猜测是在 Linux 中,符号链接权限是无用的。受尊重的符号链接上的权限是目标文件/目录的权限。

可能有使用 JNI 和inotify.h文件的方法,但我不确定如何去做。

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

4

4 回答 4

7

您无法从 Java 访问它。

一种方法是轮询:ls -l /data/data/com.target.app/databases/data.db定期运行并获取时间戳。

或者也许使用watchtail命令。

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

另一种方法是将SQLite3 二进制文件与您的应用程序一起发布,以 root 身份启动进程,并向其提供命令。我认为许多应用程序,如钛等,都这样做。

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

于 2013-07-03T08:39:05.530 回答
4

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

于 2013-07-23T08:21:53.833 回答
3

如果您具有 root 访问权限,为什么不更新文件权限以允许对相关文件进行组读取访问?IE

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

App2 用户现在应该具有文件的读取权限,FileObserver 将工作。

仅供参考,符号链接镜像(即尊重)被指向的文件的权限。

于 2013-07-23T10:48:37.840 回答
1

inotify是去这里的方式,但您需要类似命令行inotifywait实用程序的东西inotify-tools,以便您可以使用su.

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

然后,你在一个单独的线程中运行它,或者等待它告诉你有变化或者关闭(取决于你是运行inotifywatch还是关闭inotifywait)。

PS 这可能会在 4.3 以后的 SELinux 上下文和诸如此类的情况下惨遭失败。

于 2013-07-29T21:56:22.720 回答