2011-02-22 11 views
7

Estoy desarrollando una aplicación que contiene muchas imágenes. Me he dado cuenta de que el uso de la memoria de mi aplicación es bastante mayor en Android 2.3 que en Android 2.2, lo que finalmente da como resultado errores OutOfMemory mientras que carga mapas de bits. Al investigar esto, registré el resultado de Debug.getNativeHeapAllocatedSize() en el onResume de la primera actividad . En Android 2.2, esto produce 5MB. En Android 2.3, este emite 17MB.Uso de memoria entre Android 2.2 y 2.3

Creé una aplicación de muestra para tratar de reducir aún más esto. La aplicación de muestra tiene 2 actividades: la primera tiene una imagen pequeña y un botón para iniciar la segunda actividad; la segunda actividad tiene varias imágenes grandes en ScrollView. Puede descargar la muestra aquí: http://dl.dropbox.com/u/21709517/MemoryUsageExample.zip Al ejecutar este ejemplo, Debug.getNativeHeapAllocatedSize() informa 3MB asignados después de iniciar la primera actividad tanto en 2.2 como 2.3. Después de iniciar la segunda actividad, Android 2.2 todavía informa 3MB asignado, mientras que Android 2.3 reporta 17 MB asignados. La ejecución de "adb shell dumpsys meminfo test.example" muestra los mismos tipos de resultados.

¿Por qué hay una diferencia tan dramática entre Android 2.2 y 2.3? Y más importante aún, ¿qué debo hacer de forma diferente para evitar que use tanta memoria en Android 2.3?

----- ----- ACTUALIZACIÓN

Después de mirar la información publicada Romain individuo, me decidí a hacer un poco más jugando con las distintas opciones de carga. El resultado muestra que forzar que las imágenes se carguen como RGB_565 reduce la memoria en Android 2.3, sin embargo, todavía usa más de 2.2. En mi aplicación de ejemplo, Android 2.3 ahora usa 10MB vs Android 2.2 usando 3MB. Además, traté de forzar 32 bits usando ARGB_8888. En este caso, Android 2.3 usa 17 MB, pero Android 2.2 solo usa 3 MB. La muestra actualizada se puede encontrar aquí: http://dl.dropbox.com/u/21709517/MemoryUsageExample2.zip

¿Cuál es la causa de estas diferencias? ¿Hay algo más que se debe hacer para que el uso de la memoria se aproxime más a Android 2.2? Además, ¿hay alguna manera de forzar imágenes creadas mediante diseños xml en un formato particular? ¿Se puede establecer esto en toda la aplicación? Gracias.

ACTUALIZACIÓN ----- ----- 2

Según this thread, no es posible forzar imágenes cargadas a través de la inflación xml ser un formato particular.

Todavía estoy esperando una respuesta sobre por qué Android 2.2 y Android 2.3 usan diferentes cantidades de memoria después de forzar 16 o 32 bits.

+0

Algo es dudoso aquí, estoy teniendo el mismo problema. 2.3 es un desastre para mi aplicación de manipulación de imágenes: http://stackoverflow.com/questions/5871143/android-2-3-has-lower-vm-budget-than-2-1-and-2-2 – Lumis

Respuesta

6

Android 2.3 carga imágenes en 32 bits de forma predeterminada ahora. Puede forzar el formato de 16 bits utilizando BitmapFactory.Options.

Ver http://www.curious-creature.org/2010/12/04/gingerbread-and-32-bits-windows/ y http://www.curious-creature.org/2010/12/08/bitmap-quality-banding-and-dithering/

+1

¡Gracias! Eso lo explica. Hubiera sido agradable si esto se mencionara en las notas de la versión de Android 2.3. – Jeff

+0

¿Hay alguna manera de elegir el formato de las imágenes cargadas durante el inflado de un diseño XML? – Jeff

+0

Puede haber dado un salto al aceptar una respuesta. Ver mi actualización arriba. – Jeff

0

Mi conjetura es que. El sistema operativo Android precarga algunas imágenes en el montón nativo. La cantidad de imágenes precargadas depende del presupuesto de VM de sistema operativo para cada proceso. Como 2.3 aumentó el presupuesto de VM a 32M, precargó más imágenes para cada proceso que en 2.2 dispositivos. Por lo tanto, vio más uso de heap nativo en 2.3. Esta es solo mi suposición.

Cuestiones relacionadas