Het debuggen van Android-apps met Stetho van Facebook

Invoering

Stetho is een opensource-debuggingplatform, ontwikkeld door Facebook, dat Android-ontwikkelaars een rijke en zeer interactieve debugging-ervaring biedt. Met Stetho wordt het debuggen van native Android-apps net zo eenvoudig als het debuggen van een webpagina, omdat u hiermee de ontwikkelaarstools van Google Chrome kunt gebruiken om verschillende foutopsporingsactiviteiten uit te voeren, zoals inspectie van de hiërarchie van de weergave, netwerkinspectie, SQLite-databasebeheer en meer.

In deze tutorial leer je hoe je Stetho kunt toevoegen aan een Android-project en zowel de ontwikkelaarstools van Google Chrome als het opdrachtregelhulpprogramma van Stetho kunt gebruiken, dumpapp, om het te debuggen.

1. Gradle-afhankelijkheden toevoegen

Voeg toe om de Stetho-bibliotheek aan uw project toe te voegen com.facebook.stetho: Stetho als een compileren afhankelijkheid in de app module build.gradle het dossier:

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

In deze zelfstudie zult u gebruiken OkHttp, een populaire netwerkbibliotheek van Square om alle netwerkverbindingen te beheren, omdat het heel goed met Stetho speelt. Voeg het toe als een ander compileren afhankelijkheid:

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

2. Stetho initialiseren

Stap 1: Een aangepast maken Toepassing Klasse

De beste tijd om Stetho te initialiseren is wanneer uw toepassing start. Daarom moet u een nieuwe klasse maken die wordt uitgebreid Toepassing en initialiseer Stetho binnen zijn onCreate methode.

Maak een nieuwe klasse genaamd Mijn aanvraag en negeer het onCreate methode:

"java public class MyApplication breidt Application uit

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

Om Stetho te initialiseren, moet u eerst een instantie maken van Stetho.InitializerBuilder, de ... gebruiken Stetho.newInitializerBuilder methode. Vervolgens moet u bellen om Stetho toe te laten om met de ontwikkelaarstools van Chrome te werken enableWebKitInspector. Als u ook de dumpapp wilt inschakelen, moet u bellen enableDumpapp. Een keer Stetho.InitializerBuilder is klaar, je kunt het bellen bouwen methode om een ​​te genereren initializer object en geef het door aan de Stetho.initialize methode.

Laten we voorlopig de standaardfunctionaliteit inschakelen door de standaardinstelling te gebruiken InspectorModulesProvider en DumperPluginsProvider. Voeg de volgende code toe aan de onCreate methode:

"java // Maak een Initializer Builder Stetho.InitializerBuilder initializerBuilder = Stetho.newInitializerBuilder (this);

// Schakel Chrome DevTools initializerBuilder.enableWebKitInspector in (Stetho.defaultInspectorModulesProvider (this));

// Schakel de interface van de opdrachtregelinterface inBuilder.enableDumpapp (Stetho.defaultDumperPluginsProvider (context));

// Gebruik de Initializer Builder om een ​​Initializer Stetho.Initializer initializer = initializerBuilder.build () te genereren;

// Initialiseer Stetho met de Initializer Stetho.initialize (initializer); "

Stap 2: Het manifest bewerken

Laat het Android-besturingssysteem weten dat je een aangepaste hebt Toepassing klasse, voeg een kenmerk toe met de naam android: naam naar de manifesten toepassing label en stel de waarde in op de naam van uw gebruik Toepassing klasse.

"xml

...

"

3. Gebruik van de DevTools van Chrome

Na het compileren en installeren van uw app op een Android-apparaat (of de emulator), start u Google Chrome en typt u in chrome: // inspecteren in de adresbalk. U ziet een scherm dat er als volgt uitziet:

Klik op de inspecteren link om het te openen Ontwikkelaarstools.

Stap 1: Inspecteren van netwerkverbindingen

Met Stetho kunt u in realtime de netwerkverbindingen controleren die uw app maakt. In Stetho versie 1.1.1 werkt dit echter alleen met de OkHttp netwerkbibliotheek. Wanneer u OkHttp met Stetho gebruikt, moet u eraan denken om een StethoInterceptor naar de OkHttpClient voorwerpen Lijst van netwerkonderscheppers.

Hier is een voorbeeldcode die verbinding maakt met HttpBin en een JSON-document ophaalt:

"java // Maak een instantie van OkHttpClient OkHttpClient httpClient = new OkHttpClient ();

// Voeg Stetho interceptor httpClient.networkInterceptors (). Add toe (nieuwe StethoInterceptor ());

probeer // Haal de inhoud van http://httpbin.org/ip op Reactieantwoord = httpClient.newCall (nieuw Request.Builder (). url ("http://httpbin.org/ip") .build ()) .execute ();

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

Wanneer de code wordt uitgevoerd, ziet u het volgende in de Netwerk tabblad van de Ontwikkelaarstools venster:

Als u op de URL in de eerste kolom klikt, wordt u naar een scherm geleid met meer informatie over het antwoord:

Stap 2: SQLite-databases opvragen

Met Stetho kunt u veel bewerkingen uitvoeren in de SQLite-databases van uw app. Klik op de Middelen tab en selecteer Web SQL. Als uw app SQLite-databases heeft, worden deze hier weergegeven. Het selecteren van een database toont een lijst van de tabellen in de database. Als u tenslotte op een tabel klikt, worden de records van de tabel weergegeven:

U kunt ook SQL-query's uitvoeren nadat u een SQLite-database hebt geselecteerd:

Stap 3: De voorkeuren van uw app manipuleren

Om uw app's te bekijken Gedeelde voorkeuren, open de Middelen tabblad van de Ontwikkelaarstools venster en selecteer Lokale opslag. U ziet de namen van de bestanden die uw app gebruikt om de voorkeuren op te slaan. Als u op een bestand klikt, worden de sleutelwaardeparen weergegeven die in dat bestand zijn opgeslagen:

U kunt zelfs de waarden bewerken die in een bestand zijn opgeslagen:

Houd er rekening mee dat alle wijzigingen die u aanbrengt in de waarden permanent zijn.

4. Dumpapp gebruiken

Stap 1: dumpapp downloaden

dumpapp is een krachtig hulpprogramma waarmee je je Android-app kunt manipuleren via de opdrachtregel. Je kunt het krijgen door de repository van Stetho te klonen:

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

Omdat dumpapp een Python-script is, moet de nieuwste versie van Python op uw computer zijn geïnstalleerd om deze te gebruiken.

Stap 2: Plug-ins gebruiken

Om een ​​lijst met beschikbare plug-ins te bekijken, voert u het Stetho / scripts map en voer de volgende opdracht uit:

bash ./dumpapp -l

De uitvoer ziet er ongeveer zo uit:

Laten we de plugin gebruiken die is genoemd prefs. Deze plug-in wordt gebruikt om de waarden te bekijken en te bewerken die zijn opgeslagen in uw app's Gedeelde voorkeuren. Met de volgende opdracht worden bijvoorbeeld alle sleutel / waarde-paren weergegeven die zijn opgeslagen in uw app's Gedeelde voorkeuren:

bash ./dumpapp geeft de voorkeur aan afdrukken

De uitvoer ziet er ongeveer zo uit:

Stap 3: Een aangepaste plug-in maken

Aangepaste dumpapp-plug-ins zijn eenvoudig Java-klassen die het DumperPlugin interface. Laten we een eenvoudige plug-in maken die de pakketnaam van de app die wordt getest, afdrukt.

Maak een nieuwe klas binnen de Mijn aanvraag klas genoemd MyDumperPlugin. Na het overschrijven van de methoden van de DumperPlugin interface, zou je klas er als volgt uit moeten zien:

"java class MyDumperPlugin implementeert DumperPlugin @Override public String getName ()

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

De getName methode moet de naam van de plug-in retourneren. Om de waarde te retourneren my_plugin, voeg de volgende code toe aan de getName methode:

