Android ADB, получить базу данных с помощью запуска от имени

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

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

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

10 ответов

Решение

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

Принятый ответ больше не работает для меня (заблокирован 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 .

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

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

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

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

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

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

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

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

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

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

  1. Сначала он пытается сделать файл доступным для других пользователей и пытается извлечь его из устройства.
  2. Если это не удается, он передает содержимое файла через терминал на локальный компьютер. Выполняет дополнительный трюк для удаления \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 $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в текущий каталог.

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

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

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

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

через GIPHY

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

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

Действия по извлечению базы данных приложения (установленной в режиме отладки) с устройства

Закройте соединение с БД, если оно открыто

Откройте cmd (командная строка) (измените каталог на свой путь adb)

компакт-диск C: \ Program Files (x86) \ Android \ android-sdk \ platform-tools

(перечислить файлы приложения)

adb -d shell "запускать как com.xyz.name ls/data/data/com.xyz.name/files/"

(скопируйте нужный файл на sdcard)

adb -d shell "run-as com.xyz.name cp /data/data/com.xyz.name/files/abc.db /sdcard/abc.db"

(скопируйте с SD-карты в папку adb машины)

adb pull /sdcard/abc.db

Открытое соединение с БД

Путь к конечному файлу в моем случае C:\Users{userName}\AppData\Local\VirtualStore\Program Files (x86)\Android\android-sdk\platform-tools или хранилище устройства

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

смотреть все данные базы данных вместе с общими настройками.

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

Вам нужен sed ([ https://www.gnu.org/software/sed/manual/sed.html] или 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" на имя базы данных в приложении.

Другие вопросы по тегам