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

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

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

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

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

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

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


person Scoobler    schedule 16.01.2010    source источник
comment
stackoverflow.com/a/18472135/1778421   -  person Alex P.    schedule 05.07.2018


Ответы (5)


Хотя ответ 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
person Pilot_51    schedule 18.06.2013
comment
Это правильный ответ на заданный вопрос, если человек, желающий это сделать, является разработчиком приложения и может установить его отладочную версию (отладочная версия является предварительным условием для запуска от имени). Другие варианты включают изменение разрешения самого приложения или копирование файла во внешнее хранилище или из него. - person Chris Stratton; 18.06.2013
comment
adb return с сообщением run-as: пакет com.instagram.android неизвестен, что мне делать? Я также пытаюсь использовать su, затем adb pull /data/data/package.name/databases/dbname.db ~ / Desktop /, но он возвращает ошибку: устройство не найдено? - person UmAnusorn; 09.10.2013
comment
@ um.anusorn В 4.3 есть проблема, которая нарушает работу от имени и должна быть исправлена ​​в 4.4. См .: code.google.com/p/android/issues/detail? id = 58373 Если у вас есть root, вы можете исправить это, включив разрешение Set UID для / system / bin / run-as, но это не дает цели. - person Pilot_51; 04.02.2014
comment
@ Pilot_51 Спасибо за ответ - person UmAnusorn; 05.02.2014
comment
@ um.anusorn. Это может означать, что ваше приложение не является отладочной версией (с той же проблемой в 2.3). - person halxinate; 21.02.2014
comment
Хотя файл явно существует и к нему применен chmod 666, adb pull говорит, что удаленный объект не существует. Похоже, вам все еще нужны дополнительные разрешения для этого? - person Sebastian Wramba; 11.12.2014
comment
Я пытался сделать что-то подобное, но это не файл конкретного приложения. Я специально пытаюсь получить доступ к файлу gesture.key на своем телефоне, и он не позволяет мне вытащить его или изменить его. Могу ли я что-нибудь вставить после run-as, что предоставит мне доступ для чтения к файлу? - person Reverend Bubbles; 23.04.2015
comment
Этот обходной путь больше не работает, по крайней мере, на Android 5.1+. При извлечении файла выясняется, что имя файла удаленного объекта не существует. Ответ должен отражать это. - person Bogdan Zurac; 19.05.2015
comment
Наконец-то мне понадобилось передать файл в данные моего приложения в 6.0.1 (стандартный Nexus 5X), и я придумал способ сделать это через внешнее хранилище, очень похожий на ответ Nilhcem. Добавлено в ответ. - person Pilot_51; 05.06.2016
comment
Не работает на устройствах SAMSUNG. stackoverflow .com / questions / 37413667 / - person user643011; 24.11.2016
comment
Ваша вторая часть вашего ответа спасла мне день. Проверено также на Android 6.0.1, работает отлично. - person Francisco Romero; 17.02.2017

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

person Nilhcem    schedule 30.10.2012
comment
на моей версии (может быть, что-то связано с 4.4 или какое-то обновление в прошлом году?) Я не могу cp перейти на / sdcard при использовании run-as. Мне нужно использовать chmod решение от @ Pilot_51 - person Richard Le Mesurier; 06.02.2014
comment
Это правда - на sd-карту больше нельзя записывать при использовании оболочки adb - person slott; 13.01.2015

На 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
person fredmaggiowski    schedule 15.07.2016

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

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

person delrocco    schedule 11.07.2014

если вы хотите вставить файл 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/

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

person AhuraMazda    schedule 08.04.2018