Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Configuración de RAM baja

Android admite dispositivos con 512 MB de RAM. Esta documentación está destinada a ayudar a los OEM a optimizar y configurar el kernel de Android 4.4 para dispositivos con poca memoria. Varias de estas optimizaciones son lo suficientemente genéricas como para que se puedan aplicar también a versiones anteriores.

Optimizaciones de la plataforma del kernel de Android 4.4

Gestión de memoria mejorada

  • Configuraciones de kernel de ahorro de memoria validadas: cambie a zram.
  • Detenga los procesos en caché si están a punto de quitarse de la caché y son demasiado grandes.
  • No permita que los servicios grandes se coloquen de nuevo en la clasificación de Servicios A (para que no puedan hacer que se detenga el lanzador).
  • Detenga los procesos (incluso los normalmente imparables, como el IME actual) que se vuelven demasiado grandes en el mantenimiento inactivo.
  • Serializar el lanzamiento de servicios en segundo plano.
  • Ajuste el uso de la memoria de los dispositivos con poca RAM: niveles de ajuste de memoria insuficiente (OOM) más estrictos, cachés de gráficos más pequeños.

Memoria del sistema reducida

  • Recortado system_server los procesos del sistema de interfaz de usuario y (guardado varios megabytes).
  • Caches dex precargados en Dalvik (ahorraron varios megabytes).
  • Opción validada de JIT-off (ahorra hasta 1,5 MB por proceso).
  • Reducción de la sobrecarga de la caché de fuentes por proceso.
  • Introducido ArrayMap / ArraySet y utilizado ampliamente en marco como un reemplazo más ligero-huella para HashMap / HashSet .

Procstats

Se agregó una opción de desarrollador para mostrar el estado de la memoria y el uso de la memoria de la aplicación clasificados según la frecuencia con la que se ejecutan y la cantidad de memoria consumida.

API

Agregado ActivityManager.isLowRamDevice() para permitir aplicaciones para detectar cuando se ejecuta en dispositivos con poca memoria y elegir deshabilitar características de gran RAM.

Seguimiento de la memoria

Añadido HAL memtrack el seguimiento de las asignaciones de memoria de gráficos, información adicional en dumpsys meminfo, resúmenes aclaradas en meminfo (por ejemplo, informó RAM libre incluye memoria RAM de procesos en caché, por lo que los OEM no tratan de optimizar las cosas mal).

Configuración en tiempo de construcción

Indicador de dispositivo de RAM baja

El ActivityManager.isLowRamDevice() indicador determina si las aplicaciones deben desactivar las funciones específicas que requieren mucha memoria que el trabajo mal en dispositivos con poca memoria.

Para los dispositivos 512 MB, se espera que esta bandera para volver true . Se puede habilitar mediante la siguiente propiedad del sistema en el archivo MAKE del dispositivo.

PRODUCT_PROPERTY_OVERRIDES += ro.config.low_ram=true

Configuraciones del lanzador

La configuración de fondo de pantalla por defecto en el lanzador no debe usar de pantalla en vivo. Los dispositivos con poca memoria no deben preinstalar ningún fondo de pantalla en vivo.

Configuración del kernel

Ajuste del kernel / ActivityManager para reducir la recuperación directa

La recuperación directa ocurre cuando un proceso o el kernel intenta asignar una página de memoria (ya sea directamente o debido a fallas en una nueva página) y el kernel ha usado toda la memoria libre disponible. Esto requiere que el kernel bloquee la asignación mientras libera una página. Esto a su vez requiere a menudo / S de disco para eliminar una página de archivos respaldados sucio o esperar a que lowmemorykiller para detener un proceso. Esto puede resultar en E / S adicional en cualquier hilo, incluido un hilo de IU.

Para evitar la recuperación directa, el kernel tiene marcas de agua que desencadenan kswapd o el fondo de recuperación. Este es un hilo que intenta liberar páginas para que la próxima vez que se asigne un hilo real, pueda tener éxito rápidamente.

El umbral predeterminado para activar la recuperación en segundo plano es bastante bajo, alrededor de 2 MB en un dispositivo de 2 GB y 636 KB en un dispositivo de 512 MB. El kernel recupera solo unos pocos megabytes de memoria en la recuperación en segundo plano. Esto significa que cualquier proceso que asigne rápidamente más de unos pocos megabytes alcanzará rápidamente la recuperación directa.

La compatibilidad con un parámetro optimizable del kernel se agrega en la rama del kernel de Android-3.4 como parche 92189d47f66c67e5fd92eafaa287e153197a454f ("agregar kbytes adicionales sintonizables gratis"). Cherry-picking este parche para el kernel de un dispositivo permite ActivityManager para decirle al kernel para tratar de mantener tres de pantalla completa 32 bpp buffers de memoria libre.

