Android adb, извлекает базу данных, используя run-as
На нерутируемом устройстве Android я могу перейти к папке с данными, содержащей базу данных, используя команду run-as
с именем моего пакета. Большинство типов файлов меня устраивает только с просмотром, но с базой данных я бы хотел вытащить, если с андроид устройства.
Есть ли download
copy
или move
команды из этой части ADB оболочки? Я хотел бы скачать файл базы данных и просмотреть его содержимое с помощью браузера базы данных.
Один из ответов здесь заключается в том, чтобы превратить весь пакет приложения в сжатый архив, но больше нет ответа на вопрос о том, как извлечь этот архив после того, как это будет сделано и перенесено на компьютер, поэтому я очень отвлечен, когда для начала может быть более прямое решение.
Ответы
Ответ 1
По дизайну user
сборка Android (то, что у вас на телефоне, пока вы не разблокируете загрузчик и не запустите телефон с помощью программного обеспечения userdebug
или eng
), ограничивает доступ к внутреннему хранилищу - каждое приложение может получить доступ только его собственные файлы. К счастью для разработчиков программного обеспечения, не желающих запускать свои телефоны, 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
Ответ 2
Принятый ответ больше не работает для меня (заблокирован 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 .
Ответ 3
Если кто-то ищет извлечение базы данных из отладочного приложения, используйте следующую процедуру:
- поиск и открытие файлового устройства устройства
![search and open device file explorer]()
- Выберите телефон и перейдите в каталог
data/data
![go to data/data directory]()
- Теперь найдите свой пакет приложений и перейдите в папку баз данных. Вы можете увидеть базы данных там и, щелкнув правой кнопкой мыши, вы получите возможность сохранить их на своем диске.
![enter image description here]()
Ответ 4
Я опубликовал простую оболочку script для сброса баз данных:
https://github.com/Pixplicity/humpty-dumpty-android
Он выполняет два различных метода, описанных здесь:
- Сначала он пытается сделать файл доступным для других пользователей и пытается вытащить его с устройства.
- Если это не удается, оно передает содержимое файла через терминал на локальный компьютер. Он выполняет дополнительный трюк, чтобы удалить символы
\r
, которые некоторые устройства выводят в оболочку.
Здесь вы можете использовать различные приложения CLI или GUI SQLite, такие как sqlite3
или sqlitebrowser
, для просмотра содержимого базы данных.
Ответ 5
Я не мог заставить что-то другое работать для меня, но это:
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, чтобы выполнить pull.
Ответ 6
Для отладочной версии приложения очень удобно использовать команду adb exec-out run-as xxx.yyy.zzz cat somefile > somefile
для извлечения одного файла. Но вы должны делать несколько раз для нескольких файлов. Вот простой script, который я использую для извлечения каталога.
#!/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
Надеюсь, это будет полезно. Этот script также доступен на gist.
Типичное использование
$ ./exec_out.sh -p com.example.myapplication -d databases
то он будет извлекать все файлы в каталоге баз данных ваших приложений, который является /data/data/com.example.myapplication/databases
, в текущий каталог.
Ответ 7
Значительно простой способ загрузки файла на локальный компьютер:
В оболочке вашего ПК:
adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>
Ответ 8
Здесь решение, которое работает на устройстве под управлением Android 5.1. Следующий пример для Windows.
Вам нужен sed (или sed.exe на windows, например, из 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" на имя базы данных в приложении.
Ответ 9
Если кто-то ищет другой ответ, который можно использовать для получения Database
а также Shared Preferences
выполните следующие действия:
В вашем файле build.gradle
вашего приложения добавьте строку
debugCompile 'com.amitshekhar.android:debug-db:1.0.0'
теперь, когда вы запускаете свое приложение в режиме non-release
ваше приложение автоматически открывает порт 8080 с IP address
вашего устройства, чтобы убедиться, что ваше устройство подключено через wifi
а ваш laptop
находится в той же сети. Теперь просто посетите URL
Http://your_mobile_device_ip: 8080/
просматривать все данные базы данных вместе с общими настройками.
Ответ 10
#!/bin/bash
#export for adb
export PATH=$PATH:/Users/userMe/Library/Android/sdk/platform-tools
export PATH=$PATH:/Users/userMe/Library/Android/sdk/tools
adb -d shell 'run-as com.android.app cp /data/data/com.android.app/files/db.realm /sdcard'
adb pull sdcard/db.realm /Users/userMe/Desktop/db
Вы можете использовать этот скрипт для получения базы данных Realm.
Ответ 11
Файл базы данных emtpy при использовании adb run-as
. Это можно решить, вызвав close() для экземпляра RoomDatabase. Вызовите close(), чтобы позволить SQLite записать свой журнал на диск. Я создал эту кнопку, которая закрывает соединение с базой данных по запросу:
через GIPHY
Вот как вызвать close для экземпляра RoomDatabase.