Как я могу контролировать другую базу данных приложений для изменений?
Я хочу отслеживать изменения в другой базе данных SQLite. Поскольку Android не позволяет мне получать доступ к внутренним данным другого приложения, мне нужно приложение root, которое является именно тем, что у меня есть.
Есть ли способ отслеживать изменения в файле в системе и запускать событие в моем приложении?
Я искал Google и видел, как люди рекомендуют использовать класс FileObserver
, но это не будет работать для защищенных файлов. Любые другие предложения?
-
Я искал ответ для этого, но я его не нашел. Я пробовал эти два sei-перспективных методов, но я не мог заставить их работать.
- Все файлы в каталоге данных приложения принадлежат этому пользователю и группе приложений.
FileObserver
уважает разрешения Linux, поэтому я не могу использовать его для мониторинга базы данных/файла в другом каталоге данных приложения.
Мне интересно, возможно ли это, если бы я мог каким-то образом поднять мой Linux-процесс приложения для работы под root
. Это нелегко, так как это означало бы сотрудничество с механизмом setuid
, setguid
, о котором я не очень понимаю.
- Я попытался создать символическую ссылку из другого файла базы данных приложения в каталог данных приложения. Я добавил все разрешения на символическую ссылку, а затем использовал
FileObserver
для ее мониторинга, но это тоже не сработало. Возможно, я сделал что-то не так, но, насколько мне известно, в Linux, разрешения на символическую ссылку бесполезны. Разрешения на символическую ссылку, которые соблюдаются, относятся к целевому файлу/каталогу.
Может существовать способ использования файлов JNI и inotify.h
, но я не уверен, как это сделать.
Я не хочу опросить базу данных из своего приложения. Я хотел бы иметь механизм запуска событий.
Ответы
Ответ 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 и еще чего-то.