Android Profiler es un conjunto de herramientas integradas en Android Studio para monitorizar el rendimiento de las aplicaciones en tiempo real. Permite rastrear la carga de la CPU, el consumo de memoria, el tráfico de red y el consumo de energía sin instalar bibliotecas de terceros. Según Android Developers, el perfilador está integrado directamente en el IDE y proporciona métricas con precisión de milisegundos para cualquier proceso en el dispositivo conectado.
Puntos clave
Android Profiler es un componente de Android Studio que reemplazó a las obsoletas Android Monitor y DDMS. Proporciona una interfaz unificada para perfilar todos los aspectos de una aplicación: CPU Profiler para el análisis del procesador, Memory Profiler para la gestión de la memoria, Network Profiler para las solicitudes de red y Energy Profiler para el consumo de energía. Los datos se recopilan automáticamente al iniciar una aplicación a través de Android Studio.
El perfilador funciona tanto en el emulador como en un dispositivo físico conectado por USB. Según Google I/O 2023, Android Profiler se utiliza en más del 70% de los proyectos de Android y se considera la herramienta estándar de diagnóstico de rendimiento. La principal ventaja sobre las soluciones de terceros es la integración cero: no es necesario añadir dependencias en build.gradle ni modificar el código de la aplicación.
La arquitectura de Android Profiler está construida sobre Perfetto, el rastreador de sistema de Android que recopila datos a nivel de kernel y de aplicación. Perfetto proporciona una sobrecarga mínima (menos del 1% de CPU) y admite grabaciones de larga duración de hasta 30 minutos. Esto permite perfilar no solo operaciones rápidas sino también escenarios prolongados: transiciones entre pantallas, sincronización en segundo plano, consumo de memoria durante una hora de uso.
El perfilador recopila cuatro tipos de datos: CPU — carga por núcleo e hilo, Memory — Java Heap, Native Heap, Stack, Graphics, Network — todas las solicitudes entrantes y salientes, Energy — categorías de consumo de energía (Idle, Light, Medium, Heavy). Los datos están sincronizados en una línea de tiempo para que puedas ver simultáneamente cómo los cambios en la CPU afectan a la memoria y al consumo de energía.
CPU Profiler muestra la carga del procesador en tiempo real en una línea de tiempo, desglosada por hilos de la aplicación. Cada hilo está representado por una línea o área de color: cuanto más ancha es el área, más tiempo de CPU consume el hilo. Las áreas rojas indican trabajo de la aplicación, las azules indican llamadas al sistema y las grises indican espera.
Para un análisis detallado, CPU Profiler admite tres modos de grabación: Trace Java Methods (rastreo de todos los métodos Java), Trace C/C++ Functions (rastreo de funciones nativas NDK) y Sample Java Methods (muestreo, modo recomendado). El muestreo proporciona la menor sobrecarga y es adecuado para la creación de perfiles diaria, mientras que el rastreo completo se utiliza para encontrar problemas complejos.
// Ejemplo: el análisis de CPU Profiler mostrará este método como un cuello de botella
class DataProcessor {
suspend fun processLargeDataset(items: List<Item>): List<Result> {
// CPU Profiler mostrará una alta carga de CPU en inBackgroundThread
return withContext(Dispatchers.Default) {
items.map { it.computeHeavyTransformation() }
}
}
}
// Recomendación después de la creación de perfiles:
// computeHeavyTransformation consume el 80% del tiempo — almacenamos en caché el resultado
class DataProcessorOptimized {
private val cache = LruCache<String, Result>(100)
suspend fun processLargeDataset(items: List<Item>): List<Result> {
return withContext(Dispatchers.Default) {
items.mapNotNull { cache.get(it.id) ?: it.computeHeavyTransformation().also { cache.put(it.id, it) } }
}
}
}
Después de la grabación, CPU Profiler muestra un Top-Down Tree (árbol de arriba a abajo) con el tiempo de ejecución de cada método. Presta atención a la columna Self Time/Total: si el Self Time de un método supera los 16 ms y se llama desde el hilo de UI, esto garantiza una pérdida de fotograma. La solución es mover los cálculos pesados a un hilo en segundo plano usando Dispatchers.IO o Default.
Sample Java Methods — modo recomendado para la creación de perfiles diaria con una sobrecarga del 3-5%. Trace Java Methods — rastreo completo de cada llamada, sobrecarga de hasta el 15%, se usa para grabaciones cortas (5-10 segundos). Trace C/C++ Functions — rastreo de código NDK a través de Linux Perf, indispensable para analizar juegos y bibliotecas en C++. Cambia los modos según el tipo de problema.
Memory Profiler rastrea todas las categorías de memoria de una aplicación: Java Heap (objetos JVM), Native Heap (asignaciones C/C++ a través de JNI), Stack (pilas de hilos) y Graphics (texturas, búferes de GPU). La visualización principal es un gráfico temporal del consumo de memoria donde cada categoría se muestra en su propio color. Si el gráfico no disminuye después de la recolección de basura, sospecha una fuga.
Para encontrar fugas, usa la función Capture Heap Dump. En el momento del volcado, Android Profiler pausa la aplicación durante ~100 ms y crea un archivo HPROF, una instantánea completa de todos los objetos vivos de Java Heap. Después de abrir el volcado, puedes ordenar los objetos por Retained Size (la cantidad de memoria que se liberará al eliminar el objeto) y buscar instancias de Activity, Fragment o Bitmap que deberían haber sido destruidas.
Según Google I/O 2022, Memory Profiler combinado con LeakCanary cubre el 95% de los escenarios de detección de fugas de memoria en Android. LeakCanary funciona automáticamente: detecta fugas en segundo plano. Memory Profiler es necesario para el análisis manual: ves la imagen completa de las asignaciones, no solo las fugas.
| Categoría de memoria | Descripción | Tamaño típico |
|---|---|---|
| Java Heap | Heap de JVM: objetos Kotlin/Java | 5–200 MB |
| Native Heap | Asignaciones a través de JNI, NDK | 1–100 MB |
| Graphics | Texturas, búferes de GPU | 10–200 MB |
| Stack | Pilas de todos los hilos | 1–10 MB |
Después de capturar el volcado, ordena los objetos por Retained Size (tamaño retenido): esta es la cantidad de memoria que se liberará al eliminar el objeto. Busca instancias de Activity, Fragment y Bitmap con un gran Retained Size que no deberían estar en memoria. Ve a la pestaña Reference Tree para ver la cadena de referencias que mantienen el objeto, generalmente un campo estático de un singleton o un callback no limpiado. Una métrica importante es Allocation rate (tasa de asignación, número de asignaciones por segundo). Si la tasa de asignación supera los 10 000 objetos/s, la aplicación dedica demasiado tiempo a crear y eliminar objetos temporales, lo que sobrecarga el GC y causa microcongelaciones. En este caso, usa View Inspector y encuentra los lugares con creación frecuente de objetos en bucles.
Network Profiler muestra todas las solicitudes de red de la aplicación en tiempo real en una línea de tiempo. Cada solicitud se muestra como una barra horizontal: su longitud corresponde al tiempo de ejecución y su color al tipo de solicitud (GET, POST, PUT, DELETE). Desplazando la línea de tiempo puedes ver cómo se distribuyen las solicitudes en el tiempo y si están duplicadas.
Todas las bibliotecas populares son compatibles: OkHttp, Retrofit, Volley, Ktor. Para Ktor y OkHttp, el perfilador muestra la pila de llamadas completa, incluidos los interceptores y convertidores. Para cada solicitud, están disponibles Request Headers y Response Headers, el cuerpo de la respuesta (hasta 1 MB), el código de estado y la duración.
Problemas típicos identificados por Network Profiler: falta de almacenamiento en caché (la misma URL se solicita en cada apertura), solicitudes duplicadas (dos componentes cargan simultáneamente los mismos datos), tamaño de respuesta excesivo (el servidor devuelve 5 MB cuando se necesitan 50 KB). Network Profiler te ayuda a ver estos problemas literalmente de un vistazo a la línea de tiempo.
Para emular redes lentas, usa Network Conditioning en Android Studio: te permite limitar el ancho de banda a 3G/2G y añadir latencia. Esto es críticamente importante para probar el comportamiento de la aplicación en condiciones de red deficientes, especialmente para aplicaciones que operan en regiones con internet inestable.
Energy Profiler evalúa el impacto de la aplicación en la carga de la batería basándose en los datos de Perfetto. La herramienta no mide el consumo real en miliamperios, sino que clasifica cada operación en una de cinco categorías de consumo de energía: Idle, Light, Medium, High y Overloaded. La línea de tiempo de Energy Profiler está codificada por colores: verde (carga ligera), amarillo (media), rojo (alta).
Las principales causas de las zonas rojas: WakeLock (la aplicación mantiene el procesador activo), Location GPS (solicitudes constantes de coordenadas de alta precisión), conexiones Keep-Alive (intercambio frecuente de datos con el servidor), transferencias de datos grandes (subida de archivos, streaming). Energy Profiler muestra con precisión qué operación causó el pico de consumo de energía en cada momento.
Según Android Developers, una aplicación típica no debería pasar más del 5% del tiempo en la categoría High. Si Energy Profiler muestra zonas rojas durante más del 10% del tiempo de perfilado, la aplicación no superará la revisión según el criterio de consumo de batería. Recomendación: usa WorkManager para tareas en segundo plano, limita las solicitudes de Location a la precisión mínima necesaria y agrupa las solicitudes de red en lotes.
Iniciar Android Profiler es cuestión de un clic: en Android Studio abre View → Tool Windows → Profiler o haz doble clic en el icono de Profiler en el panel derecho. Después de iniciar la aplicación en el dispositivo conectado, Android Studio se conectará automáticamente al proceso y comenzará a recopilar datos. Los gráficos de CPU, Memory, Network y Energy aparecerán inmediatamente en la línea de tiempo.
Para un análisis detallado, selecciona la pestaña deseada (CPU, Memory, Network o Energy) y comienza la grabación. Para CPU, recomiendo el modo Sample Java Methods con una duración de grabación de 30 segundos, suficiente para un escenario típico. Para Memory, captura un volcado de heap después de completar el escenario (Capture Heap Dump). Para Network, la grabación se inicia automáticamente, solo presiona el botón Stop al finalizar el escenario.
Después de detener la grabación, exporta los datos: File → Save As guarda toda la sesión en un archivo .perf. Esto es conveniente para comparar métricas antes y después de la optimización. Crea una sesión de referencia (baseline) en la primera versión estable y compara cada nueva sesión con ella: esta es la única manera de evaluar objetivamente los cambios de rendimiento.
Android Profiler se puede ejecutar desde la línea de comandos a través de Android Studio CLI y Firebase Test Lab. Firebase Test Lab admite la creación de perfiles de rendimiento como parte de las pruebas de UI: obtienes métricas de CPU, Memory y Network junto con el resultado de la prueba. Configura el pipeline para que si las métricas caen un 10% respecto a la referencia, el pipeline de CI se bloquee hasta que un desarrollador lo revise.
Preguntas frecuentes
El impacto es mínimo. Android Profiler usa Perfetto para la recopilación de datos, que añade menos del 1% de sobrecarga de CPU. En el modo Sample Java Methods, la sobrecarga es de aproximadamente el 3-5%, lo que no es significativo para la creación de perfiles por escenarios. El rastreo completo de métodos puede dar hasta un 15% de sobrecarga, por lo que solo se usa para grabaciones cortas.
Sí, las trazas del sistema se pueden grabar a través de Perfetto CLI directamente desde el dispositivo: adb shell perfetto --out /data/local/tmp/trace.perf. Luego abre el archivo en la interfaz de Perfetto UI (ui.perfetto.dev) o impórtalo en Android Studio para verlo con el marcado completo de la aplicación.
Android Profiler es una herramienta del sistema que no requiere configuración de proxy. Muestra las solicitudes directamente en el IDE en el contexto del rendimiento. Charles Proxy es un servidor proxy externo que proporciona un análisis más detallado (intercepción de tráfico, modificación de solicitudes, reenvío). Para la creación de perfiles de rendimiento, usa Android Profiler; para el análisis de contratos de API, usa Charles.
Toma un volcado de heap antes de ejecutar un escenario (por ejemplo, antes de abrir una Activity). Ejecuta el escenario: abre la Activity y ciérrala. Toma un segundo volcado. Compara el número de instancias de Activity vivas: si hay más en el segundo volcado, es una fuga. Ordena por Retained Size, encuentra las instancias de Activity sobrantes y revisa el Reference Tree para determinar la causa.
Energy Profiler requiere soporte de Power Profiles a nivel de dispositivo y Android 8.0+. Los datos pueden faltar en emuladores y algunos firmwares (especialmente los chinos). Solución: perfila el consumo de energía en dispositivos de referencia como Pixel o Samsung con firmware Android limpio.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también