Cómo utilizar el administrador de Dropbox
Bloques de datos en la cola (de varias fuentes: fallas de aplicaciones, registros del kernel, etc.). La cola tiene un límite de tamaño y, si los datos en cola exceden el tamaño máximo, los datos antiguos se descartarán. Puede considerarlo como un "logcat" persistente, que abarca todo el sistema y está orientado a blobs. Puede considerarlo como un "logcat" persistente, que abarca todo el sistema y está orientado a blobs.
DropBoxManager es un mecanismo introducido para Android en Froyo (API nivel 8). Se utiliza para almacenar datos del sistema de forma persistente. Se utiliza principalmente cuando ocurren problemas graves en el kernel, los procesos del sistema y el usuario. procesos, etc. Mantenga un registro. Mientras se ejecuta Android, puede considerarlo como un "logcat" persistente, que abarca todo el sistema y está orientado a blobs.
Podemos llamar a getSystemService(String) con el parámetro DROPBOX_SERVICE para obtener el servicio y consultar todos los registros de errores del sistema almacenados en DropBoxManager.
¿Qué errores del sistema registra Android por defecto?
No encontré ninguna documentación en el sitio web oficial sobre qué errores del sistema se registran en DropBoxManager, pero podemos mirar el código fuente para averiguarlo. Puede buscar varias etiquetas registradas en DropBoxManager desde el código fuente (similar a las etiquetas logcat).
Caída (cierre forzado de la aplicación)
Cuando la capa Java encuentra una excepción no detectada, ActivityManagerService registrará el bloqueo en DropBoxManager y mostrará un cuadro de diálogo de cierre forzado para recordárselo al usuario.
ActivityManagerServicelink
public void handleApplicationCrash(aplicación IBinder, ApplicationErrorReport.CrashInfo crashInfo) {
ProcessRecord r = findAppProcess(aplicación, "Crash");
final String nombre del proceso = aplicación == null ?"system_server"
: (r == null ? "desconocido" : r.processName);
EventLog.writeEvent( EventLogTags.AM_CRASH, Binder.getCallingPid(),
UserHandle.getUserId( Binder.getCallingUid()), ProcessName,
r == null ?-1: r.info.flags ,
crashInfo.exceptionClassName,
crashInfo.exceptionMessage,
crashInfo.throwFileName,
crashInfo.throwLineNumber
);addErrorToDropBox("crash", r, nombreProceso, nulo, nulo, nulo, nulo, crashInfo
crashApplication(r, crashInfo
}
);anr (La aplicación no responde, ANR)
Cuando el hilo principal de la aplicación (hilo UI) no responde durante un tiempo prolongado, ActivityManagerService utilizará los siguientes métodos para recuperar la respuesta. ActivityManagerService registra y en DropBoxManager y muestra el cuadro de diálogo de que la aplicación no responde para recordárselo al usuario.
ActivityManagerServicelink
final void appNotResponding(aplicación ProcessRecord, actividad ActivityRecord,
padre ActivityRecord, booleano aboveSystem, anotación de cadena final) {
//......
addErrorToDropBox("anr", aplicación, app.processName, actividad, padre, anotación,
cpuInfo, tracesFile, null);
//......
}
wtf (qué terrible error)
La clase "android.util.Log" proporciona Crea una función wtf estática que las aplicaciones pueden usar en su código para informar de forma proactiva situaciones que no deberían ocurrir. Dependiendo de la configuración del sistema, esta función agregará un registro wtf a DropBoxManager a través de ActivityManagerService y/o finalizará el proceso de solicitud actual.
ActivityManagerServicelink
handle booleano públicoApplicationWtf(aplicación IBinder, etiqueta de cadena,
ApplicationErrorReport.CrashInfo crashInfo) {
ProcessRecord r = findAppProcess( app, "WTF");
final String nombreProceso = aplicación == null ?"system_server"
: (r == null ? "desconocido" : r.processName);
EventLog.writeEvent(EventLogTags.AM_WTF,
UserHandle.getUserId(Binder.getCallingUid()), Binder.getCallingPid(),
nombre del proceso,
r == null ?-1 : r.info.flags,
etiqueta, crashInfo.exceptionMessage);
addErrorToDropBox("wtf", r, ProcessName, null , nulo, etiqueta, nulo, nulo, crashInfo);
if (r != null && r.pid ! = Process.myPid() &&
Settings.Global.getInt( mContext.getContentResolver(),
Settings.Global.WTF_IS_FATAL, 0) ! = 0) {
crashApplication(r, crashInfo);
devuelve verdadero;
} else {
return false;
}
}
modo_estricto (violación del modo estricto) p> p>
StrictMode, como sugiere el nombre, es un modo más estricto que el modo normal y generalmente se usa para monitorear redes, archivos y otras operaciones que no deben realizarse en el hilo principal. ActivityManagerService en DropBoxManager registrará cualquier infracción de StrictMode como una infracción de modo estricto.
ActivityManagerServicelink
public void handleApplicationStrictModeViolation(
aplicación IBinder,
int violationMask,
StrictModeViolation(< / p>
aplicación IBinder,
int violationMask,
StrictMode.ViolationInfo info){
ProcessRecord r = findAppProcess(app, " StrictMode");
if (r == null) {
return;
}
if ((violationMask & StrictMode. PENALTY_DROPBOX) ! = 0) {
Pila enteraFingerprint = info.hashCode();
booleano logIt = true;
sincronizado (mAlreadyLoggedViolatedStacks) {
if (mAlreadyLoggedViolatedStacks.contains(stackFingerprint)) {
logIt = false;
// TODO: submuestra en EventLog para estos, con
// // TODO: submuestra en EventLog para estos, con
// info.durationMillis para que podamos obtener
// números relativamente dolorosos sin tener que hacerlo. registrar todos los // seguimientos de pila repetidamente
Queremos hacer lo mismo en el código del cliente antes de la llamada de Binder
p> // supresión de dup
if ( mAlreadyLoggedViolatedStacks.size() >= MAX_DUP_SUPPRESSED_STACKS) {
mAlreadyLoggedViolatedStacks.clear();
}
mAlreadyLoggedViolatedStacks.add(stackFingerprint);
}
}
if (logIt) {
logStrictModeViolationToDropBox(r, info) ;
}
}
//......
}
lowmem
Cuando no hay suficiente memoria, Android finalizará la aplicación en segundo plano para liberar la memoria, pero si no hay una aplicación en segundo plano para liberar la memoria, ActivityManagerService registrará un mensaje en el Registro DropBoxManager.
ActivityManagerServicelink
public void handleMessage(Mensaje msg) {
switch (msg.what) {
//...
caso REPORT_MEM_USAGE: {
//......
hilo hilo = nuevo hilo() {
@Override public void run() {
StringBuilder dropBuilder = nuevo StringBuilder(1024);
StringBuilder logBuilder = nuevo StringBuilder(1024);
//.... ..
addErrorToDropBox("lowmem", null, "system_server", null,
null, tag.toString(), dropBuilder.toString(), null, null);
// ......
}
};
hilo.start();
romper;
}
// ......
}
Perro guardián
si WatchDog detecta un problema con el proceso del sistema (system_server). Agregará un registro de vigilancia a DropBoxManager y finalizará la ejecución del proceso del sistema.
Watchdoglink
/** Esta clase llama al monitor una vez cada minuto. Si no regresan, el proceso finalizará**/
public class Watchdog extends Thread {
//......
@ Anular
public void run() {
boolean waitedHalf = false;
while (true) {
//... ...
// Si llegamos aquí, significa que lo más probable es que el sistema esté colgado.
// Primero recopile los seguimientos de la pila de todos los subprocesos del proceso del sistema.
// Luego finaliza el proceso para que el sistema pueda reiniciarse.
//...
// Intente agregar un error al Dropbox, pero suponiendo que el ActivityManager
// en sí mismo puede estar bloqueado (Esto tiene sucedió, lo que provocó que esta declaración se atascara en
// un punto muerto y todo el mecanismo de vigilancia quedara inoperativo). addErrorToDropBox(
"watchdog", null, "system_server", null, null,
nombre, null, stack, null);
}
};
dropboxThread.start();
prueba {
dropboxThread.join(2000); // Espera hasta 2 segundos para deja que regrese.
} catch (InterruptedException ignorada) {}
//......
}
}
//......
}
//