Доступ Android ADB к базам данных приложений без рута

StackOverflow https://stackoverflow.com/questions/2078710

  •  21-09-2019
  •  | 
  •  

Вопрос

Может ли кто-нибудь сказать мне, можно ли использовать 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 из основной папки в базы данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top