Доступ Android ADB к базам данных приложений без рута
Вопрос
Может ли кто-нибудь сказать мне, можно ли использовать ADB для извлечения и отправки базы данных из приложения без прав root на телефоне?
Например, я знаю местоположение моей укорененной магии, и сон такой:
/data/data/com.xxxx.xxxx/databases/xxxx
Я знаю, что вы можете использовать ADB без рута, но при попытке использовать оболочку вы не сможете просмотреть это местоположение без привилегий root.Но мне сказали, что вы можете использовать push и pull, если знаете, какой файл вам нужен?
По сути, я хочу извлечь базу данных из МОЕГО приложения на нерутированном телефоне, изменить ее и снова включить.
Единственная проблема, с которой я столкнулся, заключается в том, что у меня есть два телефона с root-доступом, и у меня нет доступа к другому телефону без root-прав, чтобы опробовать его.
Решение
Хотя ответ Нилхцема мне не помог, он привел меня в правильном направлении (за это я проголосовал), и теперь у меня есть рабочее решение.
Старый ответ, который может не работать с новыми версиями Android:
#Transfer file from app databases directory to PC
adb shell
$ run-as package.name
$ cd ./databases/
$ ls -l #Find the current permissions - r=4, w=2, x=1
$ chmod 666 ./dbname.db
$ exit
$ exit
adb pull /data/data/package.name/databases/dbname.db ~/Desktop/
#Transfer file from PC to app databases directory (requires the above permission change)
adb push ~/Desktop/dbname.db /data/data/package.name/databases/dbname.db
adb shell
$ run-as package.name
$ chmod 660 ./databases/dbname.db #Restore original permissions
$ exit
$ exit
Альтернативный метод с использованием внешнего хранилища (подтверждено, что он работает с версией 6.0.1):
#Transfer file from app databases directory to external storage
adb shell
$ run-as package.name
$ cp ./databases/dbname.db /sdcard/
$ exit
$ exit
#Transfer file from external storage to app databases directory
adb shell
$ run-as package.name
$ cp /sdcard/dbname.db ./databases/
$ exit
$ exit
Другие советы
Быстрый обходной путь — использовать run-as
команда для копирования базы данных в папку, к которой у вас есть доступ, например /sdcard
а потом делай нормально adb pull
adb shell
$ run-as package.name cp /data/data/package.name/dbname.db /sdcard/
$ exit
adb pull /sdcard/dbname.db
Дополнительная информация о команде запуска от имени здесь
Обратите внимание, что run-as
Команда доступна начиная с уровня API 8 (Android 2.2) и может использоваться только в том случае, если приложение поддающийся объяснению.
На OxygenOS
(на основе Android 5.2) Я перепутал два решения, предоставленные Pilot_51
.
Сначала я использовал run-as
чтобы получить доступ к /data/data/package.name/databases
отсюда я не смог скопировать напрямую /sdcard/
поэтому я изменил разрешение файла.После этого я вышел из run-as
режим и используется cp
чтобы скопировать файл в /sdcard/
хранилище.В конце концов я смог использовать adb pull
$ adb -s <DEVICE_ID> shell
$ run-as package.name
$ chmod 666 databases/dbname.db
$ exit
$ cp /data/data/package.name/databases/dbname.db /sdcard/dbname.db
$ exit
$ adb pull /sdcard/dbname.db ./dbname.db
Мы устанавливаем права доступа к файлам для чтения всем пользователям из приложения.
if (BuildConfig.DEBUG)
{
new File(mDB.getPath()).setReadable(true, false);
}
Затем просто вытащите .db с помощью adb в обычном режиме.
adb -d pull //data/data/xxxxx/databases/xxxxx.db .
ПРИМЕЧАНИЕ: Я обнаружил, что это необходимо делать каждый раз, когда открывается файл базы данных, например, в onCreate, а также в конструкторе вашей оболочки SQLiteOpenHelper (когда ваша база данных не равна нулю) или, возможно, в onOpen.Если только в onCreate, то в следующий раз, когда вы запустите свое приложение, и .db уже существует, по какой-то причине разрешения будут изменены обратно.Возможно, это связано с тем, как Android управляет своими данными.
если вы хотите поместить файл базы данных в приложение
прежде всего, поместите «file.db» в «/storage/emulated/0/» из-за проблем с разрешениями.тогда вы должны представиться как приложение для доступа к папке данных.
adb shell
$ run-as com.package.name
:/data/data/com.package.name $ cp /storage/emulated/0/file.db /data/data/com.package.name/databases/
он копирует файл file.db из основной папки в базы данных.