Как извлечь данные приложения с помощью adb без root [duplicate]

. Легкий способ решить OutOfMemoryError в java - увеличить максимальный размер кучи, используя опции JVM -Xmx512M, это немедленно решит ваш OutOfMemoryError. Это мое предпочтительное решение, когда я получаю OutOfMemoryError в Eclipse, Maven или ANT при построении проекта, потому что в зависимости от размера проекта вы можете легко исчерпать память.

Вот пример увеличения максимального размера кучи JVM , Также лучше сохранить -Xmx -Xms ration либо 1: 1, либо 1: 1.5, если вы задаете размер кучи в своем java-приложении.

export JVM_ARGS="-Xms1024m -Xmx1024m"

Ссылка Ссылка

86
задан Shadab Ansari 16 June 2016 в 23:02
поделиться

10 ответов

По дизайну user сборки Android (это то, что у вас есть на телефоне, пока вы не разблокируете загрузчик и не запустите телефон с программным обеспечением userdebug или eng) ограничивает доступ к Внутреннее хранилище - каждое приложение может иметь доступ только к своим собственным файлам. К счастью для разработчиков программного обеспечения, не желающих root , их телефоны 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
191
ответ дан Alex P. 19 August 2018 в 12:05
поделиться
  • 1
    Или просто используйте run-as, чтобы скопировать файл на место на внешнем хранилище и вытащить из него файл базы данных, а не вмешиваться в права доступа к файлам. – CommonsWare 4 July 2014 в 12:02
  • 2
    У Run-as нет разрешения на запись на sdcard - есть что-то новое с последним обновлением ... :( – slott 13 January 2015 в 12:09
  • 3
    Когда я запускаю оболочку adb & quot; run-as package.name chmod 666 /data/data/package.name/databases/file" adb завершает ошибку - & gt; run-as: exec failed для chmod666 Ошибка: разрешение отклонено. Я в Nexus 7 без root – Shudy 13 January 2015 в 13:02
  • 4
    Возможность записи на внешнюю SD-карту больше не возможна с помощью adb. – slott 13 January 2015 в 14:40
  • 5
    Если вы обнаруживаете, что возвращаете пустой или почти пустой файл, вы можете обнаружить, что файл является просто ошибкой из консоли, перенаправленной на этот файл, который вы создали. Частая проблема заключается в том, что вы пытаетесь скопировать БД из варианта выпуска вашего приложения. Вы можете копировать только DB из варианта Debug вашего приложения . Если это произойдет, просто установите вариант отладки и повторите попытку. Надеюсь, это поможет кому-то. – Aonghus Shortt 14 April 2017 в 18:02

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

2
ответ дан alijandro 19 August 2018 в 12:05
поделиться
  • 1
    даже для нескольких файлов это еще одна команда. проверьте обновление stackoverflow.com/a/18472135/1778421 , если вы предпочитаете, чтобы вы могли добавить еще один канал на стороне хоста, чтобы распаковать файлы – Alex P. 10 July 2017 в 08:35

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

В вашем ПК shell run:

adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>
1
ответ дан Emre 19 August 2018 в 12:05
поделиться

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

  1. искать и открывать файл файла Explorer

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

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

0
ответ дан Ifta 19 August 2018 в 12:05
поделиться

Принятый ответ больше не работает для меня (заблокирован 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 .
59
ответ дан marmor 19 August 2018 в 12:05
поделиться
  • 1
    Это должен быть новый правильный ответ OR @Alex P., вы должны добавить этот ответ для новых версий Android. Также в моем случае мне пришлось использовать 777 и применить его к каталогу базы данных сначала / как-то, прежде чем я смог получить доступ к файлу db. – muetzenflo 31 March 2015 в 09:10
  • 2
    Мое устройство укоренилось, но я обнаружил, что мне все еще нужно запустить su, чтобы команда run-as работала. – ThomasW 9 April 2015 в 08:26
  • 3
    Спасибо, работая над 5.1! – Muhammad Babar 14 August 2015 в 06:31
  • 4
    Что делать, если у вас нет SD-карты? – Gyum Fox 23 September 2015 в 12:19
  • 5
    если у вас нет SD-карты, все еще есть «sdcard», в любом случае. – treesAreEverywhere 23 September 2015 в 22:50

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

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

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

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

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

8
ответ дан Paul Lammertsma 19 August 2018 в 12:05
поделиться

Если кто-то ищет другой ответ, который можно использовать для извлечения 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
ответ дан Pradeep Kumar Kushwaha 19 August 2018 в 12:05
поделиться

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

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

0
ответ дан treesAreEverywhere 19 August 2018 в 12:05
поделиться

Я не мог заставить ничего для меня работать, но это:

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 сделать тягу.

5
ответ дан Triplee121 19 August 2018 в 12:05
поделиться
0
ответ дан dralexnumber 31 October 2018 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: