Debug delle app Android con Stetho di Facebook

introduzione

Stetho è una piattaforma di debug open source, sviluppata da Facebook, che offre agli sviluppatori Android un'esperienza di debug ricca e altamente interattiva. Con Stetho, il debugging delle app Android native diventa semplice come eseguire il debug di una pagina Web, perché consente di utilizzare gli strumenti di sviluppo di Google Chrome per eseguire varie attività di debug, come ispezione della gerarchia delle viste, ispezione della rete, gestione dei database SQLite e altro.

In questo tutorial, imparerai come aggiungere Stetho a un progetto Android e utilizzare sia gli strumenti di sviluppo di Google Chrome sia l'utilità della riga di comando di Stetho, dumpapp, per eseguire il debug.

1. Aggiunta delle dipendenze di Gradle

Per aggiungere la libreria Stetho al tuo progetto, aggiungi com.facebook.stetho: Stetho come un compilare dipendenza nel App modulo di build.gradle file:

java compile 'com.facebook.stetho: stetho: 1.1.1'

In questo tutorial, userai OkHttp, una popolare libreria di rete di Square, per gestire tutte le connessioni di rete, perché funziona molto bene con Stetho. Aggiungilo come un altro compilare dipendenza:

java compile 'com.facebook.stetho: stetho-okhttp: 1.1.1'

2. Inizializzazione di Stetho

Passaggio 1: creazione di un messaggio personalizzato Applicazione Classe

Il momento migliore per inizializzare Stetho è quando la tua applicazione sta iniziando. Pertanto, devi creare una nuova classe che si estende Applicazione e inizializza lo Stetho al suo interno onCreate metodo.

Crea una nuova classe chiamata La mia applicazione e scavalca il suo onCreate metodo:

"java public class MyApplication estende l'applicazione

@Override public void onCreate () super.onCreate ();  "

Per inizializzare Stetho, devi prima creare un'istanza di Stetho.InitializerBuilder, usando il Stetho.newInitializerBuilder metodo. Quindi, per consentire a Stetho di funzionare con gli strumenti di sviluppo di Chrome, devi chiamare enableWebKitInspector. Se si desidera abilitare anche dumpapp, è necessario chiamare enableDumpapp. Una volta Stetho.InitializerBuilder è pronto, puoi chiamarlo costruire metodo per generare un initializer oggetto e passalo al Stetho.initialize metodo.

Per ora, abilitiamo la funzionalità predefinita usando l'impostazione predefinita InspectorModulesProvider e DumperPluginsProvider. Aggiungi il seguente codice al onCreate metodo:

"java // Crea un InitializerBuilder Stetho.InitializerBuilder initializerBuilder = Stetho.newInitializerBuilder (this);

// Abilita inizializzatore Chrome DevToolsBuilder.enableWebKitInspector (Stetho.defaultInspectorModulesProvider (this));

// Abilita l'interfaccia della riga di comando initializerBuilder.enableDumpapp (Stetho.defaultDumperPluginsProvider (context));

// Usa InitializerBuilder per generare un inizializzatore Stetho.Initializer initializer = initializerBuilder.build ();

// Inizializza Stetho con Initializer Stetho.initialize (initializer); "

Passaggio 2: Modifica del manifest

Per far sapere al sistema operativo Android che hai un'abitudine Applicazione classe, aggiungi un attributo chiamato Android: nome a quello del manifest applicazione tag e imposta il valore sul nome della tua abitudine Applicazione classe.

"xml

...

"

3. Utilizzo di Chrome's DevTools