Estos umbrales se pueden configurar con el config.xml marco.

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists).  A high value will increase the amount of memory
that the kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier.  A low value allows more memory to be used by
processes but may cause more allocations to block waiting on disk I/O or
lowmemorykiller.  Overrides the default value chosen by ActivityManager based
on screen size.  0 prevents keeping any extra memory over what the kernel keeps
by default.  -1 keeps the default. -->
<integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
tunable in the kernel (if it exists).  0 uses the default value chosen by
ActivityManager.  A positive value  will increase the amount of memory that the
kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier.  A negative value allows more memory to be
used by processes but may cause more allocations to block waiting on disk I/O
or lowmemorykiller.  Directly added to the default value chosen by
ActivityManager based on screen size. -->
<integer name="config_extraFreeKbytesAdjust">0</integer>

Afinación LowMemoryKiller

ActivityManager configura los umbrales de la LowMemoryKiller para que coincida con su expectativa del conjunto de trabajo de páginas de archivos respaldados (páginas en caché) necesarios para ejecutar los procesos en cada cubeta nivel de prioridad. Si un dispositivo tiene requisitos elevados para el conjunto de trabajo, por ejemplo, si la interfaz de usuario del proveedor requiere más memoria o si se han agregado más servicios, se pueden aumentar los umbrales.

Los umbrales se pueden reducir si se reserva demasiada memoria para páginas respaldadas por archivos, de modo que los procesos en segundo plano se eliminen mucho antes de que se produzca la destrucción del disco debido a que la caché se vuelve demasiado pequeña.

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel.  A high value will cause the lowmemorykiller to fire earlier,
keeping more memory in the file cache and preventing I/O thrashing, but
allowing fewer processes to stay in memory.  A low value will keep more
processes in memory but may cause thrashing if set too low.  Overrides the
default value chosen by ActivityManager based on screen size and total memory
for the largest lowmemorykiller bucket, and scaled proportionally to the
smaller buckets.  -1 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the
lowmemorykiller in the kernel.  A high value will cause the lowmemorykiller to
fire earlier, keeping more memory in the file cache and preventing I/O
thrashing, but allowing fewer processes to stay in memory.  A low value will
keep more processes in memory but may cause thrashing if set too low.  Directly
added to the default value chosen by          ActivityManager based on screen
size and total memory for the largest lowmemorykiller bucket, and scaled
proportionally to the smaller buckets. 0 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>

Cambiar a zram

zram swap puede aumentar la cantidad de memoria disponible en el sistema comprimiendo páginas de memoria y colocándolas en un área de memoria de intercambio asignada dinámicamente. Esto cambia el tiempo de la CPU por un pequeño aumento de memoria, así que considere ese hecho cuando evalúe el impacto en el rendimiento que tiene un intercambio de zram en su sistema.

Android maneja el cambio a zram en varios niveles.

  • Primero, habilite estas opciones del kernel para usar zram swap de manera efectiva:
    • CONFIG_SWAP
    • CONFIG_ZRAM
  • Añadir una línea que se parece esto a su fstab:
    /dev/block/zram0 none swap defaults zramsize=<size in bytes>,swapprio=<swap partition priority>
    
    • zramsize es obligatorio e indica la cantidad de memoria sin comprimir desea que el área zram de espera. Puede esperar relaciones de compresión en el rango del 30-50%.
    • swapprio es opcional y sólo para su uso si usted tiene más de un área de intercambio.

    Etiquetar el dispositivo de bloque asociado como un swap_block_device en las específicas del dispositivo sepolicy/file_contexts de modo que es tratada adecuadamente por SELinux.

    /dev/block/zram0 u:object_r:swap_block_device:s0
    
  • De forma predeterminada, el kernel de Linux se intercambia en ocho páginas de memoria a la vez. Cuando se usa zram, el costo incremental de leer una página a la vez es insignificante y puede ayudar si el dispositivo está bajo una presión de memoria extrema. Para leer una sola página a la vez, añada lo siguiente a su init.rc :
    write /proc/sys/vm/page-cluster 0
    
  • En su init.rc después de la mount_all /fstab.X línea, añadir:
    swapon_all /fstab.X
    
  • Los grupos de memoria se configuran automáticamente en el momento del arranque si la función está habilitada en el kernel.
  • Si cgroups memoria están disponibles, ActivityManager marcas de menor prioridad hilos intercambiables como más que otros hilos. Si se necesita memoria, el kernel de Android se inicia la migración de las páginas de memoria para intercambiar zram, dando una mayor prioridad a las páginas de memoria que han sido marcados por ActivityManager .

Carveouts, Ion y asignación de memoria contigua (CMA)

