Il debug e la diagnostica professionale delle applicazioni mobili sono competenze chiave per lo sviluppo mobile, che consentono di trovare e correggere errori nel codice. Secondo JetBrains Developer Ecosystem (2024), gli sviluppatori dedicano fino al 30% del loro tempo di lavoro al debug del codice. IT Sectr ha sviluppato proprie pratiche diagnostiche che riducono il tempo di ricerca dei bug del 40% grazie all'uso corretto degli strumenti di debug.
Punti chiave
Le applicazioni mobili vengono compilate in due configurazioni principali: Debug e Release. La build Debug include simboli di debug, non ottimizza il codice e utilizza una firma temporanea — ciò consente di impostare breakpoint, ispezionare variabili ed eseguire il codice passo dopo passo.
La build Release per lo sviluppo mobile è la versione finale per App Store e Google Play. Release ottimizza il codice, rimuove simboli e log non necessari e firma l'app con un certificato di produzione. Il debug su Release è impossibile — se un bug si riproduce solo su Release, sono necessari Crashlytics o altri crash reporter.
La strategia corretta per le app mobili: Debug per lo sviluppo, Release per i test prima della pubblicazione. IT Sectr consiglia di eseguire la build Release su dispositivi di test 2-3 giorni prima del rilascio per identificare problemi che non si manifestano in modalità Debug (ad esempio, offuscamento del codice o errori ProGuard/R8).
Debuggable=false è un'impostazione obbligatoria per Release in AndroidManifest. iOS Debug e Release differiscono per lo schema di build in Xcode — Debug include Debug executable, Release no. iOS ha anche una configurazione TestFlight (con crash report) e App Store.
Android Studio fornisce un set completo di strumenti per eseguire il debug e diagnosticare applicazioni mobili sulla piattaforma Android. Logcat è la console dei log di sistema Android, lo strumento principale per visualizzare i log, filtrabile per livello (Verbose, Debug, Info, Warn, Error), processo e tag.
Logcat mostra i log di tutti i processi sul dispositivo o emulatore. Ogni log ha un livello di priorità, un tag e un messaggio — usa Log.d(TAG, message) per messaggi di debug, Log.e per errori. Il filtraggio per tag è il modo migliore per trovare i tuoi log tra migliaia di messaggi di sistema.
Esempio di output log nello sviluppo mobile su Android:
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate started");
try {
initComponents();
Log.i(TAG, "Components initialized successfully");
} catch (Exception e) {
Log.e(TAG, "Failed to init components", e);
}
}
Layout Inspector — debugger visivo dell'interfaccia per Android, mostra la gerarchia delle View, gli attributi di ogni elemento e la sua posizione sullo schermo. Consente di verificare i parametri di layout, padding, margin, visibilità e dimensioni del testo su un'app in esecuzione.
Database Inspector — visualizza e modifica i database SQLite direttamente in Android Studio, mostra il contenuto di tutte le tabelle, consente di eseguire query SQL e modificare dati in tempo reale — uno strumento indispensabile per eseguire il debug di query Room e ContentProvider.
Network Inspector — tiene traccia di tutte le richieste HTTP dell'app, mostrando URL, intestazioni, corpo della richiesta e risposta, tempo di esecuzione e codice di stato. Aiuta a eseguire il debug dell'API REST, verificare la correttezza della serializzazione e rilevare richieste lente.
Il debug e la diagnostica completi delle applicazioni mobili su Android richiedono la padronanza di tutti gli strumenti elencati. Android Studio li combina in un unico IDE per una maggiore efficienza.
Xcode fornisce un set simile di strumenti per eseguire il debug e diagnosticare applicazioni mobili su iOS. Console è l'equivalente iOS di Logcat, che mostra i log di sistema e dell'app raggruppati per categoria e livello (OSLogType).
Memory Graph Debugger è uno strumento visivo per rilevare retain cycle e perdite di memoria, che mostra un grafico di tutti gli oggetti in memoria con i loro riferimenti. I nodi rossi indicano perdite — oggetti che avrebbero dovuto essere liberati ma sono ancora in memoria.
Uso di Memory Graph: esegui l'app, fai clic sul pulsante Debug Memory Graph in Xcode, seleziona un oggetto e ispeziona i suoi riferimenti in entrata. Un retain cycle appare come una dipendenza circolare: l'oggetto A trattiene l'oggetto B, l'oggetto B trattiene l'oggetto A. La soluzione è usare riferimenti deboli o non posseduti nelle closure.
View Hierarchy Debugger è l'equivalente iOS di Layout Inspector, che mostra una visualizzazione 3D di tutte le UIView sullo schermo con la loro gerarchia, vincoli e attributi. Consente di selezionare qualsiasi elemento per vedere la sua posizione, colore, dimensione e vincoli di layout.
Heap Dump è un'istantanea dell'intera memoria dell'app, la cui analisi aiuta a trovare oggetti che non vengono liberati e a stimare l'utilizzo totale di memoria di ogni classe. In Xcode, Heap Dump è disponibile tramite Memory Report in Debug Navigator.
LLDB è un debugger di basso livello per applicazioni C, Objective-C e Swift, che supporta breakpoint, watchpoint, dump assembly e modifica dinamica delle variabili. Il comando po (print object) in LLDB restituisce la descrizione di qualsiasi oggetto in memoria.
Watchpoint è un punto di interruzione che si attiva quando cambia il valore di una variabile, utile per tracciare chi e quando modifica il valore di un campo oggetto. A differenza di un breakpoint, che si attiva in una riga specifica, un watchpoint si attiva a qualsiasi modifica della memoria.
Il debug e la diagnostica professionali su iOS richiedono esperienza con Xcode e comprensione della gestione della memoria. Apple fornisce documentazione completa per ogni strumento di debug.
Gli strumenti proxy sono essenziali per diagnosticare i problemi di rete nelle applicazioni mobili. Charles Proxy è il proxy HTTP più popolare per lo sviluppo mobile, che consente di intercettare, visualizzare e modificare le richieste tra l'app e il server.
Charles Proxy funge da intermediario: configuri il dispositivo per utilizzare Charles come proxy (solitamente IP del computer, porta 8888). Charles mostra tutte le richieste HTTP e HTTPS con la possibilità di visualizzare intestazioni, corpo, cookie e tempo di esecuzione. SSL Proxying consente di decrittare il traffico HTTPS per l'analisi.
Funzionalità di Charles: Breakpoints (mettere in pausa una richiesta per modificarla), Rewrite (modifica automatica delle richieste), Map Local (sostituire le risposte con file locali). Map Local è indispensabile per testare senza API reale — restituisci un JSON preparato in anticipo invece di una risposta del server.
Proxyman è un'alternativa moderna a Charles per macOS con interfaccia più pulita, migliore supporto per M1 e M2 e protezione della privacy. Supporta le stesse funzionalità: intercettazione, proxy SSL, modifica delle richieste e script per la modifica automatica del traffico.
Wireshark è un analizzatore di traffico professionale per la diagnostica di rete approfondita, che analizza tutti i livelli OSI: TCP, DNS, handshake TLS, ICMP. Utilizzato per diagnosticare connessioni lente, problemi DNS ed errori di rete di basso livello.
Stetho è una libreria di Facebook per eseguire il debug di app Android tramite il browser Chrome, che consente di visualizzare database, richieste di rete, View Hierarchy e Shared Preferences tramite Chrome DevTools. Flipper è il successore di Stetho con supporto iOS e architettura a plugin.
I client API vengono utilizzati per eseguire il debug e diagnosticare il backend delle applicazioni mobili senza eseguire l'app stessa. Postman è il client API più popolare con raccolte, test e automazione, che consente di inviare richieste GET, POST, PUT, DELETE e gestire intestazioni, cookie e variabili d'ambiente.
Insomnia è un'alternativa leggera e open source a Postman con interfaccia più veloce, supporto GraphQL integrato e migliore organizzazione delle raccolte. Supporta plugin: temi, esportazione, generazione di codice in diversi linguaggi.
Httpie è un client HTTP da riga di comando con output leggibile, che mostra la risposta JSON colorata, le intestazioni e lo stato direttamente nel terminale. Adatto per controlli API rapidi senza aprire un'applicazione GUI.
Esempio di utilizzo di Httpie:
http POST https://api.example.com/v1/users \
"Authorization: Bearer token123" \
name="John" email="john@example.com"
IT Sectr raccomanda la combinazione: Postman per analisi e documentazione API + Httpie per controlli rapidi. Importa una raccolta Postman dalla specifica Swagger o OpenAPI — questo garantisce che gli endpoint testati corrispondano alla documentazione del server.
| Strumento | Piattaforma | Tipo di debug | Gratuito | Miglior utilizzo |
|---|---|---|---|---|
| Logcat | Android | Registrazione | + | Visualizzare i log dell'app e di sistema |
| Layout Inspector | Android | UI/View | + | Verificare gerarchia e attributi delle View |
| Memory Graph | iOS | Memoria | + | Diagnostica delle perdite di memoria |
| View Hierarchy | iOS | UI/View | + | Visualizzazione 3D di UIView |
| Charles Proxy | iOS/Android | Rete | Prova 30 giorni | Intercettazione traffico HTTP/HTTPS |
| Proxyman | iOS/Android | Rete | + (limitato) | Proxy HTTP moderno per macOS |
| Wireshark | Tutte le piattaforme | Rete (profondo) | + | Analisi di tutti i livelli OSI |
| Postman | Tutte le piattaforme | API | + | Test API REST/GraphQL |
| Insomnia | Tutte le piattaforme | API | + | Alternativa a Postman con GraphQL |
| LLDB | iOS/macOS | Basso livello | + | Debug passo-passo, assembly |
Domande frequenti
La build Debug contiene simboli di debug, non ottimizza il codice e usa una firma temporanea. La build Release ottimizza il codice, rimuove i log, offusca e firma con un certificato di produzione. Debug si installa via USB o emulatore, Release — tramite App Store o Google Play.
Usa Memory Profiler in Android Studio — mostra gli oggetti allocati e liberati e gli eventi GC. Esegui un Heap Dump e analizza gli oggetti che non vengono liberati. Cerca istanze di Activity e Fragment che rimangono in memoria dopo finish(). Usa LeakCanary — la libreria rileva automaticamente le perdite.
Sul computer: attiva SSL Proxying in Charles (Proxy → SSL Proxying Settings). Sul dispositivo: installa il certificato CA di Charles (chls.pro/ssl) e fidati di esso nelle impostazioni. Su iOS 13+, attiva la fiducia del certificato in General → About → Certificate Trust Settings. Su Android 7+ è necessaria la configurazione network_security_config.xml.
Un breakpoint interrompe l'esecuzione in una riga specifica di codice. Un watchpoint interrompe l'esecuzione quando cambia il valore di una variabile. Un breakpoint si attiva ogni volta che si raggiunge la riga, un watchpoint si attiva a qualsiasi modifica della memoria tracciata. I watchpoint sono utili per trovare modifiche impreviste dei campi.
Usa Apollo DevTools (estensione del browser) o Insomnia con supporto GraphQL. Charles e Proxyman intercettano le richieste GraphQL come normali HTTP POST — puoi visualizzare query, variabili e risposte. Per il debug dettagliato — Apollo Client Developer Tools.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.