14

別のアプリケーションの SQLite データベースへの変更を監視したいと考えています。Android では別のアプリケーションの内部データにアクセスできないため、まさに私のものと同じルート アプリケーションが必要です。

システム上のファイルへの変更を監視し、アプリケーションでイベントをトリガーする方法はありますか?

私はグーグルで検索し、人々がFileObserverクラスの使用を推奨しているのを見てきましたが、これは保護されたファイルでは機能しません。他の提案はありますか?

--

私はこれに対する答えを探していましたが、何も見つかりませんでした。これら 2 つの sei-promising テクニックを試しましたが、うまくいきませんでした。

  1. アプリケーションのデータ ディレクトリ内のすべてのファイルは、そのアプリケーションのユーザーとグループによって所有されます。FileObserverLinux のアクセス許可を尊重するため、別のアプリケーションのデータ ディレクトリにあるデータベース/ファイルを監視するために使用できないようです。

アプリケーションの Linux プロセスを何らかの形で昇格させてroot. setuidこれは、setguid私がよく知らないメカニズムをいじることを意味するため、簡単ではありません。

  1. 他のアプリケーションのデータベース ファイルから自分のアプリケーションのデータ ディレクトリへのシンボリック リンクを作成しようとしました。シンボリック リンクにすべてのアクセス許可を追加し、それFileObserverを監視するために使用しましたが、これも機能しませんでした。何か間違ったことをしたのかもしれませんが、Linux ではシンボリック リンクのアクセス許可は役に立たないと思います。尊重されるシンボリック リンクのアクセス許可は、ターゲット ファイル/ディレクトリのアクセス許可です。

JNIとinotify.hファイルを使用する方法があるかもしれませんが、これについてどうすればよいかわかりません。

アプリケーションからデータベースをポーリングしたくありません。イベントトリガーメカニズムが欲しいです。

4

4 に答える 4

4

1 つのオプションは、コンテンツ プロバイダーを使用してデータベースをカプセル化することです。その後、他のアプリケーションは、 ContentObserverクラスを使用してテーブル/URI の変更をサブスクライブできます。

于 2013-07-23T08:21:53.833 に答える
1

inotifyここに行く方法ですが、で昇格できるように、 のコマンドラインinotifywaitユーティリティのようなものが必要です。inotify-toolssu

独自に作成するか (非常に簡単です)、既存の portを使用できます。

次に、別のスレッドで昇格して実行し、変更があることを通知するのを待つか、終了します (実行するか実行するかによって異なりますinotifywatch) inotifywait

PS これは、SELinux コンテキストなどを使用する 4.3 以降で惨めに失敗する可能性があります。

于 2013-07-29T21:56:22.720 に答える