Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo evitar que el sistema elimine las actividades de su aplicación

Cómo evitar que el sistema elimine las actividades de su aplicación

R.drawable.my_service_icon,

"my_service_name",

System.currentTimeMillis());

PendingIntent p_intent = PendingIntent.setLatestEventInfo(this, "MyServiceNotification, "MyServiceNotification se está ejecutando.", p_intent);

notificación ", p_intent);

Log.d(TAG, String.format(" notificación = %s", notificación) );

startForeground(0x1982, notificación); // ID de notificación: 0x1982, puedes nombrarlo como quieras. }

Configuraciones importantes---------------------------------

Las aplicaciones ubicadas en /system/app tienen más permisos que las aplicaciones ubicadas en /data/app; por ejemplo, si configura el atributo persistente en verdadero en el archivo Manifest.xml, puede protegerlo de llamadas salientes. Por ejemplo, el archivo AndroidManifest.xml para la aplicación "Phone":

android:persistent="true"

android.label="@string/dialerIconLabel"

android:icon="@drawable/ic_launcher_phone">

...

Configurar esta opción eleva la aplicación al nivel del kernel para que no se elimine bajo ninguna circunstancia, mientras que configuración->aplicaciones impedirá que se detenga la operación.

Registro anterior: Proc #19: adj=svc /B 4067b028 255:com.xxx.xxx/10001 (started-services)

# cat /proc/255 /oom_adj

Registros después de: PERS #19: adj=core /F 4067b028 255:com.xxx.xxx/10001 (started-services)

# cat /proc/255 /oom_adj

Iniciar sesión después de esto: PERS # 19: adj=core /F 406291f0 155:com.xxx.xxx/10001 (fijo)

# cat /proc/155/oom_adj

-12 # Este es CORE_SERVER_ADJ

Nota: El oom_adj del proceso inicial es - 16 (es decir, SYSTEM_ADJ).

Es decir, SYSTEM_ADJ): cat /proc/1/oom_adj

Análisis de partes relacionadas con Android:

En el archivo frameworks/base/services/java/com/android/server/am / ActivityManagerService Existe el siguiente código en .java:

Existe el siguiente código en el archivo frameworks/base/services/java/com/android/server/am/ ActivityManagerService.java Existe el siguiente código en java:

final ProcessRecord addAppLocked(ApplicationInfo info) {

ProcessRecord app = getProcessRecordLocked(info.processName, info.uid);

if (app = = null) {

app = newProcessRecordLocked(null, info, null);

mProcessNames.put(info.processName, info.uid, app);

updateLruProcessLocked(app, true, true );

}

if ((info.flags& (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))

== (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT )){

app.persistent = true;

app.maxAdj = CORE_SERVER_ADJ //El valor constante es -12.

}.

If (app.thread == null &&. mPersistentStartingProcesses.indexOf(app) < 0) {

mPersistentStartingProcesses.add(app);

startProcessLocked( app, "aplicación agregada", app.processName);

}

devolver aplicación;

}

Para convertirse en un servicio principal (Es decir, app.maxAdj = CORE_SERVER_ADJ(-12)), la aplicación debe tener etiquetas FLAG_SYSTEM y FLAG_PERSISTENT, FLAG_SYSTEM indica que la aplicación está ubicada en /system/app y FLAG_PERSISTENT indica atributos persistentes.

Para frameworks/base/services/java/com/android/server/SystemServer.java, llame a

ActivityManagerService.setSystemProcess();<

el suyo propio app.maxAdj está configurado en SYSTEM_ADJ, que es -16.

Principio:

Los procesos en Android se administran cuando el espacio de proceso del sistema es limitado, el proceso se reciclará automáticamente según su prioridad.

Esto lleva a tres preguntas:

1) Reglas de reciclaje: ¿cuándo reciclar y cuál reciclar?

2) Evitar falsos positivos: ¿Cómo evitar que se reciclen los procesos?

3) Recuperación y preservación de datos: ¿Qué debes hacer si eres reciclado?

Android divide los procesos en seis categorías, de mayor a menor prioridad:

1. Proceso en primer plano (FOREGROUND_APP)

2. p>

3. Proceso de servicio secundario (SECONDARY_SERVER)

4. Si el proceso contiene tanto servicios como actividades de visualización, el proceso debe clasificarse como un proceso de visualización. Entonces el proceso debería clasificarse como un proceso de visualización en lugar de un proceso de servicio.

2. Además, si un proceso depende de otros procesos, el nivel del proceso aumentará. Por ejemplo, si un servicio en el proceso A está vinculado a un componente en el proceso B, entonces el proceso A siempre se considerará al menos tan importante como el proceso B.

3. El servicio telefónico en el sistema se clasifica como un proceso de primer plano, no como un proceso de servicio auxiliar.

En Android, el valor oom_adj de un proceso también representa su prioridad. CONTENT_PROVIDER_ADJ 14

setprop ro.EMPTY_APP_ADJ 15

El oom_adj del proceso con PID 1 (proceso de inicio) en/init.rc está configurado en SYSTEM_ADJ (-16):

# Establece el oom_adj del proceso hijo bifurcado de init.

escribir /proc/1/oom_adj -16

Ver configuración local:

cat /sys/module/lowmemorykiller/parameters/adj

0,1,2,7,14,15

Tiempo de bucle:

En archivo/init.RC:

En archivo/init. :

setprop ro.FOREGROUND_APP_MEM 1536 // 6M

setprop ro.VISIBLE_APP_MEM 2048 // 8M

setprop ro.VISIBLE_APP_MEM 2048 // 8M

setprop ro.FOREGROUND_APP_MEM 1536 // 6M

setprop ro.VISIBLE_APP_MEM 2048 // 8M