Java 如何监视另一个应用程序';数据库的变化?

Java 如何监视另一个应用程序';数据库的变化?,java,android,Java,Android,我想监视对另一个应用程序SQLite数据库的更改。由于Android不允许我访问另一个应用程序的内部数据,我需要一个根应用程序,这正是我的根应用程序 是否有一种方法可以监视系统上文件的更改并触发应用程序中的事件 我在谷歌上搜索过,看到有人建议使用class,但这对受保护的文件不起作用。还有其他建议吗 -- 我一直在寻找答案,但我没有找到任何答案。我试过这两种sei很有前途的技术,但我无法让它们发挥作用 应用程序数据目录中的所有文件都归该应用程序的用户和组所有FileObserver尊重Linux

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

是否有一种方法可以监视系统上文件的更改并触发应用程序中的事件

我在谷歌上搜索过,看到有人建议使用class,但这对受保护的文件不起作用。还有其他建议吗

--

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

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

  • 我尝试创建一个从另一个应用程序的数据库文件到我的应用程序的数据目录的符号链接。我在符号链接上添加了所有权限,然后使用
    FileObserver
    监视它,但这也不起作用。也许我做错了什么,但我最好的猜测是。符号链接上受尊重的权限是目标文件/目录的权限
  • 也许有办法使用JNI和
    inotify.h
    文件,但我不确定该怎么做


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

    您不能从Java访问它

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

    或者可以使用
    watch
    tail
    命令

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

    另一种方法是随应用程序一起发布,以root用户身份启动进程,然后。我认为很多应用程序,比如Tianium等,都可以做到这一点

    更新:
    这里有一个SQLite3项目:

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

    如果您具有根访问权限,为什么不更新文件权限以允许对相关文件的组读访问? i、 e

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


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

    inotify
    是一种方法,但您需要类似于
    inotifytools
    中的命令行
    inotifywait
    实用程序的工具,以便使用
    su
    提升它

    您可以自己编写(非常简单),也可以使用

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


    另外,从4.3版开始,在SELinux上下文和诸如此类的情况下,这很可能会失败。

    您可以将触发器添加到有问题的表中吗?
    FileObserver
    下有一个底层机制,称为
    inotify
    。你可以试着使用它。@Spongeboban,你知道如果我有root权限,我是否可以使用
    FileObserver
    来监视另一个系统文件吗?@DavidJashi,我可以这样做。你能详细说明我如何使用数据库触发器来完成我想要的任务吗?谢谢。@MridangAgarwalla我不是Android SQLite的专家,但当我想在RDBMS上保留自定义审核跟踪时,我会在有问题的表上放置触发器,并用跟踪记录更新一个审核表。如果SQLite允许从两个应用程序同时访问(就像大多数RDBMS一样),您可以每秒轮询一次记录计数,并在记录计数发生变化时请求最后一条记录,即将轮询放在DB级别,而不是文件系统。他有根访问权限,这意味着他很可能也有BusyBox。意思是,手表和尾巴是可用的。@JoelBodega-True,所以这是一个选项。但是,如果他能够提供自己的sqlite3,并获得一个活动的sqlite shell(作为根用户)来运行命令,那么这将是两者中更好的选择,因为他还可以获得类似数据库的访问权。@s.D.,这不是一个选项,因为它需要轮询。我对一个事件很感兴趣,例如
    FileObserver
    inotify
    @S.D.,我忘了提到我的应用程序中有
    sqlite3
    二进制包,我正在对相关数据库执行命令并读取输出。虽然这样做有效,但我需要知道何时查询数据库。我只想在数据库被写入时才这样做,因此我的问题是@S.D.这是一种避免无法直接查看文件的方法。i、 e.监控一个你能监控的。同意,这并不漂亮,但您正在做的事情并不完全符合标准,请记住,我们中没有人完全了解您的确切需求、环境、约束或能力。我们正在尝试一些选项,至少可以让你朝着正确的方向前进!这需要访问另一个应用程序的源代码,不是吗?这是我做不到的。我认为要么应用程序需要实现一个内容提供商(你能检查他们是否这样做吗?),要么你需要能够连接/打开他们的数据库(我不确定你是否可以作为root用户来做),并且