Получение базы данных или любого другого файла из внутреннего хранилища с помощью функции запуска от имени


113

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

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

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



stackoverflow.com/questions/13006315 Извлечь базу данных без устройства для
рутирования

Ответы:


230

По дизайну 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

8
Или просто используйте, run-asчтобы скопировать файл в место на внешнем хранилище и вытащить оттуда файл базы данных, вместо того, чтобы возиться с разрешениями файла.
CommonsWare

5
У run-as нет разрешения на запись на SD-карту - с последним обновлением добавлено что-то новое ... :(
slott

4
Когда я запускаю adb shell "run-as package.name chmod 666 /data/data/package.name/databases/file" adb завершает мою ошибку -> run-as: exec failed for chmod666 Error: Permission denied. Я в Nexus 7 без рута
Shudy

2
Доступ для записи на внешнюю SD-карту больше невозможен с помощью adb.
slott

3
Если вы обнаружите, что получаете пустой или почти пустой файл, вы можете обнаружить, что это просто ошибка консоли, которая была перенаправлена ​​на этот файл, который вы создали. Частой проблемой здесь является то, что вы пытаетесь скопировать БД из варианта выпуска вашего приложения. Вы можете копировать БД только из отладочного варианта вашего приложения . Если это произойдет, просто установите вариант отладки и попробуйте команду еще раз. Надеюсь, это кому-то поможет.
Aonghus Shortt

73

Принятый ответ больше не работает у меня (заблокирован 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
Это должен быть новый правильный ответ ИЛИ @Alex P., вы должны добавить этот ответ для новых версий Android. Также в моем случае мне пришлось использовать 777 и сначала применить его к каталогу базы данных, прежде чем я смогу получить доступ к файлу db.
muetzenflo

1
Мое устройство внедрено, но я обнаружил, что мне все еще нужно запустить, suчтобы run-asкоманда заработала .
ThomasW

Что делать, если у вас нет SD-карты?
Gyum Fox

1
если у вас нет SD-карты, все равно остается каталог «sdcard».
treeAreEverywhere

1
Большой!. это сработало и для меня. Можем ли мы сделать пакетный файл / файл оболочки? просто передавая имя файла db как параметр, и у нас есть файл db.
Кадир Хуссейн

22

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

  1. поиск и открытие файлового проводника устройства

поиск и открытие файлового проводника устройства

  1. Выберите свой телефон и перейдите в data/dataкаталог

перейти в каталог данных / данных

  1. Теперь найдите пакет вашего приложения и перейдите в папку с базами данных. Вы можете увидеть базы данных там и щелкнув правой кнопкой мыши, вы получите возможность сохранить их на свой диск.

введите описание изображения здесь


1
Вау, намного проще и безопаснее по сравнению с использованием adb-shell
user1708860

9

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

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

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

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

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


Этот сценарий предназначен для отлаживаемых приложений, как насчет того, чтобы приложение не отлаживалось?
blueware

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

7

Я не мог заставить работать что-то еще, кроме этого:

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


3

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

Надеюсь, это будет полезно. Этот сценарий также доступен по адресу gist .

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

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

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


1
даже для нескольких файлов это всего лишь одна команда. проверьте обновление stackoverflow.com/a/18472135/1778421, если вы предпочитаете, чтобы вы также могли добавить еще один канал на стороне хоста для распаковки файлов
Alex P.

2

Намного более простой подход для загрузки файла на локальный компьютер:

В оболочке вашего ПК запустите:

adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>

Довольно близко, но это вытаскивает для меня искаженную базу данных.
Nae

1
#!/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.


0

Если кто-то ищет другой ответ, который можно использовать для получения, 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 /

для просмотра всех данных базы данных вместе с общими предпочтениями.


0

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

Вам нужен sed (или 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.

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


0

Файл базы данных пуст при использовании adb run-as. Это можно решить, вызвав close () для экземпляра RoomDatabase. Вызовите close (), чтобы позволить SQLite записать свой журнал на диск. Я создал эту кнопку, которая закрывает соединение с базой данных по запросу:

через GIPHY

Вот как вызвать close для экземпляра RoomDatabase.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.