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