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


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.