01/07/2024
Afprøvning af Netværkstrafik i Android Apps: En Dybdegående Guide
I den moderne app-udviklingsverden, hvor tredjeparts SDK'er er en integreret del af mange applikationer, opstår ofte behovet for at forstå og overvåge den netværkstrafik, disse SDK'er genererer. Specielt når man arbejder med populære SDK'er som Google Analytics og Facebook SDK, kan det være afgørende at kunne spore alle GET- og POST-anmodninger for at diagnosticere problemer, optimere ydeevne eller blot for at opnå en dybere indsigt i appens funktionalitet. Mens eksterne værktøjer som Fiddler og Charles Proxy er effektive til at afprøve netværkstrafik generelt, giver de ikke altid mulighed for at registrere denne trafik direkte inden for selve appen, hvilket kan være en begrænsning, når man ønsker en integreret løsningsmodel.

Denne artikel dykker ned i, hvordan du kan opnå dette ved at implementere løsninger direkte i din Android-app. Vi vil udforske forskellige metoder til at intercept'e og logge al HTTP-trafik, herunder både GET- og POST-anmodninger, som dine anvendte SDK'er foretager. Målet er at give dig de nødvendige værktøjer og viden til at kunne analysere din apps netværksadfærd uden at skulle forlade appens udviklingsmiljø.
Forståelse af Netværkstrafik på Android
Android-platformen tilbyder flere måder at interagere med og overvåge netværkstrafik på. Når en app sender data til en server eller modtager data fra den, sker dette typisk via HTTP- eller HTTPS-protokoller. For at kunne overvåge denne kommunikation skal vi finde en måde at "lytte" til de netværksanmodninger, der sendes fra appen. Dette kan gøres på flere niveauer, men for at opnå en integreret løsning, der virker inden for appen, skal vi fokusere på metoder, der kan implementeres i selve appens kode eller via udviklingsværktøjer, der integrerer tæt med appen.
Metoder til Netværksafprøvning i Android
Der findes primært to tilgange til at afprøve netværkstrafik fra en Android-app: eksterne proxy-værktøjer og interne, kodebaserede løsninger.

1. Eksterne Proxy-Værktøjer (Charles, Fiddler)
Som nævnt er værktøjer som Charles Proxy og Fiddler yderst populære til at analysere netværkstrafik. Disse fungerer ved at oprette en lokal proxy-server på din computer, som din Android-enhed konfigureres til at sende sin trafik igennem. Fordelen er, at de giver en detaljeret oversigt over alle anmodninger og svar, inklusive headers, payloads og SSL-dekryptering. Ulempen, som du påpeger, er, at de opererer uden for selve appen, hvilket ikke opfylder kravet om at registrere trafikken *i* appen.
2. Interne Løsninger via Kode
For at kunne registrere HTTP-kald direkte i din app, skal du implementere en form for netværksaflytning i din egen app-kode. Dette kan opnås ved at:
- Implementere en brugerdefineret `OkHttpClient` (med Retrofit/Volley): Hvis din app bruger biblioteker som Retrofit eller Volley til netværksanmodninger, kan du ofte konfigurere disse til at bruge en tilpasset `OkHttpClient`. Ved at tilføje en interceptor til denne klient, kan du fange alle anmodninger og svar, før de sendes eller efter de modtages. Denne interceptor kan derefter bruges til at logge dataene.
- Brug af Android Network Security Configuration: Fra Android 7.0 (API level 24) kan du bruge Network Security Configuration til at definere netværkssikkerhedspolitikker for din app. Selvom dette primært bruges til at styre SSL/TLS-certifikater, kan det også konfigureres til at tillade debugging af trafik, hvilket kan være nyttigt i kombination med andre værktøjer.
- Brug af Debugging-Værktøjer (Android Studio Network Inspector): Android Studio indeholder en Network Inspector, der giver dig mulighed for at inspicere netværkstrafik fra din kørende app. Dette er en integreret løsning, der giver detaljeret indsigt i dine app's netværksanmodninger. Du kan se alle HTTP/HTTPS-anmodninger, deres payloads, headers og responstider. Dette er en af de mest tilgængelige metoder til at overvåge trafikken direkte under udvikling og test.
Detaljeret Implementering af Interceptors
Lad os se nærmere på, hvordan du kan implementere en netværksinterceptor i din app, hvis du bruger Retrofit med OkHttpClient, da dette er en meget almindelig konfiguration.
Du kan oprette en simpel interceptor, der logger detaljerne om hver anmodning og respons. Her er et eksempel på, hvordan en sådan interceptor kan se ud:
import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; import okio.Buffer; import java.io.IOException; public class LoggingInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); // Log request details System.out.println("Sending request: " + request.url()); System.out.println("Method: " + request.method()); if (request.headers().size() > 0) { System.out.println("Request Headers: " + request.headers()); } if (request.body() != null) { Buffer buffer = new Buffer(); request.body().writeTo(buffer); System.out.println("Request Body: " + buffer.readUtf8()); } // Proceed with the request Response response = chain.proceed(request); // Log response details System.out.println("Received response: " + response.code()); if (response.headers().size() > 0) { System.out.println("Response Headers: " + response.headers()); } ResponseBody responseBody = response.peekBody(Long.MAX_VALUE); System.out.println("Response Body: " + responseBody.string()); return response; } } For at bruge denne interceptor, skal du tilføje den til din OkHttpClient-instans, når du opretter din Retrofit-instans:
OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new LoggingInterceptor()) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl("YOUR_BASE_URL") .client(client) .build(); Denne interceptor vil nu logge alle detaljer om de netværksanmodninger, der sendes via denne OkHttpClient. Du kan udvide denne logik til at gemme disse oplysninger i appens interne lager, sende dem til en analyse-tjeneste eller vise dem i et dedikeret UI-element i din app.

