Este artículo abarca el proceso de registro, incluidos los estándares de registro, los lineamientos de nivel, clases, propósitos y aproximaciones de pilas múltiples.
Estándares de registro
El registro en Android es complejo debido a la combinación de estándares
se combinaron en logcat
. Los principales estándares utilizados se detallan a continuación:
Source | Ejemplos | Orientación a nivel de pila |
---|---|---|
RFC 5424 (syslog estándar) |
Kernel de Linux, muchas apps de Unix | Kernel, daemons del sistema |
android.util.Log |
Framework de Android y registro de apps | App del sistema y framework de Android |
java.util.logging.Level |
Registro general en Java | app que no es del sistema |
Figura 1: Estándares de nivel de registro.
Aunque cada uno de estos estándares tienen una construcción de niveles similares, varían en nivel de detalle. Los equivalentes aproximados en los estándares son los siguientes:
Nivel RFC 5424 | Gravedad RFC 5424 | Descripción RFC 5424 | android.util.Log | java.util.logging.Level |
---|---|---|---|---|
0 | Emergencia | El sistema no se puede usar | Log.e / Log.wtf |
SEVERE |
1 | Alerta | Se deben tomar medidas de inmediato. | Log.e / Log.wtf |
SEVERE |
2 | Crítico | Condiciones críticas | Log.e / Log.wtf |
SEVERE |
3 | Error | Condiciones de error | Log.e |
SEVERE |
4 | Advertencia | Condiciones de advertencia | Log.w |
WARNING |
5 | Aviso | Normal, pero significativo | Log.w |
WARNING |
6 | Información | Mensajes de información | Log.i |
INFO |
7 | Depuración | Mensajes de nivel de depuración | Log.d |
CONFIG , FINE |
- | - | Mensajes detallados | Log.v |
FINER /FINEST |
Figura 2: Niveles de registro de syslog
, Android y Java
Lineamientos de nivel de registro
Se proporcionan lineamientos existentes para cada estándar de registro. El registro elegido
cumpla con el estándar apropiado que se usa, como usar syslog
estándar para el desarrollo de kernel.
Los pedidos de nivel de registro, de menor a mayor, se muestran en las tres figuras a continuación:
ERROR |
Estos registros se conservan siempre. |
WARN |
Estos registros se conservan siempre. |
INFO |
Estos registros se conservan siempre. |
DEBUG |
Estos registros se compilan, pero se quitan durante el tiempo de ejecución. |
VERBOSE |
Estos registros nunca se compilan en una app, excepto durante en el desarrollo de software. |
Figura 3: android.util.Log
CONFIG |
Nivel de mensaje para los mensajes de configuración estáticos |
FINE |
Nivel de mensaje que proporciona información de seguimiento |
FINER |
Indica un mensaje de seguimiento bastante detallado |
FINEST |
Indica un mensaje de seguimiento muy detallado |
INFO |
Nivel de mensaje para mensajes informativos |
SEVERE |
Nivel de mensaje que indica una falla grave |
WARNING |
Nivel de mensaje que indica un posible problema |
Figura 4: java.util.Logging.Level
0 | Emergencia | El sistema no se puede usar |
1 | Alerta | Se deben tomar medidas de inmediato. |
2 | Crítico | Condiciones críticas |
3 | Error | Condiciones de error |
4 | Advertencia | Condiciones de advertencia |
5 | Aviso | Condición normal, pero significativa |
6 | Informativo | Mensajes informativos |
7 | Depuración | Mensajes de nivel de depuración |
Figura 5: RFC 5424
: Sección
6.2.1
Registro de apps
La clase android.util.Log
realiza el registro selectivo con TAG
mediante Log#isLoggable
,
como se muestra a continuación:
if (Log.isLoggable("FOO_TAG", Log.VERBOSE)) { Log.v("FOO_TAG", "Message for logging."); } |
---|
Los registros se pueden ajustar en el tiempo de ejecución para proporcionar un nivel de registro seleccionado, como se muestra a continuación a continuación:
adb shell setprop log.tag.FOO_TAG VERBOSE |
---|
Se restablecen log.tag.*
propiedades durante el reinicio. Existen
con variantes persistentes que también
permanecen en los reinicios. Consulta a continuación:
adb shell setprop persist.log.tag.FOO_TAG VERBOSE |
---|
Las verificaciones de Log#isLoggable
dejan seguimientos de registro en el código de la app. Booleano
Las marcas DEBUG
omiten los seguimientos de registros usando optimizaciones del compilador establecidas en
false
, como se muestra a continuación:
private final static boolean DEBUG = false; |
---|
Puedes quitar el registro por APK a través de conjuntos de reglas ProGuard antes del R8
en
tiempo de compilación. En el siguiente ejemplo, se quita todo lo que esté por debajo del nivel INFO
.
registro para android.util.Log
:
# This allows proguard to strip isLoggable() blocks containing only <=INFO log # code from release builds. -assumenosideeffects class android.util.Log { static *** i(...); static *** d(...); static *** v(...); static *** isLoggable(...); } -maximumremovedandroidloglevel 4 |
---|
Esto es útil para controlar varios tipos de compilación de apps (por ejemplo, (por ejemplo, compilaciones de desarrollo frente a compilaciones de lanzamiento) en las que el código subyacente está se espera que sean iguales, pero los niveles de registro permitidos son diferentes. Contenido explícito se debe establecer y seguir una política para las apps (particularmente apps) para decidir el impacto que tienen los tipos de compilaciones y las expectativas de los lanzamientos en el registro salida.
Registro del sistema en Android Runtime (ART)
Hay varias clases disponibles que están disponibles para el sistema apps y servicios:
Clase | Propósito |
---|---|
android.telephony.Rlog |
Registro de radio |
android.util.Log |
Registro general de apps |
android.util.EventLog |
Registro de eventos de diagnóstico del integrador de sistema |
android.util.Slog |
Registro del framework de la plataforma |
Figura 6: Clases y propósitos de registro del sistema disponibles
Aunque android.util.Log
y android.util.Slog
usan el mismo nivel de registro
Slog
es una clase @hide
que solo puede usar la plataforma. El EventLog
los niveles se asignan a las entradas en el archivo event.logtags
en /system/etc/event-log-tags
.
Registro nativo
El registro en C/C++ sigue el estándar syslog
con syslog
(2) correspondiente a
el kernel de Linux syslog
que controla el búfer printk
y syslog
(3)
correspondiente al registrador general del sistema. Android usa la liblog
para los registros generales del sistema.
liblog
proporciona wrappers para los grupos de subregistros con la siguiente macro
formulario:
[Sublog Buffer ID] LOG [Log Level ID] |
RLOGD
, por ejemplo, corresponde a [Radio log buffer ID] LOG [Debug Level]
.
Los wrappers liblog
principales son los siguientes:
Clase de wrapper | Funciones de ejemplo |
---|---|
log_main.h |
ALOGV , ALOGW |
log_radio.h |
RLOGD , RLOGE |
log_system.h |
SLOGI , SLOGW |
Figura 7: Wrappers de liblog
Android tiene interfaces de registro superiores a las directas
Uso de liblog
, como se muestra a continuación:
Biblioteca | Uso |
---|---|
async_safe |
Biblioteca solo para el registro desde entornos seguros para señales asíncronas |
libbase |
Biblioteca de registros que proporciona una interfaz de transmisión C++ para el registro, similar a
Registro al estilo de Google (glog). libbase se puede usar en ambos proyectos externos.
y está disponible en las apps que usan libbase_ndk . |
Figura 8: Bibliotecas de registro de nivel superior
Aproximaciones de pilas múltiples
Debido a las diferencias en el nivel de detalle y el intent, no hay
que coinciden exactamente con los diferentes
estándares de registro. Por ejemplo, el
Los niveles de java.util.logging.Level
y android.util.Log
para los registros de errores no son un
Coincidencia 1:1:
java.util.Logging.Level | android.util.Log |
---|---|
GRAVEDAD | Log.wtf |
GRAVEDAD | Log.e |
Figura 9: Nivel de error en el registro estándar de Java en comparación con Android de los datos.
En casos como este, usa el estándar individual para determinar a qué nivel
aplicar.
Durante el desarrollo del sistema con varios componentes a nivel de pila, sigue Figura 1 para determinar qué estándar usar por componente. Para obtener un valor aproximado para los mensajes de niveles, sigue la Figura 2.
Seguridad y privacidad
No registres información de identificación personal (PII). Esta incluye detalles como los siguientes:
- Direcciones de correo electrónico
- números de teléfono
- Nombres
Del mismo modo, ciertos detalles se consideran sensibles incluso si no son información personal identificable explícitamente.
Por ejemplo, aunque la información de la zona horaria no se considera de identificación personal,
sí brinda una indicación de la ubicación aproximada del usuario.
La política de registros y los detalles aceptables deben manejarse como parte del una revisión de privacidad antes del lanzamiento.
Registros del dispositivo
Acceso a todos los registros del dispositivo, incluido el uso
android.permission.READ_LOGS
está restringido:
- Si una app en segundo plano solicita acceso a todos los registros del dispositivo, la solicitud se a menos que la app:
- Comparte el UID del sistema.
- Usa un proceso del sistema nativo (
UID
<APP_UID
). - Usa
DropBoxManager
- Accede solo al búfer de registro de eventos.
- Usa la API de
EventLog
. - Usa pruebas instrumentadas.
- Si una app en primer plano con
READ_LOGS
solicita acceso a los registros del dispositivo, la el sistema le pide al usuario que apruebe o rechace la solicitud de acceso.