Dopo aver compilato e installato la tua app su un dispositivo Android (o sull'emulatore), avvia Google Chrome e digita chrome: // ispezionare nella barra degli indirizzi. Vedrai una schermata simile a questa:

Clicca il ispezionare link per aprire il Strumenti di sviluppo.

Passaggio 1: Ispezione delle connessioni di rete

Stetho ti consente di ispezionare, in tempo reale, le connessioni di rete effettuate dall'app. Tuttavia, in Stetho versione 1.1.1, funziona solo con la libreria di rete OkHttp. Quando usi OkHttp con Stetho, dovresti ricordare di aggiungere un StethoInterceptor al OkHttpClient oggetto di Elenco di intercettori di rete.

Ecco un codice di esempio che si collega a HttpBin e recupera un documento JSON:

"java // Crea un'istanza di OkHttpClient OkHttpClient httpClient = new OkHttpClient ();

// Aggiungi Stetho interceptor httpClient.networkInterceptors (). Add (new StethoInterceptor ());

prova // Recupera i contenuti di http://httpbin.org/ip Response response = httpClient.newCall (new Request.Builder (). url ("http://httpbin.org/ip") .build ()) .eseguire();

catch (IOException ioe) Log.d ("StethoTut", ioe.getMessage ()); "

Quando il codice viene eseguito, vedrai quanto segue in Rete scheda del Strumenti di sviluppo finestra:

Se fai clic sull'URL nella prima colonna, verrai indirizzato a una schermata che visualizza ulteriori informazioni sulla risposta:

Passaggio 2: interrogazione dei database SQLite

Con Stetho, puoi eseguire molte operazioni sui database SQLite della tua app. Clicca il risorse scheda e selezionare SQL Web. Se la tua app ha database SQLite, saranno elencati qui. La selezione di un database mostra un elenco delle tabelle nel database. Infine, facendo clic su una tabella vengono visualizzati i record della tabella:

È anche possibile eseguire query SQL dopo aver selezionato un database SQLite:

Passaggio 3: manipolazione delle preferenze dell'app

Per visualizzare le tue app SharedPreferences, apri il risorse scheda del Strumenti di sviluppo finestra e selezionare Memoria locale. Vedrai i nomi dei file utilizzati dalla tua app per memorizzare le preferenze. Facendo clic su un file vengono visualizzate le coppie chiave-valore memorizzate in quel file:

Puoi persino modificare i valori memorizzati in un file:

Nota che qualsiasi modifica apportata ai valori è permanente.

4. Utilizzo di dumpapp

Passaggio 1: download di dumpapp

dumpapp è una potente utility che ti permette di manipolare la tua app Android dalla riga di comando. Puoi ottenerlo clonando il repository di Stetho:

bash git clone https://github.com/facebook/stetho

Dato che dumpapp è uno script Python, dovresti avere l'ultima versione di Python installata sul tuo computer per usarla.

Passaggio 2: utilizzo dei plug-in

Per visualizzare un elenco di plug-in disponibili, immettere Stetho / scripts directory ed eseguire il seguente comando:

bash ./dumpapp -l

L'output è simile a questo:

Usiamo il plugin chiamato prefs. Questo plugin è utilizzato per visualizzare e modificare i valori memorizzati nella tua app SharedPreferences. Ad esempio, il seguente comando elenca tutte le coppie chiave-valore memorizzate nella tua app SharedPreferences:

bash ./dumpapp stampa prefs

L'output è simile a questo:

Passaggio 3: creazione di un plug-in personalizzato

I plugin dumpapp personalizzati sono semplicemente classi Java che implementano il DumperPlugin interfaccia. Creiamo un semplice plug-in che stampa il nome del pacchetto dell'app in prova.

Crea una nuova classe all'interno di La mia applicazione classe chiamata MyDumperPlugin. Dopo aver scavalcato i metodi di DumperPlugin interfaccia, la tua classe dovrebbe assomigliare a questa:

"classe java MyDumperPlugin implementa DumperPlugin @Override public String getName ()

@Override public void dump (DumperContext dumpContext) genera DumpException  "

Il getName il metodo dovrebbe restituire il nome del plugin. Per restituire il valore my_plugin, aggiungi il seguente codice al getName metodo:

java return "my_plugin";

Il cumulo di rifiuti metodo è il metodo che viene chiamato quando si esegue il plug-in dalla riga di comando. Il DumperContext fornisce vari flussi I / O, che consentono di leggere dalla riga di comando o scrivere su di esso. Per ora, useremo solo l'output standard. Aggiungi il seguente codice al cumulo di rifiuti metodo per ottenere un riferimento al flusso di output standard:

java PrintStream out = dumpContext.getStdout ();

Perché questo plugin fa parte del La mia applicazione classe, per ottenere il nome del pacchetto dell'app, è possibile chiamare direttamente il getPackageName metodo. Una volta che hai il nome del pacchetto, stampalo usando il PrintStream oggetto di println metodo:

java out.println (MyApplication.this.getPackageName ());

Il tuo plugin personalizzato è ora pronto per l'uso.

Passaggio 4: creazione di un provider di plugin personalizzati

Il plug-in che hai creato nel passaggio precedente non sarà disponibile su Stetho a meno che non crei un provider di plug-in personalizzati e lo usi durante l'inizializzazione di Stetho. Un fornitore di plug-in personalizzato è una classe che implementa il DumperPluginsProvider interfaccia.

Creiamo un fornitore di plugin personalizzato chiamato MyDumperPluginsProvider. Crea questa classe dentro il La mia applicazione classe. Dopo aver scavalcato l'unico metodo di DumperPluginsProvider interfaccia, la tua classe dovrebbe assomigliare a questa:

"classe java MyDumperPluginsProvider implementa DumperPluginsProvider @Override public Iterable ottenere()

 "

Perché il ottenere metodo restituisce un iterable, tutto ciò che devi fare è creare un elenco, aggiungere il tuo plug-in personalizzato all'elenco e restituire l'elenco. Il codice per farlo sarebbe simile a questo:

"java // Crea una lista ArrayList plugins = new ArrayList <> ();

// Aggiungi uno o più plugin personalizzati plugins.add (new MyDumperPlugin ());

// Restituisce i plugin di restituzione della lista; "

Tuttavia, poiché il tuo provider di plug-in personalizzati iterable non include i plug-in predefiniti, non sarà possibile utilizzarli durante l'esecuzione di dumpapp. Se si desidera utilizzare sia i plug-in personalizzati che quelli predefiniti, è necessario aggiungere i plug-in predefiniti al proprio Lista di array. Per ottenere l'elenco dei plugin predefiniti, devi chiamare il ottenere metodo del provider di plug-in restituito da defaultDumperPluginsProvider metodo.

"java // Aggiungi plug-in predefiniti per conservare la funzionalità originale

for (DumperPlugin plugin: Stetho.defaultDumperPluginsProvider (MyApplication.this) .get ()) plugins.add (plugin); "

Il tuo fornitore di plug-in personalizzati è ora pronto. Per usarlo, vai al onCreate metodo e passare un'istanza di esso al enableDumpapp chiamata:

java initializerBuilder.enableDumpapp (new MyDumperPluginProvider ());

Passaggio 5: utilizzo del plug-in personalizzato

Elenca di nuovo tutti i plugin disponibili usando il dumpapp -l chiamata. Vedrai il nome del tuo plugin personalizzato nell'elenco:

Per eseguirlo, eseguire il seguente comando:

bash ./dumpapp my_plugin

Dovrebbe stampare il nome del pacchetto della tua app:

Conclusione

In questo tutorial, hai imparato a usare Stetho nei tuoi progetti Android. Hai anche imparato a utilizzare sia l'interfaccia a riga di comando, dumpapp e gli strumenti di sviluppo di Google Chrome per eseguire il debug delle tue app. Ormai, devi aver capito che, sebbene Stetho non possa ancora sostituire completamente il debugger di Android Studio, offre sicuramente funzionalità che possono migliorare significativamente la tua esperienza di debug.

Per ulteriori informazioni su Stetho, consultare il codice e la documentazione disponibili sul repository GitHub.