java retourneert "my_plugin";

De stortplaats methode is de methode die wordt aangeroepen wanneer u de plug-in uitvoert vanaf de opdrachtregel. De DumperContext biedt verschillende I / O-streams, waarmee u de opdrachtregel kunt lezen of ernaar kunt schrijven. Voor nu gebruiken we alleen de standaarduitvoer. Voeg de volgende code toe aan de stortplaats methode om een ​​verwijzing naar de standaard uitvoerstroom te krijgen:

java PrintStream out = dumpContext.getStdout ();

Omdat deze plug-in deel uitmaakt van de Mijn aanvraag klasse, om de pakketnaam van de app te krijgen, kunt u rechtstreeks bellen met de getPackageName methode. Zodra u de pakketnaam hebt, drukt u deze af met behulp van de PrintStream voorwerpen println methode:

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

Uw aangepaste plug-in is nu klaar voor gebruik.

Stap 4: een leverancier van aangepaste plug-ins maken

De plug-in die u in de vorige stap hebt gemaakt, is niet beschikbaar voor Stetho, tenzij u een aangepaste plug-insprovider maakt en deze gebruikt tijdens het initialiseren van Stetho. Een aangepaste plug-insprovider is een klasse die de. Implementeert DumperPluginsProvider interface.

Laten we een aangepaste plug-insprovider maken genaamd MyDumperPluginsProvider. Maak deze klasse binnen de Mijn aanvraag klasse. Na het overschrijven van de enige methode van de DumperPluginsProvider interface, zou je klas er als volgt uit moeten zien:

"java class MyDumperPluginsProvider implementeert DumperPluginsProvider @Override public Interable get ()

 "

Omdat het krijgen methode retourneert een Iterable, het enige wat u hoeft te doen is een lijst maken, uw aangepaste plug-in toevoegen aan de lijst en de lijst retourneren. De code om dat te doen zou er als volgt uitzien:

"java // Maak een lijst ArrayList plugins = nieuwe ArrayList <> ();

// Voeg een of meer aangepaste plug-ins toe plugins.add (nieuwe MyDumperPlugin ());

// Retourneer de lijst return-plug-ins; "

Echter, omdat uw aangepaste plug-ins provider Iterable bevat niet de standaard plug-ins, u zult ze niet kunnen gebruiken tijdens het uitvoeren van dumpapp. Als u zowel de standaard als de standaard plug-ins samen wilt gebruiken, moet u de standaard plug-ins toevoegen aan uw ArrayList. Om de lijst met standaard plug-ins te krijgen, moet u de krijgen methode van de plug-ins provider geretourneerd door de defaultDumperPluginsProvider methode.

"java // Standaardplug-ins toevoegen om de oorspronkelijke functionaliteit te behouden

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

Uw aangepaste plug-ins-provider is nu klaar. Om het te gebruiken, gaat u naar onCreate methode en geef een instantie ervan door aan de enableDumpapp bellen:

java initializerBuilder.enableDumpapp (nieuwe MyDumperPluginProvider ());

Stap 5: De aangepaste plug-in gebruiken

Maak een lijst van alle beschikbare plug-ins opnieuw met behulp van de dumpapp -l noemen. U ziet de naam van uw aangepaste plug-in in de lijst:

Voer de volgende opdracht uit om het uit te voeren:

bash ./dumpapp my_plugin

Het moet de pakketnaam van uw app afdrukken:

Conclusie

In deze zelfstudie hebt u geleerd hoe u Stetho moet gebruiken in uw Android-projecten. Je hebt ook geleerd hoe je zowel de opdrachtregelinterface, dumpapp en de ontwikkelaarstools van Google Chrome kunt gebruiken om je apps te debuggen. Inmiddels moet je je realiseren dat, hoewel Stetho de debugger van Android Studio nog niet volledig kan vervangen, het zeker functies biedt die je foutopsporing aanzienlijk kunnen verbeteren.

Raadpleeg de code en documentatie die beschikbaar zijn in de GitHub-repository voor meer informatie over Stetho.