android adb, получение базы данных с помощью run-as



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



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



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



спасибо

845   9  

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 .

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

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 ) [-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>

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

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

search and open device file explorer

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

go to data/data directory

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

enter image description here

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

http://your_mobile_device_ip:8080/

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

Comments

    Ничего не найдено.