En dispositivos con poca memoria, es importante tener en cuenta las separaciones, especialmente aquellas que no se utilizan por completo, como las separaciones para la reproducción segura de video. Existen varias soluciones para minimizar el impacto de sus regiones exclusivas que dependen de los requisitos exactos de su hardware.

Si el hardware permite asignaciones de memoria no contiguas, el montón del sistema Ion permite asignaciones de memoria desde la memoria del sistema, eliminando la necesidad de una separación. Ion también intenta realizar grandes asignaciones para eliminar la presión del búfer de búsqueda de traducción (TLB) en los periféricos. Si las regiones de memoria deben ser contiguas o confinadas a un rango de direcciones específico, se puede utilizar el CMA.

Esto crea una separación que el sistema también puede utilizar para páginas móviles. Cuando se necesita la región, las páginas móviles se migran fuera de ella, lo que permite que el sistema utilice una gran separación para otros fines cuando es gratis. Puede usar CMA directamente con el montón de Ion CMA.

Consejos de optimización de aplicaciones

Comprender los distintos estados del proceso en Android

Expresar Significado Detalles
SERVICE
SERVICE_RESTARTING
Aplicaciones que se ejecutan en segundo plano por motivos relacionados con la aplicación. SERVICE SERVICE_RESTARTING son las más comunes aplicaciones tienen problemas cuando se ejecutan en segundo plano demasiado. Uso duración% * pss o duración% como una "maldad" métrica. Idealmente, estas aplicaciones no deberían ejecutarse en absoluto.
IMPORTANT_FOREGROUND
RECEIVER
Aplicaciones que se ejecutan en segundo plano (que no interactúan directamente con el usuario). Estos agregan carga de memoria al sistema. Usar la (% Duración * PSS) Valor de "maldad" a fin de estos procesos. Sin embargo, muchas de estas aplicaciones se ejecutan por buenas razones. El tamaño del PSS es una parte importante de su carga de memoria.
PERSISTENT Proceso de sistema persistente. Pss un seguimiento para vigilar estos procesos haciendo demasiado grande.
TOP El proceso con el que el usuario está interactuando actualmente. pss es la métrica importante aquí, que muestra la cantidad de carga de memoria de la aplicación crea mientras está en uso.
HOME
CACHED_EMPTY
Los procesos que el sistema mantiene en caso de que se necesiten nuevamente. Estos procesos pueden eliminarse libremente en cualquier momento y recrearse si es necesario. El estado de la memoria (normal, moderado, bajo, crítico) se calcula en función de cuántos de estos procesos está ejecutando el sistema. La métrica clave para estos procesos es la PSS. En este estado, estos procesos disminuyen sus huellas de memoria tanto como sea posible, para permitir que se mantenga el número total máximo de procesos. En este estado, una aplicación de buen comportamiento en general, tiene una huella pss significativamente menor que lo hace en el TOP estado.
CACHED_ACTIVITY
CACHED_ACTIVITY_CLIENT
Cuando se compara con TOP , éstos demuestran el rendimiento de una aplicación libera memoria en el fondo. Excluyendo CACHED_EMPTY estado hace que estos datos mejor, ya que elimina las situaciones en las que el proceso ha comenzado por algunas razones, además de la interacción con el usuario. Esto elimina que se ocupan de la interfaz de usuario de arriba CACHED_EMPTY pone cuando las actividades relacionadas con el usuario.

Análisis

Analizar el tiempo de inicio de la aplicación

Para analizar el tiempo de inicio de la aplicación, ejecute $ adb shell am start -P o --start-profiler y comenzar su aplicación. El generador de perfiles comienza después de que el proceso se bifurca desde el cigoto y antes de que se cargue cualquier código en la bifurcación.

Analizar usando informes de errores

Los informes de fallos contienen varios servicios, incluyendo batterystats , netstats , procstats , y usagestats , que pueden utilizarse para la depuración. Los informes pueden incluir líneas como esta:

------ CHECKIN BATTERYSTATS (dumpsys batterystats --checkin) ------
7,0,h,-2558644,97,1946288161,3,2,0,340,4183
7,0,h,-2553041,97,1946288161,3,2,0,340,4183

Comprobación de procesos persistentes

Para verificar si hay procesos persistentes, reinicie el dispositivo y verifique los procesos. Luego, ejecute el dispositivo durante unas horas y verifique los procesos nuevamente. No debería haber ningún proceso de larga ejecución entre las dos comprobaciones.

Ejecución de pruebas de longevidad

Para ejecutar pruebas de longevidad, ejecute el dispositivo durante períodos más prolongados y realice un seguimiento de la memoria de los procesos para determinar si aumenta o se mantiene constante. Luego, cree casos de uso canónicos y ejecute pruebas de longevidad en estos escenarios.