studio - Niveles de registro de Android
logcat apk (3)
Estoy teniendo algunas dificultades para configurar el registro de Android. Así es como se ve mi código:
if (Log.isLoggable("MY_TAG", Log.VERBOSE)) {
Log.v("MY_TAG", "Here''s a log message");
}
Bastante simple, ¿verdad?
Sin embargo, estoy teniendo un poco de dificultad para que el Log.isLoggable("MY_TAG", Log.VERBOSE)
devuelva verdadero.
Por http://developer.android.com/reference/android/util/Log.html , traté de agregar un archivo localprop al directorio / data / que se parece a esto:
log.tag.MY_TAG=VERBOSE
pero sin suerte. También probé:
System.setProperty("log.tag.MY_TAG", String.valueOf(Log.VERBOSE));
pero eso tampoco funciona.
¿Alguna idea sobre lo que estoy haciendo mal aquí? Estoy ejecutando Android 2.1-update1 en un Nexus 1 si eso hace alguna diferencia.
Parece que las versiones posteriores de Android quieren que /data/local.prop
sea escribible solo por root. El comando adb push
aparece para crear inicialmente archivos con acceso de lectura / escritura a todos (porque la máscara de archivo predeterminada es 777
). Android, sabiamente, ignora /data/local.prop
ya que esto puede ser un riesgo para la seguridad.
Solo he experimentado con Android 2.3.3 y 4.1.2. El primero no tiene problemas con la lectura de un local.prop
que se puede escribir en todo el mundo, mientras que el segundo parece ignorar silenciosamente el contenido del archivo.
Crear un archivo local.prop
como se describe en la pregunta original:
log.tag.MY_TAG=VERBOSE
Y luego empujarlo hacia el dispositivo de la siguiente manera parece ser el truco:
adb push local.prop /data/local.prop
adb shell chmod 644 /data/local.prop
adb shell chown root.root /data/local.prop
adb reboot
Puede verificar dos local.prop
para asegurarse de que los valores en local.prop
se leyeron ejecutando:
adb shell getprop | grep log.tag
Entonces en resumen:
-
/data/local.prop
solo se lee durante el arranque. - Las versiones posteriores de Android parecen requerir que los permisos en el archivo
/data/local.prop
se establezcan correctamente o que no se lean. El archivo debe poder escribirse solo por root.
Usando adb shell setprop log.tag.MyAppTag VERBOSE
también funciona. El problema es que los valores de las propiedades se pierden después de un reinicio.
Tratar
adb shell setprop log.tag.MyAppTag VERBOSE
Un objetivo importante es no enviar una aplicación de producción con un montón de llamadas de registro, incrementando su tamaño e incluso posiblemente impactando en su rendimiento.
Para hacer esto, mi recomendación es poner estas constantes en la parte superior de cada clase que va a tener llamadas de registro:
static final boolean DEBUG = false;
static final String TAG = "<MyClass>"
Ahora donde inicia sesión, haga esto:
if (DEBUG) Log.v(TAG, "Something");
Encienda sus registros cambiando la constante DEBUG
a verdadero. (Si lo desea, podría tener una clase con estas estadísticas para que todo el código de su aplicación lo use ... Eso tiene sentido para una aplicación pequeña, pero a medida que las cosas se agrandan, es bueno decidir qué partes iniciar sesión).
Al hacer esto, cuando construyes tu aplicación con DEBUG = false
, no solo no se ejecuta todo tu código de registro, sino que se elimina completamente de tu aplicación. Esto es bueno porque te permite dejar un registro bastante extenso en tu código para que se encienda cuando lo necesites, sin preocuparte por cómo afectará el tamaño de tu aplicación de envío. Básicamente solo coloca los registros donde los necesites y no te preocupes por dejarlos allí.
Este es el enfoque que toma gran parte del marco Android. Por ejemplo, el Activity ManagerService .
Esto tiene esas constantes en la parte superior, y varias líneas de registro rociadas a través de ellas. (Y un montón de otras constantes de sub-depuración para varios aspectos del mismo, ya que este archivo es ridículamente estúpidamente grande).