quinta-feira, 2 de outubro de 2014

[Android] Obtendo Log via shell

Caso a aplicação use uma única TAG em todas as mensagens de log

Pode-se usar a seguinte linha:
adb logcat <TAG>:* *:S
Onde o :* indica todos os níveis de log e o *:S indica que todas as outras tags devem ser ignoradas.

No código isso pode ser feito, por exemplo, numa classe C com todas as constantes do projeto:
public class C {
  public static final String TAG = "MeuProjeto";
}

Usa-se essa constante em todas as classes:
public class MyActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    Log.d(C.TAG, "MyActivity.onCreate");
  }
}

Caso a aplicação use uma TAG para cada classe/módulo

Primeiro é preciso identificar o PID (Process Identifier) da aplicação com:
adb logcat <alguma TAG da aplicação>:* *:S
o valor entre ( e ) é o PID.

Depois basta filtrar as mensagens de log com:
adb logcat | grep <PID>

Pode acontecer de o PID mudar. Por exemplo, após uma mensagem:
ActivityManager( 2941): No longer want <pacote da aplicação> (pid 17621) (adj 15) : empty #25
nesse caso executa-se o primeiro passo novamente.

No código cria-se uma constante em cada classe:
public class MyActivity extends Activity {
  public static final String TAG = "MyActivity";
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    Log.d(TAG, "onCreate");
  }
}

Referências

http://developer.android.com/tools/debugging/debugging-log.html