Android ADB доступ к базам данных приложений без рута - PullRequest
33 голосов
/ 16 января 2010

Может кто-нибудь сказать мне, возможно ли использовать ADB для извлечения и переноса базы данных из приложения без прав root на телефоне?

Например, я знаю местоположение моей укоренившейся магии и мечта:

/data/data/com.xxxx.xxxx/databases/xxxx

Я знаю, что вы можете использовать ADB без рута, но при попытке использовать оболочку - вы не можете просмотреть это местоположение без корневых привилегий. Но мне сказали, что вы можете использовать push and pull, если знаете нужный файл?

По сути, я хочу получить базу данных из МОЕ приложения на телефоне без прав доступа, изменить его и снова включить.

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

Ответы [ 5 ]

78 голосов
/ 18 июня 2013

Хотя ответ Nilhcem не сработал для меня, он привел меня в правильном направлении (за это я проголосовал), и теперь у меня есть рабочее решение.

Старый ответ, который может не работать с более новыми версиями 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
13 голосов
/ 30 октября 2012

Обходной путь - использовать команду 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) и может использоваться только в том случае, если для приложения debbugable .

1 голос
/ 15 июля 2016

На 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
0 голосов
/ 08 апреля 2018

, если вы хотите вставить файл db в приложение

Прежде всего, поместите файл "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/

копирует файл.db, находящийся в основной папке, в базы данных.

0 голосов
/ 11 июля 2014

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

if (BuildConfig.DEBUG)
{
    new File(mDB.getPath()).setReadable(true, false);
}

Тогда просто извлеките .db с помощью adb.

adb -d pull //data/data/xxxxx/databases/xxxxx.db .

ПРИМЕЧАНИЕ: Я обнаружил, что это нужно делать при каждом открытии файла базы данных, например, в onCreate, а также в конструкторе вашей оболочки SQLiteOpenHelper (когда ваша база данных не равна нулю) или, возможно, на открытом. Если только в onCreate, то при следующем запуске приложения и .db уже существует, по какой-то причине разрешения были изменены обратно. Это может быть связано с тем, как Android управляет своими данными.

...