. Легкий способ решить OutOfMemoryError
в java - увеличить максимальный размер кучи, используя опции JVM -Xmx512M
, это немедленно решит ваш OutOfMemoryError. Это мое предпочтительное решение, когда я получаю OutOfMemoryError в Eclipse, Maven или ANT при построении проекта, потому что в зависимости от размера проекта вы можете легко исчерпать память.
Вот пример увеличения максимального размера кучи JVM , Также лучше сохранить -Xmx -Xms ration либо 1: 1, либо 1: 1.5, если вы задаете размер кучи в своем java-приложении.
export JVM_ARGS="-Xms1024m -Xmx1024m"
По дизайну 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
Для отладочной версии приложения очень удобно использовать команду 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
, в текущий каталог.
Гораздо более простой подход для загрузки файла на ваш локальный компьютер:
В вашем ПК shell run:
adb -d shell 'run-as <package_name> cat /data/data/<package_name>/databases/<db_name>' > <local_file_name>
Если любой, кто ищет выталкивание базы данных из приложения отладки, может использовать следующую процедуру:
- искать и открывать файл файла Explorer
- Выберите свою трубку, а затем перейдите в каталог
data/data
- Теперь найдите свой пакет приложений и перейдите в папку баз данных. Вы можете увидеть базы данных и щелкнуть правой кнопкой мыши, вы получите возможность сохранить это на своем диске.
Принятый ответ больше не работает для меня (заблокирован 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 .
su
, чтобы команда run-as
работала.
– ThomasW
9 April 2015 в 08:26
Я опубликовал простой сценарий оболочки для сброса баз данных:
https://github.com/Pixplicity/humpty-dumpty-android
Он выполняет два разных метода, описанных здесь:
- Сначала он пытается сделать файл доступным для других пользователей и пытается вытащить его с устройства.
- Если это не удается, оно передает содержимое файла через терминал на локальный компьютер. Он выполняет дополнительный трюк, чтобы удалить символы
\r
, которые некоторые устройства выводят в оболочку.Здесь вы можете использовать различные приложения CLI или GUI SQLite, такие как
sqlite3
илиsqlitebrowser
, чтобы просмотреть содержимое базы данных.
Если кто-то ищет другой ответ, который можно использовать для извлечения Database
, а также Shared Preferences
, то выполните следующий шаг:
В вашем build.gradle
файле вашего приложения добавьте строку
debugCompile 'com.amitshekhar.android:debug-db:1.0.0'
теперь, когда вы запускаете свое приложение в режиме
non-release
, тогда ваше приложение будет автоматически откройте порт 8080 с вашего устройстваIP address
убедитесь, что ваше устройство подключено черезwifi
, а вашlaptop
использует одну и ту же сеть. Теперь просто зайдите на urlhttp: // your_mobile_device_ip: 8080 /
, чтобы просмотреть все данные базы данных вместе с общим предпочтения.
Вот решение, которое работает на устройстве под управлением 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» с именем базы данных в приложении.
Я не мог заставить ничего для меня работать, но это:
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 сделать тягу.
run-as
, чтобы скопировать файл на место на внешнем хранилище и вытащить из него файл базы данных, а не вмешиваться в права доступа к файлам. – CommonsWare 4 July 2014 в 12:02