Как я могу контролировать другую базу данных приложений для изменений? - программирование

Как я могу контролировать другую базу данных приложений для изменений?

Я хочу отслеживать изменения в другой базе данных SQLite. Поскольку Android не позволяет мне получать доступ к внутренним данным другого приложения, мне нужно приложение root, которое является именно тем, что у меня есть.

Есть ли способ отслеживать изменения в файле в системе и запускать событие в моем приложении?

Я искал Google и видел, как люди рекомендуют использовать класс FileObserver, но это не будет работать для защищенных файлов. Любые другие предложения?

-

Я искал ответ для этого, но я его не нашел. Я пробовал эти два sei-перспективных методов, но я не мог заставить их работать.

  • Все файлы в каталоге данных приложения принадлежат этому пользователю и группе приложений. FileObserver уважает разрешения Linux, поэтому я не могу использовать его для мониторинга базы данных/файла в другом каталоге данных приложения.

Мне интересно, возможно ли это, если бы я мог каким-то образом поднять мой Linux-процесс приложения для работы под root. Это нелегко, так как это означало бы сотрудничество с механизмом setuid, setguid, о котором я не очень понимаю.

  1. Я попытался создать символическую ссылку из другого файла базы данных приложения в каталог данных приложения. Я добавил все разрешения на символическую ссылку, а затем использовал FileObserver для ее мониторинга, но это тоже не сработало. Возможно, я сделал что-то не так, но, насколько мне известно, в Linux, разрешения на символическую ссылку бесполезны. Разрешения на символическую ссылку, которые соблюдаются, относятся к целевому файлу/каталогу.

Может существовать способ использования файлов JNI и inotify.h, но я не уверен, как это сделать.

Я не хочу опросить базу данных из своего приложения. Я хотел бы иметь механизм запуска событий.

4b9b3361

Ответ 1

Вы не можете получить к нему доступ с Java.

Один из способов - опрос: запустить ls -l /data/data/com.target.app/databases/data.db и периодически получать отметку времени.

Или, возможно, используйте команды watch или tail.

Может быть фоновое обслуживание может запускать это и вызывать локальную передачу.

Другой способ - отправить двоичный файл SQLite3 с вашим приложением, запустить процесс с правами root и поставьте команды на него. Я думаю, что многие приложения, такие как титан и т.д., Делают это.

Update: Здесь проект SQLite3: http://code.google.com/p/sqlite3-android/

Ответ 2

Одним из вариантов было бы инкапсулировать вашу базу данных с помощью поставщика контента, а затем другое приложение может подписаться на изменения в таблицах /URI с помощью ContentObserver класс

Ответ 3

У вас есть root-доступ, почему бы не обновлять разрешения для файлов, чтобы разрешить доступ к группе для данного файла? то есть.

  • При необходимости создайте новую группу, например. SQLLiteGroup
  • Обновить групповое право собственности на файл SQLLite db на SQLLiteGroup
  • Установить права доступа к файлам для чтения группы для файла SQLLite db
  • App2 добавить пользователя в группу SQLLiteGroup

Пользователь App2 теперь должен иметь доступ для чтения к файлу, FileObserver будет работать.

Символьные ссылки FYI (т.е. соблюдение) разрешений файла, на который указывает.

Ответ 4

inotify - это путь сюда, но вам понадобится что-то вроде командной строки inotifywait с inotify-tools, так что вы можете поднять ее с помощью su.

Вы можете либо написать свой собственный (это очень просто), либо использовать существующий порт.

Затем вы запускаете его в отдельном потоке и ожидаете, пока он сообщит вам об изменении или закрытии (в зависимости от того, запускаете ли вы inotifywatch или inotifywait).

P.S. Вероятно, это произойдет с ошибкой 4.3 с использованием контекстов SELinux и еще чего-то.