Подтвердить что ты не робот

Доступ к ADB для Android без доступа к базе данных

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

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

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

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

В принципе, я хочу вытащить базу данных из моего приложения на не-корневом телефоне, чтобы изменить его и снова нажать.

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

4b9b3361

Ответ 1

В то время как ответ 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

Ответ 2

Быстрое обходное решение заключается в использовании команды 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 здесь

Обратите внимание, что команда run-as доступна с уровня API 8 (Android 2.2) и может использоваться только в том случае, если приложение debbugable.

Ответ 3

В 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

Ответ 4

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

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 управляет своими данными.