Comportmento strano di Log

Ho scritto un'attività Android molto semplice:

import android.os.Bundle; import android.app.Activity; import android.util.Log; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("TAG", "onCreate() Log call 1"); Log.d("SMS", "onCreate() Log call 2"); Log.d("TEST", "onCreate() Log call 3"); finish(); } @Override protected void onDestroy() { Log.d("TAG", "onDestroy() Log call 1"); Log.d("SMS", "onDestroy() Log call 2"); Log.d("TEST", "onDestroy() Log call 3"); super.onDestroy(); } } 

Mi aspetto che questo generi 6 messaggi di log (3 da onCreate() , 3 da onDestroy() ). Ecco il logcat:

  • Messaggio di toast in Android
  • Come utilizzi l'API Android Volley?
  • Quiz a scelta multipla random Android: come identificare la risposta corretta
  • Eseguire periodicamente l'object di class AsyncTask: Aggiornato
  • Android - Regola lo schermo quando la tastiera viene visualizzata?
  • Android HttpClient e HTTPS
  •  04-14 17:31:58.363: D/TAG(18084): onCreate() Log call 1 04-14 17:31:58.363: D/TEST(18084): onCreate() Log call 3 04-14 17:31:59.905: D/TAG(18084): onDestroy() Log call 1 04-14 17:31:59.905: D/TEST(18084): onDestroy() Log call 3 

    Come si può vedere, le righe con il tag "SMS" non passano. Questo non è, per quanto posso dire una cosa documentata. La domanda è, perché?

    EDIT: Ulteriori dettagli sulla risposta.

    Una risposta piuttosto buona è data di seguito da Matthew Burke. In breve, sulla base del codice sorgente di logd_write.c , sembra che:

    • Log richieste di Log con i seguenti tag vengono automaticamente reindirizzate al registro radio :
      • HTC_RIL
      • tag che iniziano con RIL
      • AT
      • GSM
      • STK
      • CDMA
      • PHONE
      • SMS
    • Nessuna richiesta di Log viene reindirizzata al registro degli events (o il registro di system , vedere anche http://elinux.org/Android_Logging_System )
    • Tutte le altre richieste di Log vanno al registro main , quello che viene di solito monitorato.

  • Combinazione di button di accensione e volume in su in android
  • Posso creare cartella protetta da password in Android?
  • Come salvare l'image in preferenza condivisa in Android | Problema di preferenza condivisa in Android con Image
  • Android: come eseguire una visualizzazione personalizzata?
  • Come posso get il logcat sul mio dispositivo per mostrare i registri di tutti i processi
  • Fuori memory in un'assegnazione di byte (bitmap come String al webservice usando il soap)
  • 2 Solutions collect form web for “Comportmento strano di Log”

    Avrei dovuto leggere la documentazione per il logcat prima di iniziare a caccia attraverso la fonte. Secondo la documentazione di logcat :

    Il sistema di logging di Android mantiene più buffer circolari per i messaggi di registro e non tutti i messaggi di log vengono inviati al buffer circolare predefinito.

    I messaggi con un tag di SMS vengono inviati al buffer radio, non al buffer principale. Quindi non li vedrai a less che tu non ti passi per farlo. Se si esegue il command:

    adb logcat -b radio

    dovresti vedere i tuoi messaggi di registro mancanti. Le informazioni di cui sopra possono essere trovate in https://developer.android.com/tools/debugging/debugging-log.html .


    Ora, per coloro che sono interessati al codice di spelunking, sotto è la mia risposta originale:

    I methods nella class Log sono tutti i wrapper attorno a println_native che è un metodo JNI.
    println_native esegue una certa validazione dei suoi parametri e quindi chiama __android_log_buf_write .

    Adesso questo ultimo metodo confronta il parametro tag (dalla chiamata Log.d originale) contro più stringhe codificate (con il tag SMS che è uno di Log.d ) e se trova una corrispondenza, esegue la scrittura del messaggio di registro a un altro file!

    A proposito, altri tag che vengono riesaminati sono GSM, STK, PHONE, CDMA e pochi altri.

    Si può leggere la fonte rilevante

    Questi non sono i collegamenti ufficiali e possono scomparire ad un certo punto. Cercherò di rintracciare i link ufficiali e modificarla più tardi questa sera.

    EDIT Ignorate questo, a quanto pare apparentemente abbastanza spento.

    Quindi ho pensato che fosse interessante, e dopo aver scavato attraverso la fonte, ho finito per scoprire Log.isLoggable() :

    Verifica se un log per il tag specificato è loggable al livello specificato. Il livello predefinito di each tag è impostato su INFO. Ciò significa che tutti i livelli sopra e compresi INFO saranno registrati. Prima di effettuare chiamate a un metodo di logging, è necessario verificare se il tag deve essere registrato. È ansible modificare il livello predefinito impostando una properties; di sistema: 'setprop log.tag. 'Dove il livello è VERBOSO, DEBUG, INFO, WARN, ERRORE, ASSERT, o SUPPRESS. SUPPRESS spegnerà tutte le registrazioni per il tuo tag. È anche ansible creare un file local.prop con quello seguente: 'log.tag. =' E posizionarlo in /data/local.prop.

    parametri
    tag Il tag da controllare.
    livello Il livello da controllare.

    Restituisce
    Sia che sia consentito o registrato.

    A quanto pare alcuni tag non sono ammessi a certi livelli di log, apparentemente definiti in /data/local.prop , ma devono esistere alcuni file di properties; del livello di sistema che non ho ancora trovato. Puoi controllarla usando qualcosa di simile, però:

     boolean isLoggableV = Log.isLoggable("SMS", Log.VERBOSE); boolean isLoggableD = Log.isLoggable("SMS", Log.DEBUG); boolean isLoggableI = Log.isLoggable("SMS", Log.INFO); boolean isLoggableW = Log.isLoggable("SMS", Log.WARN); boolean isLoggableE = Log.isLoggable("SMS", Log.ERROR); boolean isLoggableA = Log.isLoggable("SMS", Log.ASSERT); Log.v("LogTest", String.format("Verbose: %b Debug: %b Info: %b Warn: %b Error: %b Assert: %b", isLoggableV, isLoggableD, isLoggableI, isLoggableW, isLoggableE, isLoggableA)); 

    Quello che per me ha restituito quanto segue:

     Verbose: false Debug: false Info: true Warn: true Error: true Assert: true 

    È quindi ansible registrare il tag SMS a un livello di registro di INFO e sopra, ma non VERBOSE o DEBUG .

    Devo supporre che ciò impedisca alle applicazioni di accedere accidentalmente alle informazioni personali, ma sembra un modo abbastanza crudo di farlo.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.