Håndtering af HTTPS-trafik
Når det kommer til HTTPS-trafik, er der en ekstra udfordring: kryptering. For at kunne inspicere indholdet af HTTPS-anmodninger, skal du som regel have en måde at dekryptere dem på. Eksterne værktøjer som Charles og Fiddler gør dette ved at fungere som en "Man-in-the-Middle" (MITM), hvor de genererer et certifikat, som din enhed stoler på. Dette er dog ikke direkte muligt at implementere i din app uden at påvirke appens sikkerhed eller kræve specifikke brugerrettigheder.
Hvis du ønsker at logge HTTPS-trafik fra din egen app, er den mest ligetil metode at bruge Android Studio's Network Inspector, som er designet til at håndtere SSL-certifikater korrekt under udvikling. Alternativt kan du, som foreslået i nogle svar, bruge en "dirty trick" med ARP spoofing og Wireshark på et lokalt netværk, men dette er en avanceret metode, der kræver netværkskendskab og ikke er egnet til direkte integration i appen.
Overvågning af Tredjeparts SDK'er
Når du bruger SDK'er som Google Analytics eller Facebook SDK, foretager disse SDK'er ofte deres egne netværkskald, som du måske ikke har direkte kontrol over. Ved at implementere en global netværksinterceptor som beskrevet ovenfor, kan du dog fange selv disse kald, forudsat at de bruger standard HTTP-klienter, som din interceptor kan påvirke.

Det er vigtigt at bemærke, at nogle SDK'er kan bruge deres egne, lukkede netværksimplementeringer eller skjule deres anmodninger på måder, der gør dem sværere at aflytte med simple interceptors. I sådanne tilfælde kan det være nødvendigt at dykke dybere ned i SDK'ernes dokumentation eller endda bruge mere avancerede debugging-teknikker.
Tabel: Sammenligning af Metoder
| Metode | Fordele | Ulemper | Integreret i App? |
|---|---|---|---|
| Charles Proxy / Fiddler | Detaljeret analyse, SSL-dekryptering, bredt anvendeligt. | Kræver ekstern opsætning, ikke direkte i appen. | Nej |
| Kode-interceptor (OkHttpClient) | Direkte logning i appen, fuld kontrol over data. | Kræver kodeændringer, kan være komplekst for HTTPS. | Ja |
| Android Studio Network Inspector | Nem at bruge, integreret i IDE, god til debugging. | Kræver kørende app i debug-mode, ikke til produktion. | Ja (via IDE) |
| Network Security Configuration | Sikkerhedskontrol, debugging af trafik. | Primært til certifikatstyring, kræver Android 7+. | Delvist (konfiguration) |
Ofte Stillede Spørgsmål (FAQ)
- Kan jeg aflytte alle netværkskald fra min Android-app uden at ændre SDK-koden? Ja, ved at implementere en global netværksinterceptor, der fanger anmodninger fra de underliggende netværksbiblioteker, som SDK'erne bruger.
- Hvordan logger jeg HTTPS-trafik direkte i min app? Det er udfordrende på grund af kryptering. Android Studio's Network Inspector er den mest praktiske metode under udvikling. For produktion er det generelt ikke anbefalet eller muligt uden specielle tilladelser.
- Hvad er den bedste metode til at registrere netværkskald fra Google Analytics SDK? Brug Android Studio's Network Inspector eller en OkHttpClient-interceptor, hvis du bruger Retrofit/Volley.
- Kan jeg se data fra enhedens Wi-Fi-netværk i min app? Nej, din app kan kun se sin egen netværkstrafik eller den trafik, der bevidst dirigeres igennem den.
Konklusion
At afprøve og overvåge netværkstrafik fra din Android-app, især når det involverer tredjeparts SDK'er, er en værdifuld færdighed for enhver udvikler. Mens eksterne værktøjer tilbyder en bred vifte af funktioner, er der effektive måder at opnå en integreret løsning på ved at implementere netværksinterceptors direkte i din app-kode eller ved at udnytte Android Studio's indbyggede debugging-værktøjer. Ved at følge disse metoder kan du få et dybdegående kendskab til din apps netværksadfærd og dermed forbedre dens ydeevne og stabilitet.
Hvis du vil læse andre artikler, der ligner Afprøvning af netværkstrafik på Android, kan du besøge kategorien Teknologi.
