Отримайте базу даних або будь-який інший файл із внутрішнього сховища за допомогою run-as


113

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

Чи є команда з цієї частини оболонки adb download copyчи moveкоманда? Я хотів би завантажити файл бази даних і переглянути його вміст за допомогою браузера бази даних.

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



stackoverflow.com/questions/13006315 Витягніть базу даних без пристрою для вкорінення
Naveen Prince P

Відповіді:


230

За допомогою дизайну userAndroid (це те, що у вас є на телефоні, поки ви не розблокуєте завантажувач і спалах телефону 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 немає дозволу писати на sdcard - додано щось нове з останнім оновленням ... :(
slott

4
Коли я запускаю оболонку adb "run-as package.name chmod 666 /data/data/package.name/databases/file" adb закінчує мені помилку -> run-as: exec не вдалося chmod666 Помилка: Дозвіл відхилено. Я в Nexus 7 без кореня
Шуді

2
Доступ до зовнішньої sd-карти за допомогою adb більше неможливий.
слот

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".
дереваAreEverywhere

1
Чудово !. це працювало і для мене. Чи можемо ми зробити пакетний / оболочний файл? просто передаючи ім'я файлу db як парам, і у нас є файл db.
Кадір Хуссей

22

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

  1. пошук і відкриття провідника файлів пристрою

пошук і відкриття провідника файлів пристрою

  1. Виберіть свою трубку та перейдіть до data/dataкаталогу

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

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

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


1
Нічого собі, набагато простіше і безпечніше порівняно з використанням adb-shell
user1708860

9

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

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

Він виконує два різних методи, описані тут:

  1. По-перше, він намагається зробити файл доступним для інших користувачів та намагається витягнути його з пристрою.
  2. Якщо це не вдається, він передає вміст файлу через термінал на локальну машину. Він виконує додатковий трюк для видалення\r символів, які деякі пристрої виводять у оболонку.

Звідси ви можете використовувати різноманітні програми CLI або GUI SQLite, такі як 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/

Перший вихід - це вихід з прогону, а другий вихід - вихід з оболонки 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

Сподіваюся, це буде корисним. Цей сценарій також доступний у суті .

Типовим є використання

$ ./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>

Досить близько, але це витягує неправильний db для мене.
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

Ось як викликати закриття в екземплярі RoomDatabase.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.