Para ofrecer una experiencia de app fluida, estable y eficiente en cuanto al uso de la batería, es necesario identificar y resolver los cuellos de botella comunes del rendimiento en cuanto a la estabilidad, la renderización de la IU, el consumo de memoria, el trabajo en segundo plano, la latencia de inicio y la optimización de la compilación.
En las guías de esta sección, se explica el comportamiento subyacente de la plataforma de Android para cada tipo de problema y se describe cómo diagnosticarlos, generar perfiles y corregirlos con herramientas como Android Studio Profiler, Perfetto, Logcat y ApplicationExitInfo.
Estabilidad
- ANR: Diagnostica y corrige los errores de Aplicación no responde (ANR) causados por subprocesos de IU bloqueados, E/S del subproceso principal, contención de bloqueo o receptores de emisión lentos.
- Fallas: Lee los seguimientos de pila, inspecciona el resultado de Logcat y evita las excepciones no controladas y los indicadores nativos.
Renderización y arranque
- Renderización lenta: Identifica y corrige los fotogramas de IU congelados o que se omitieron (
>16msy>700ms) causados por diseños costosos, pases de vinculación o bloqueos del subproceso principal. - Sesiones lentas (solo para juegos):
Mide el ritmo de fotogramas con
SurfaceFlingery optimiza las velocidades de fotogramas de los juegos con Android Frame Pacing (Swappy), Vulkan y el framework de rendimiento dinámico de Android (ADPF). - Tiempo de inicio de la app: Comprende los aspectos internos de los inicios en frío, semicaliente y en caliente, mide el tiempo para la visualización inicial (TTID) y el tiempo para la visualización completa (TTFD), y optimiza el trabajo de inicio.
Administración de la memoria
- Procesos de eliminación de memoria insuficiente (LMK): Comprende cómo el daemon de optimización de poca memoria de Android (
lmkd) prioriza los procesos a través deoom_adj_scorey perfila el espacio de memoria en Android Studio, Unity y Unreal Engine. - Uso de memoria (RSS anónimo + espacio de intercambio): Mide y reduce el espacio en memoria del conjunto residente (RSS) anónimo y el espacio de intercambio de tu app en los estados de primer plano, servicio y segundo plano.
- Uso de memoria del mapa de bits: Diagnostica las asignaciones de mapas de bits con fugas o de tamaño excesivo, y libera los búferes gráficos cuando los componentes de la IU pasan a segundo plano.
Batería y trabajo en segundo plano
- Bloqueos de activación excesivos: Evita mantener bloqueos de activación parciales durante períodos prolongados y migra las tareas en segundo plano a
WorkManageroJobScheduler. - Bloqueos de activación sostenidos parciales: Asegúrate de que cada bloqueo de activación parcial adquirido se libere correctamente en todas las rutas de ejecución y de error.
- Activaciones excesivas: Reduce las alarmas exactas y agrupa o pospone el trabajo en segundo plano programado.
- Demasiadas búsquedas de Wi-Fi en segundo plano: Minimiza la frecuencia de las búsquedas de Wi-Fi en segundo plano y usa APIs de conectividad y ubicación pasivas o por lotes.
- Uso excesivo de la red en segundo plano:
Transfiere datos de la red móvil en segundo plano por lotes y de forma diferida con restricciones de
WorkManager. - Uso excesivo de la batería: Diagnostica el consumo excesivo de batería en dispositivos móviles y Wear OS creando perfiles de la actividad de la CPU, los sensores y la radio.
Permisos y optimización de la compilación
- Rechazos de permisos: Solicita permisos de tiempo de ejecución en contexto y explica claramente a los usuarios el motivo de los permisos.
- Optimización de código DEX: Configura las reglas de reducción, ofuscación y optimización de R8 para reducir el tamaño del DEX y mejorar el rendimiento del tiempo de ejecución.