1 votos

El teléfono expulsa las aplicaciones inactivas de la memoria RAM, a pesar de la gran cantidad de memoria libre.

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

La configuración del stock también establece algún intercambio en zram, lo he desactivado, no parece hacer la diferencia.

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

De acuerdo con 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 expulsan periódicamente de la memoria (se muestra en el gestor de tareas con 0.00b asignado), lo que resulta en un pequeño retraso en el próximo lanzamiento.

Los parámetros del asesino del dinero parecen cuerdos

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

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

0voto

Dan Puntos 106

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

static final int MAX_CACHED_APPS = 24;

Este valor se divide además como sigue por 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 ram de 3GB, para ver cuánta memoria sin usar tendrás)

En el stock de 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 concedido.

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

Por suerte ya existe una aplicación de este tipo en github, llamada SetAndroidProcessLimit, que, instalada correctamente, funciona (mi agradecimiento al autor)

Ahora tengo 20 aplicaciones en caché en Ram, que son todas las aplicaciones que uso con frecuencia, y cualquiera de ellas se iniciará al instante, sin retraso.


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

  • descarga el frasco a tu pc, desempaca el frasco
  • descompilar clases.dex con baksmali (o a través de apktool)
  • modificar en ProcessList.smali y en ActivityManagerService.smali - porque esto es un código de bytes, tienes que reemplazar no sólo la declaración de MAX_CACHED_APPS sino cada ocurrencia de ella con un nuevo valor deseado
  • recompilar clases.dex
  • volver a empaquetar el frasco
  • descargar al teléfono, sustituyendo el frasco original (hay que volver a montar el sistema)
  • reinicia el teléfono; el mío regenerará automáticamente el caché de Dalvik

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X