У меня есть приложение «Живые обои», в котором используются фотографии, загруженные из Интернета, для использования в качестве обоев.Использование памяти приложения для приложений Android слишком велико (как сообщают менеджеры памяти)
Менеджеры памяти показывают, что мое приложение использует от 90 МБ до 120 МБ (это устройство с 1 ГБ ОЗУ). Это много. Служба обои get часто убивается, а иногда система даже возвращается к статическим обоям по умолчанию.
Хотя я тщательно проверил все утечки памяти и анализ дампа HPROF показал, что у меня есть только 2 больших объекта: в настоящее время используется растровое изображение для обоев (16 МБ - и это ожидается для изображения 4Mpix) и класса android.content. res.Resource (12 МБ) с общим объемом 32 МБ, как описано в обзоре HPROF.
dumpsys MemInfo показывает это:
** MEMINFO in pid 1354 [com.myapp.lwp] **
Shared Private Heap Heap Heap
Pss Dirty Dirty Size Alloc Free
------ ------ ------ ------ ------ ------
Native 16 16 16 112304 5274 993
Dalvik 41947 19316 41428 74572 53120 21452
Cursor 0 0 0
Ashmem 0 0 0
Other dev 20170 33176 3460
.so mmap 5690 2620 1504
.jar mmap 0 0 0
.apk mmap 64 0 0
.ttf mmap 6 0 0
.dex mmap 604 0 4
Other mmap 1035 300 272
Unknown 5127 472 5116
TOTAL 74659 55900 51800 186876 58394 22445
Objects
Views: 27 ViewRootImpl: 0
AppContexts: 4 Activities: 1
Assets: 3 AssetManagers: 3
Local Binders: 16 Proxy Binders: 23
Death Recipients: 0
OpenSSL Sockets: 1
Я прочитал это: How do I discover memory usage of my application in Android?, но это не поможет мне сделать вывод, что угодно ...
Я также использовал:
cat /proc/1354/statm
139422 29326 11550 2 0 10330 0
It тоже не помогает.
DDMS показывает размер кучи 63 МБ.
Мои вопросы есть? Является ли это нормальным и ожидаемым от приложения, которое имеет дело с изображениями двойного размера экрана? Если нет, то что осталось в 60-90 МБ? (i subctract 30MB, что HPROF дал мне для общего). Что я могу сделать неправильно в своем приложении, чтобы использовать столько памяти? Что приложение actualy сделать:
1) Download list of photos (max 100) as JSON string and parse that string to get ids and urls for these photos.
2) Download first photo and save it to cache folder
3) Decode photo and if necessary resize it to fit 2Width*Height of screen (photos are actualy smaller that my Full HD screen).
4) Draw it on wallpaper canvas (and draw repeatedly while user is scrolling)
5) If on WIFI download next 10 photos to cache folder (without decoding, just saving)
У меня есть другие режимы более сложные с большим количеством фотографий одновременно используются, но выше памятей использования для наиболее простого сценария.
Это не проблема непрерывного использования - память описана после первого запуска: Если я убью службу, после перезагрузки она использует 90 МБ. После первого открытия экрана параметров (небольшая активность/диалог с несколькими вариантами выбора - без графики, кроме фоновых рисунков), использование памяти переходит на 124 МБ и возвращается к 112 МБ после закрытия экрана. После первой смены обоев фото он перескакивает до 130+ и возвращается к 120+. Вероятно, потому что размер кучи увеличивается при декодировании растрового изображения, а затем остается таким.
Что мне делать? Как уменьшить (если вообще возможно) объем памяти моего приложения? Где еще смотреть? Я не ожидаю готового решения, но любые дальнейшие рекомендации могут помочь ...