android adb, получение базы данных с помощью run-as
на некорневом устройстве android я могу перейти к папке данных, содержащей базу данных, используя с моим именем пакета. Большинство типов файлов я доволен только просмотром, но с базой данных я хотел бы вытащить, если с устройства android.
есть downloadcopy или move команда из этой части оболочки adb? Я хочу скачать файл базы данных и просмотреть его содержимое с помощью браузера базы данных.
один ответ здесь включает в себя превращение всего пакета приложений в сжатый архив, но нет никакого дальнейшего ответа о том, как извлечь этот архив, как только это будет сделано и перемещено на машину, оставив меня очень отвлекаться, когда может быть более прямое решение для начала
спасибо
9 ответов:
конструкция
userсборка Android (это то, что у вас есть на вашем телефоне, пока вы не разблокируете загрузчика, и вспышка телефона сuserdebugилиengпрограммное обеспечение) ограничивает доступ к Внутренний Накопитель - каждое приложение может получить доступ только к собственным файлам. К счастью для разработчиков программного обеспечения не готовы root их телефоны Google предоставляет способ доступа к Внутренний Накопитель на debuggable версии пакеты с использованием
принятый ответ больше не работает для меня (заблокирован 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 .
я опубликовал простой скрипт оболочки для сброса баз данных:
он выполняет два различных способов, описанных здесь:
- во-первых, он пытается сделать файл доступным для других пользователей, и пытаясь вытащить его из устройства.
- если это не удается, он передает содержимое файла через терминал на локальной машине. Он выполняет дополнительный трюк, чтобы удалить
\rсимволы, которые некоторые устройства выводят в оболочку.отсюда вы можете использовать различные приложения CLI или GUI SQLite, такие как
sqlite3илиsqlitebrowser, чтобы просмотреть содержимое базы данных.
Я не мог заставить ничего другого работать на меня, кроме этого:
adb shell run-as package.name cat /databases/databaseFileName.db > /sdcard/copiedDatabaseFileName.db exit exit adb pull /sdcard/copiedDatabaseFileName.db /file/location/on/computer/первый выход-это выход из run-as, второй выход-выход из оболочки adb для выполнения тяги.
для отладочной версии приложения очень удобно использовать команду
adb exec-out run-as xxx.yyy.zzz cat somefile > somefileдля извлечения одного файла. Но вы должны сделать несколько раз для нескольких файлов. Вот простой скрипт, который я использую для извлечения каталога.#!/bin/bash P= F= D= function usage() { echo "$(basename ) [-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 ] && printf f || printf d\"") echo $__t } function list_and_pull() { t=$(file_type ) if [ $t == d ]; then for f in $(adb shell run-as $P ls ) do # the carriage return output from adb shell should # be removed mkdir -p $(echo -e |sed $'s/\r//') list_and_pull $(echo -e /$f |sed $'s/\r//') done else echo pull file [ ! -e $(dirname ) ] && mkdir -p $(dirname ) $(adb exec-out run-as $P cat > ) 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в текущем справочник.
гораздо более простой подход для загрузки файла на ваш локальный компьютер:
в оболочке вашего ПК запустите:
adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>
Если кто-то ищет потянув базу данных из отладка приложения можно использовать следующую процедуру:
- поиск и открытие проводника файлов устройства
- выберите свой телефон, а затем перейдите к
data/dataкаталог
- теперь найдите свой пакет приложений и перейдите к папка базы данных. Вы можете увидеть базы данных там и по щелчку правой кнопкой мыши, вы получите опцию чтобы сохранить это на диск.
вот решение, которое работает на устройстве под управлением Android 5.1. Следующий пример предназначен для Windows.
вам нужен sed ([https://www.gnu.org/software/sed/manual/sed.html] или sed.exe на windows, например, от cygwin.) (На Unix, он просто будет там ;)). Чтобы удалить плохие символы '\r', по крайней мере, на windows.
теперь просто выполните следующую команду:
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.
конечно вы должны заменить "ком.ваша компания.yourapp" с именем пакета приложения и "YourDatabaseName" с именем базы данных в приложении.
если кто-то ищет другой ответ, который может быть использован для получения
Databaseа такжеShared Preferencesзатем выполните следующие действия:в своем
build.gradleфайл вашего приложения добавить строкуdebugCompile ' com.амитшехар.android: debug-db: 1.0.0'
теперь, когда вы запускаете свое приложение в
non-releaseрежим, то ваше приложение автоматически откроет 8080 порт с вашего устройстваIP addressубедитесь, что ваше устройство подключено черезwifiи свойlaptopобщий доступ та же сеть. Теперь достаточно просто зайти на адресдля просмотра всех данных базы данных вместе с общими предпочтениями.



Comments