Доступ к ADB для Android без доступа к базе данных
Может ли кто-нибудь сказать мне, возможно ли использовать ADB для вытаскивания и выталкивания базы данных из приложения без root privaliges на телефоне?
Например, я знаю, что местоположение моей корневой магии и сна:
/data/data/com.xxxx.xxxx/databases/xxxx
Я знаю, что вы можете использовать ADB без root, но при попытке использовать оболочку вы не можете просмотреть это местоположение без root privaliges. Но мне сказали, что вы можете использовать push и pull, если знаете файл, который хотите?
В принципе, я хочу вытащить базу данных из моего приложения на не-корневом телефоне, чтобы изменить его и снова нажать.
Единственная проблема, с которой я столкнулся, - у меня есть оба телефона, и у меня нет доступа к не root, чтобы попробовать.
Ответы
Ответ 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 управляет своими данными.