У меня серьезные проблемы с памятью в моем приложении [1]. Чтобы исследовать это, я сделал кучу дампов своего приложения в разных состояниях. Я видел, что некоторые растровые изображения занимают огромное количество памяти. Я написал небольшую утилиту [2], которая декодирует байтовые массивы в файлы растровых изображений Windows (.bmp), чтобы я мог просматриватьрастровые изображения и сравнивать их с файлами, имеющимися у меня в res/ папка drawable
.
Я обнаружил, что все мои файлы подвергаются двойной передискретизации.
Сначала я проверил самый большой из них: буфер массива байтов размером более 9 МБ в куче, который был декодирован в красивое изображение 1920x1280, в то время как исходный файл был PNG-файлом 960x640.
Я попробовал второй по величине, более 3 МБ, который после декодирования показал хорошее изображение 754x1200, исходный размер был... угадайте, что? Хороший jpg файл 377x600.
Что дает?
Я включил аппаратное ускорение в своем файле манифеста Android (хотя я не уверен, что мне это действительно нужно, я просто использую некоторые базовые представления и действия).
У меня Android 4.0.2 на GSM Galaxy Nexus (якью). Я получаю отзывы от своих тестировщиков, что проблема присутствует на их Nexus S версии 4.0.3, хотя я еще не мог проверить их дампы кучи.
Здесь я пытаюсь сэкономить память, если Android удваивает все, неудивительно, что приложение быстро падает, потому что использование кучи становится слишком большим (около 64 МБ в моем случае). Я надеюсь, что есть причина и способ обойти это.
Ссылки: