Tl;dr
Es posible con Root, puedes ajustar oom_adj
para evitar que las aplicaciones sean eliminadas, o bien forzar a la aplicación objetivo a permanecer en la memoria "bloqueándola" o cambiar algunos ajustes relacionados responsables de la eliminación de aplicaciones en condiciones de poca memoria.
Antecedentes: Gestión de la RAM en Android
Android utiliza una forma diferente de manejar los procesos. En lugar de matar cada proceso después de que su actividad terminó, los procesos se mantienen hasta que el sistema necesite más memoria. La idea es dar mejoras de velocidad si se vuelve a iniciar esa actividad. Pero, ¿cómo/cuándo mata Android un proceso si necesita más memoria y qué proceso matar primero?
Esto es gestionado por el controlador LMK (Low Memory Killer) de Android. Usted ya sabes que cada aplicación/proceso en Android tiene asignado un oom_adj
valor, que indica la probabilidad de que se mate cuando una situación de falta de memoria (OOM). Cuanto más alto sea su valor, mayor será la mayor es la probabilidad de que sea eliminado. El rango válido es -17
a +15
. (si en el -17
rango significa que no se matará). De acuerdo con esto, hay hay seis grupos (grupos OOM), en los que las aplicaciones/procesos se se clasifican:
- Aplicación en primer plano
- Aplicación visible
- Servidor secundario
- Aplicación oculta
- Proveedor de contenidos
- Aplicación vacía
Básicamente se podrían describir como:
FOREGROUND_APP
: Este es el proceso que ejecuta la aplicación actual en primer plano aplicación. Preferimos no matarlo.
VISIBLE_APP
: Se trata de un proceso que sólo alberga actividades visibles para el usuario, por lo que preferimos que no desaparezcan.
SECONDARY_SERVER
: Este es un proceso que mantiene un servidor secundario -- matarlo no tendrá mucho impacto en lo que respecta al usuario usuario.
HIDDEN_APP
: Este es un proceso que sólo alberga actividades que no son visibles, por lo que puede ser eliminado sin ninguna interrupción.
CONTENT_PROVIDER
: Se trata de un proceso con un proveedor de contenidos que no tiene ningún cliente asociado. Si tuviera algún cliente, su ajuste sería el de la más alta prioridad de esos procesos.
EMPTY_APP
: Este es un proceso sin nada que se ejecute actualmente en en él. Definitivamente, es el primero en desaparecer.
Estos grupos se definen por oom_adj
y las aplicaciones entrarían en uno de esos grupos en función de la oom_adj
valor asignado a esa aplicación en particular. Las "aplicaciones en primer plano" suelen tener un oom_adj
valor de 0
o menos (por lo que son los menos matables; es decir, de alta prioridad).
Las "aplicaciones vacías" tienen un oom_adj
(se matan pronto; es decir, son de baja prioridad). También, oom_adj
cambia según el estado de la aplicación del usuario; es 0
cuando la aplicación está activa en primer plano y se le asigna un valor mayor cuando la aplicación pasa a segundo plano.
¿Por qué difiere su "capacidad de matar"? Las aplicaciones que pertenecen a estos diferentes grupos (que tienen diferentes oom_adj's
), empiezan a morir en diferentes niveles de RAM libre. Estos límites de RAM desencadenantes están definidos por los valores de LMK minfree. Por encima de 6 categorías se corresponden con 6 límites de RAM límites que se establecen en el LMK minfree. eg: Android 4.3 de stock en mi dispositivo viene con los valores minfree de 48,60,72,84,96,120
. (estos están en MB).
Prácticamente lo que significa es que las aplicaciones vacías serán eliminadas cuando la memoria RAM baje de 120mb, los proveedores de contenido cuando baje de 96mb, las aplicaciones ocultas cuando baje de 84mb y así sucesivamente por último empieza a matar las aplicaciones en primer plano cuando la memoria RAM baje de 48mb. (Puedes notar que este último valor (48mb) no es deseable cuando se usan aplicaciones de memoria intensiva como juegos pesados).
NB:
-
En un núcleo más nuevo, oom_ score _adj
se utiliza en lugar de la antigua oom_adj
. (el rango válido de oom_score_adj es de -1000 a 1000). Pero oom_adj
también se mantiene para que sea compatible.
-
Se dice que hay muchas categorías de procesos OOM que tienen asignadas diferentes oom_adj
prioridades por el ActivityManagerService
Pero, finalmente, todos ellos se considerarán por encima de seis ranuras/grupos (de acuerdo con oom_limits), con el fin de matar por los desencadenantes LMK minfree. Por lo tanto, esos seis son los importantes para los usuarios normales.
- Podemos comprobar los valores minfree (también cambiarlos) y ver los OOM de las aplicaciones/procesos con esta aplicación de Memory Manager fácilmente.
-
No todos los dispositivos tienen la misma configuración OOM.
Mejora de la gestión de la memoria RAM
Hoy en día hay muchas implementaciones amigables del mecanismo de gestión de la RAM con UI en la configuración del sistema (como la optimización de la aplicación en la configuración de la batería, Aplicaciones protegidas en algunas ROMS, por ejemplo EMUI de Huawei etc) y puede tener el mismo efecto que el descrito anteriormente:
Dicho esto, ahora podemos explorar las formas en que se puede utilizar la RAM sin matar las aplicaciones en primer plano con demasiada frecuencia. Las áreas objetivo incluirán:
1.Ajustar los valores del minifree a las necesidades de cada uno
2.Bloqueo de aplicaciones en la memoria para evitar que sean eliminadas
3.Anulación del límite de aplicaciones ocultas de Android
-
Ajuste de los valores minifree
-
Puede cambiar los valores minfree con el gestor de memoria y pulsar aplicar. (Además, hay una opción "aplicar en el arranque" y marcar para preservar la configuración a través de los arranques). Varias aplicaciones pueden lograr esto, por ejemplo Gestor de memoria , Gerente de Minfree etc.
-
Alternativamente, use terminal/adb usando páginas:
#!/system/bin/sh echo “values” > /sys/module
-
Bloquear las aplicaciones para que permanezcan en la memoria (haciéndolas residentes)
a) Uso de la configuración de la aplicación (Xposed)
- Un método sencillo es utilizar el módulo Xposed, la configuración de la aplicación (se necesita Marco Xposed instalado)
- Después de instalar el framework, descarga el módulo 'App Settings' a través del instalador Xposed.
- Abra la configuración de la aplicación y permita que se carguen las aplicaciones, seleccione la aplicación de destino (en este caso navegador firefox )
- En la página de configuración, active el interruptor y el modo de edición, marque la opción "Residente" y guarde. ( Hacer que las aplicaciones sean residentes, hace que las aplicaciones se queden en la memoria sin ser eliminadas y se aconseja utilizar el botón de salida en la aplicación de destino si ya no se necesita, de lo contrario privará de memoria a otras aplicaciones)
b) Utilizando armario de la memoria
Otra implementación de este concepto es el bloqueo de la aplicación de destino en la memoria mediante el control de los archivos del sistema para establecer oom_adj
para todos los procesos en ejecución.
Cómo funciona la aplicación:
El almacén de memoria controla los archivos en el directorio /data y también controla archivos del sistema en Root para establecer oom_adj para los procesos en ejecución.
Todas las Las aplicaciones bloqueadas se bloquean automáticamente después de cada reinicio. Las aplicaciones están clasificadas como aplicaciones descargadas/sistema, para desbloquearlas seleccione la aplicación objetivo y haga clic en el candado de la derecha. (Opcionalmente, puede establecer oom_adj
prioridad)
-
Anulación del límite de aplicaciones ocultas
-
Además del mecanismo de eliminación de memoria baja, hay otro parámetro que controla la eliminación de aplicaciones ocultas y vacías. Las aplicaciones se eliminan cuando superan los límites especificados.
-
Hay una configuración de build.prop que puede controlar esto (por defecto suele ser un número bajo inferior a 25, y modificando esto se puede aumentar este valor a un valor mucho mayor como 80)
-
Añade esta línea al archivo build.prop en /system y deja otra línea en blanco debajo (asegúrate de hacer una copia de seguridad primero)
ro.sys.fw.bg_apps_limit=80
Referencias y créditos
- Gestión de la memoria RAM en Android (Créditos especiales: mrhnet )
- Casillero de la memoria
- Xposed - Información general, versiones y registro de cambios