El teléfono expulsa las aplicaciones inactivas de la RAM, a pesar de que hay mucha memoria libre

El teléfono (Jiayu G4S) ejecuta Android 4.4.2, 2 GB de RAM, stock jiayu.es rom (kernel 3.4.67)

La configuración de stock también configura algún intercambio en zram, lo deshabilité, no parece hacer una diferencia.

El administrador de tareas muestra en cualquier momento al menos 0,92 GB libres o más. Muestra como máximo 12-13 aplicaciones inactivas almacenadas en caché que todavía están en RAM, un poco más si el límite del proceso se establece manualmente en un valor alto (solo por diversión, elijo 100).

Según dumpsys meminfo, así es como se ve ahora:

Total RAM: 2016644 kB
 Free RAM: 883420 kB (230000 cached pss + 131652 cached + 521768 free)
 Used RAM: 852001 kB (805401 used pss + 1684 buffers + 8972 shmem + 35944 slab)
 Lost RAM: 281223 kB
     ZRAM: 4 kB physical used for 0 kB in swap (0 kB total swap)
   Tuning: 256 (large 512), oom 122880 kB, restore limit 40960 kB (high-end-gfx)

Y, sin embargo, las aplicaciones de uso frecuente se descartan periódicamente de la memoria (se muestran en el administrador de tareas con 0.00b asignados), lo que genera un pequeño retraso en el próximo lanzamiento.

Los parámetros de oomkiller parecen cuerdos

shell@G4:/ $ cat /sys/module/lowmemorykiller/parameters/minfree                
12288,15360,18432,21504,24576,30720

¿Por qué se eliminan los programas de uso frecuente, a pesar de toda esa memoria libre? ¿Hay algo que pueda configurar (tengo acceso de root)?

Respuestas (1)

Y ahora a responderme. En cuanto a las fuentes de Android 4.4.2 (KOT39H), en ProcessList.java hemos definido un número máximo de aplicaciones en caché, establecido en un valor arbitrario de 24:

static final int MAX_CACHED_APPS = 24;

Este valor se divide aún más de la siguiente manera mediante la función computeEmptyProcessLimit: 2/3 va al límite de proceso vacío y 1/3 va al límite de proceso en caché.

Así que ahora tenemos un límite arbitrario de 16 para procesos vacíos y 8 para procesos en caché. (Pero ve a comprar un teléfono de 3 GB de ram, para ver cuánta memoria sin usar tendrás)

En Android, la única forma de cambiar este límite es en tiempo de ejecución, a través de setProcessLimit(), que requiere un teléfono rooteado, una aplicación instalada manualmente en /system/priv-app y el permiso SET_PROCESS_LIMIT otorgado.

(En CM11, por ejemplo, también se puede configurar en build.prop, pero este código no está presente en el stock 4.4.2)

Afortunadamente, ya existe una aplicación de este tipo en github, llamada SetAndroidProcessLimit, que, instalada correctamente, funciona (gracias al autor)

Ahora tengo 20 aplicaciones almacenadas en caché en RAM, eso es casi todas las aplicaciones que uso con frecuencia, y cualquiera de ellas se iniciará instantáneamente, sin demora.


También descubrí cómo modificar MAX_CACHED_APPS directamente en /system/framework/services.jar

  • descarga el jar a tu pc, descomprime el jar
  • descompilar classes.dex con baksmali (o a través de apktool)
  • modifique en ProcessList.smali y en ActivityManagerService.smali: debido a que este es un código de bytes, debe reemplazar no solo la declaración de MAX_CACHED_APPS sino cada aparición con el nuevo valor deseado
  • recompilar clases.dex
  • reempacar el frasco
  • descargue al teléfono, reemplazando el jar original (tiene que volver a montar rw / system)
  • reiniciar el teléfono; el mío automáticamente regenerará el caché dalvik