Cómo averiguar IDs o nombres de sistemas extraíbles (mapas de bits) precargados del volcado de memoria
Estoy analizando el uso de memoria de nuestra aplicación, y ha encontrado Drawables
extraños, que constantemente "come" unos pocos megabytes de montón. Aquí hay algunas capturas de pantalla de MAT :
Árbol dominador con 2 bitmaps bastante grandes
- Grilla 2D Array en lienzo de dibujo
- Agregar un círculo de cuadro redondo en mapa de bits redondeado
- Cómo crear relieve alrededor de un mapa de bits?
- Android fuera de la prevención de la memoria
- Carpetas BitmapFactory.decodeResource y drawable *
Ruta de acceso a las raíces de GC para uno de los mapas de bits anteriores
Estos mapas de bits siempre aparecen en volcados de montón de mi teléfono ( Samsung Galaxy Nexus, OS 4.1.1 ), no importa cuánto tiempo o cuánto uso intensivo de nuestra aplicación.
Ya he intentado buscar el origen de estos mapas de bits utilizando MAT – sin suerte. Toda la información útil que pude encontrar fue el width
y la height
de los mapas de bits, es tanto 512×512:
Pero nuestra aplicación no tiene ningún único 512×512 estirables. Supongo que esto es algunos "sistema" drawables. ¿Pero qué exactamente? ¿Por qué son tan grandes?
También he mirado el código fuente de la clase android.content.res.Resources
, buscando el uso del campo sPreloadedDrawables
– también sin suerte. Todo lo que obtengo del volcado de memoria – es la key
de la matriz sPreloadedDrawables
, pero no puedo determinar el nombre de archivo o el identificador de recursos de esta clave.
Entonces, mis preguntas son:
-
¿Cómo puedo determinar nombres o IDs de estos mapas de bits ?
-
Lo que para este enorme mapas de bits se cargan y por qué siempre se queda en la memoria ?
Actualización :
He encontrado una manera de mirar estos mapas de bits del volcado de la memoria . Estos dos mapas de bits son simples gradientes, uno negro, otro – blanco. Supongo que esto es recursos para los Holo.Light
de Holo.Light
y Holo.Dark
ICS. Pero mi segunda pregunta sigue siendo real: ¿por qué estos mapas de bits son siempre permanece en la memoria? ¿Hay alguna manera de cargar o reciclarlos?
- decodeStream devuelve null
- Decodificación y manipulación de imágenes mediante JNI en android
- Java.lang.OutOfMemoryError: tamaño de mapa de bits supera el presupuesto de VM en ListView y imágenes de carga perezosa
- Dibujar mapas de bits de recursos sobre otro
- Android: Uso de matriz para dibujar mapas de bits
- Cómo rotar el mapa de bits correctamente?
- ¿Cómo leer un archivo en un mapa de bits de Java?
- Redimensionar bitmap de Android manteniendo relación de aspecto
Esta foto de android.jar, que tienes que incluir en tu proyecto. Hay dos cuadrados con el gradiente vertical. El primero – de 0x000000 a 0x272d33, el segundo – de 0xe8e8e8 a 0xfafafa. Puedes encontrarlos en android.jar / res / drawable-nodpi / background_holo_dark.png y background_holo_light.png. Por supuesto, puedes obtener diferentes resultados dependiendo de tu versión de Android SDK.
Supongo que se quedan en la memoria porque son los fondos por defecto para las actividades. Trate de especificar un fondo diferente en su tema y ver si todavía están allí.
Los estirables precargados son cargados por Zygote.
ZygoteInit#preloadResources()
/** * Load in commonly used resources, so they can be shared across * processes. * * These tend to be a few Kbytes, but are frequently in the 20-40K * range, and occasionally even larger. */ private static void preloadResources() { final VMRuntime runtime = VMRuntime.getRuntime(); try { mResources = Resources.getSystem(); mResources.startPreloading(); if (PRELOAD_RESOURCES) { Log.i(TAG, "Preloading resources..."); long startTime = SystemClock.uptimeMillis(); TypedArray ar = mResources.obtainTypedArray( com.android.internal.R.array.preloaded_drawables); int N = preloadDrawables(runtime, ar); ar.recycle(); Log.i(TAG, "...preloaded " + N + " resources in " + (SystemClock.uptimeMillis()-startTime) + "ms."); startTime = SystemClock.uptimeMillis(); ar = mResources.obtainTypedArray( com.android.internal.R.array.preloaded_color_state_lists); N = preloadColorStateLists(runtime, ar); ar.recycle(); Log.i(TAG, "...preloaded " + N + " resources in " + (SystemClock.uptimeMillis()-startTime) + "ms."); } mResources.finishPreloading(); } catch (RuntimeException e) { Log.w(TAG, "Failure preloading resources", e); } }
Usted ve, los drawables precargados son com.android.internal.R.array.preloaded_drawables