2010-01-16 6 views
31

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

Например, я знаю место на моей магии и корневых сновидении:

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

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

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

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

+0

, пожалуйста, подумайте об изменении вашего согласия на ответ Pilot_51. –

ответ

72

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

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

Это правильный ответ на заданный вопрос, где человек, желающий сделать это, является разработчиком приложение и может установить отладочную версию (отладочная версия является предварительным условием для запуска). Другие варианты включают в себя использование самого приложения, изменение разрешения или копирование файла в/из внешнего хранилища. –

+0

adb return with message run-as: Пакет 'com.instagram.android' неизвестен, что мне делать? Я также пытаюсь использовать su, затем adb pull /data/data/package.name/databases/dbname.db ~/Desktop /, но он возвращает ошибку: устройство не найдено? – UmAnusorn

+1

@ um.anusorn В 4.3 есть проблема, которая прерывает run-as и должна быть исправлена ​​в 4.4. См. Https://code.google.com/p/android/issues/detail?id=58373 Если у вас есть root, вы можете исправить его, включив разрешение Set UID/system/bin/run-as, но это вид поражения цели. –

13

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

Больше информации о вводного, как команда here

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

+0

в моей версии (возможно, что-то связано с 4.4 или некоторым обновлением за последний год?) Я не могу 'cp' to/sdcard при использовании' run-as'. Мне нужно использовать решение 'chmod' от @ Pilot_51 –

+0

Это правда - SD-карта больше не может быть записана при использовании оболочки adb – slott

0

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

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

1

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