Android adb, извлекать базу данных, используя run-as

На неуправляемом устройстве Android я могу перейти к папке с данными, содержащей базу данных, используя команду run-as с моим именем пакета. Большинство типов файлов, в которых я доволен только просмотром, но с базой данных, которую я хотел бы вытащить, если с устройства Android.

Есть ли download copy или команда move из этой части оболочки adb? Я хотел бы загрузить файл базы данных и просмотреть его содержимое с помощью браузера базы данных.

Один из ответов здесь заключается в том, чтобы превратить весь пакет приложений в сжатый архив, но больше нет ответа на то, как извлечь этот архив, как только это будет сделано, и переместиться на машину, оставив меня очень заурядным, когда может возникнуть более прямое решение для начала

Спасибо

Solutions Collecting From Web of "Android adb, извлекать базу данных, используя run-as"

По дизайну user сборки Android (это то, что у вас есть на телефоне, пока вы не разблокируете загрузчик и не userdebug телефон с userdebug программного обеспечения userdebug или eng ) ограничивает доступ к внутреннему хранилищу – каждое приложение может получить доступ только к своим собственным файлам. К счастью для разработчиков программного обеспечения, не желающих run-as свои телефоны, Google предоставляет способ доступа к внутреннему хранилищу отлаживаемых версий своих пакетов с помощью команды run-as .

Чтобы загрузить файл /data/data/debuggable.app.package.name/databases/file с устройства Android 5.1+, выполните следующую команду:

 adb exec-out run-as debuggable.app.package.name cat databases/file > file 

Чтобы загрузить сразу несколько файлов в папку под /data/data/debuggable.app.package.name/ используйте tar :

 adb exec-out run-as debuggable.app.package.name tar c databases/ > databases.tar adb exec-out run-as debuggable.app.package.name tar c shared_prefs/ > shared_prefs.tar 

Принятый ответ больше не работает для меня (заблокирован Android?)

Поэтому вместо этого я сделал это:

 > adb shell shell $ run-as com.example.package shell $ chmod 666 databases/file shell $ exit ## exit out of 'run-as' shell $ cp /data/data/package.name/databases/file /sdcard/ shell $ run-as com.example.package shell $ chmod 600 databases/file > adb pull /sdcard/file . 

Я опубликовал простой сценарий оболочки для сброса баз данных:

https://github.com/Pixplicity/humpty-dumpty-android

Он выполняет два различных метода, описанных здесь:

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

Здесь вы можете использовать различные приложения CLI или GUI SQLite, такие как sqlitebrowser или sqlitebrowser , для просмотра содержимого базы данных.

Для отладочной версии приложения очень удобно использовать команду adb exec-out run-as xxx.yyy.zzz cat somefile > somefile для извлечения одного файла. Но вам нужно сделать несколько раз для нескольких файлов. Вот простой сценарий, который я использую для извлечения каталога.

 #!/bin/bash P= F= D= function usage() { echo "$(basename $0) [-f file] [-d directory] -p package" exit 1 } while getopts ":p:f:d:" opt do case $opt in p) P=$OPTARG echo package is $OPTARG ;; f) F=$OPTARG echo file is $OPTARG ;; d) D=$OPTARG echo directory is $OPTARG ;; \?) echo Unknown option -$OPTARG usage ;; \:) echo Required argument not found -$OPTARG usage ;; esac done [ x$P == x ] && { echo "package can not be empty" usage exit 1 } [[ x$F == x && x$D == x ]] && { echo "file or directory can not be empty" usage exit 1 } function file_type() { # use printf to avoid carriage return __t=$(adb shell run-as $P "sh -c \"[ -f $1 ] && printf f || printf d\"") echo $__t } function list_and_pull() { t=$(file_type $1) if [ $t == d ]; then for f in $(adb shell run-as $P ls $1) do # the carriage return output from adb shell should # be removed mkdir -p $(echo -e $1 |sed $'s/\r//') list_and_pull $(echo -e $1/$f |sed $'s/\r//') done else echo pull file $1 [ ! -e $(dirname $1) ] && mkdir -p $(dirname $1) $(adb exec-out run-as $P cat $1 > $1) fi } [ ! -z $D ] && list_and_pull $D [ ! -z $F ] && list_and_pull $F 

Надеюсь, это было бы полезно. Этот скрипт также доступен по умолчанию .

Типичное использование

 $ ./exec_out.sh -p com.example.myapplication -d databases 

/data/data/com.example.myapplication/databases он будет извлекать все файлы под вашим каталогом баз данных приложений, который является /data/data/com.example.myapplication/databases , в текущий каталог.

Вот решение, которое работает на устройстве под управлением Android 5.1. Следующий пример для Windows.

Вам нужно sed ([ https://www.gnu.org/software/sed/manual/sed.html%5D или sed.exe в окнах, например, из cygwin.) (В Unix он будет только там;)) , Чтобы удалить плохие символы '\ r', по крайней мере, на окнах.

Теперь просто запустите следующую команду:

 adb exec-out "run-as com.yourcompany.yourapp /data/data/com.yourcompany.yourapp/databases/YourDatabaseName" | c:\cygwin\bin\sed.exe 's/\x0D\x0A/\x0A/'>YourDatabaseName.db 

Команда sed удаляет конечные / r символы.

Конечно, вы должны заменить «com.yourcompany.yourapp» на имя пакета приложения и «YourDatabaseName» с именем базы данных в приложении.

Я не мог заставить что-то другое работать для меня, но это:

 adb shell run-as package.name cat /databases/databaseFileName.db > /sdcard/copiedDatabaseFileName.db exit exit adb pull /sdcard/copiedDatabaseFileName.db /file/location/on/computer/ 

Первый выход – выйти из забега, так как второй выход – выйти из оболочки adb, чтобы выполнить pull.