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 Árbol dominador con 2 bitmaps bastante grandes

Path_to_gc_roots 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: Bitmap_info

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?

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

  • Captura toda la vista de desplazamiento más grande que la pantalla
  • Obtener imagen Blob y convertir esa imagen en imagen de mapa de bits
  • Aplicación lenta con imagen de fondo
  • Android - Desvanece imagen de mapa de bits en lienzo
  • Recortar mapa de bits sin leer todo el mapa de bits primero
  • ¿Mejor velocidad de cuadro que dibuja los mapas de bits en una lona?
  • PorterduffXfermode: borra una sección de un mapa de bits
  • Cambiar el tamaño de un mapa de bits a un valor fijo, pero sin cambiar la relación de aspecto
  • Visualización de imagen de mapa de bits en Android (OpenCV)
  • Android - Lienzo drawLine dentro de ImageView
  • Android - Configuración de bitmap.createScaledBitmap () Configuración a ARGB_8888
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.