Debug dell'app

Android Studio mette a disposizione un debugger che ti consente di eseguire le seguenti operazioni e non solo:

  • Seleziona un dispositivo su cui eseguire il debug dell'app.
  • Imposta breakpoint nel codice Java, Kotlin e C/C++.
  • Esamina le variabili e valuta le espressioni in fase di esecuzione.

Questa pagina include istruzioni per le operazioni di base del debugger. Per ulteriori informazioni, consulta anche la documentazione di debug di IntelliJ IDEA.

Attivare il debug

Prima di iniziare il debug, segui questi passaggi:

Attiva il debug sul dispositivo.
Se utilizzi l'emulatore, il debug è abilitato per impostazione predefinita. Tuttavia, per un dispositivo connesso, devi abilitare il debug nelle opzioni sviluppatore del dispositivo.
Esegui una variante di build di cui è possibile eseguire il debug.

Utilizza una variante di build che include debuggable true (isDebuggable = true negli script Kotlin) nella configurazione della build.

In genere, puoi selezionare la variante "debug" predefinita inclusa in ogni progetto Android Studio, anche se non è visibile nel file build.gradle. Tuttavia, se definisci nuovi tipi di build che devono essere disassemblabili, devi aggiungere debuggable true al tipo di build:

Groovy

android {
    buildTypes {
        customDebugType {
            debuggable true
            ...
        }
    }
}

Kotlin

android {
    buildTypes {
        create("customDebugType") {
            isDebuggable = true
            ...
        }
    }
}

Questa proprietà si applica anche ai moduli con codice C/C++.

Nota:la proprietà jniDebuggable non è più utilizzata.

Se la tua app dipende da un modulo della raccolta che vuoi anche eseguire il debug, anche la raccolta deve essere pacchettizzata con debuggable true in modo da conservare i simboli di debug. Per assicurarti che le varianti di debug del progetto dell'app ricevano la variante di debug di un modulo della libreria, pubblica le versioni non predefinite della libreria.

Avvia debug

Per avviare una sessione di debug:

  1. Imposta i punti di interruzione nel codice della tua app.
  2. Nella barra degli strumenti, seleziona un dispositivo su cui eseguire il debug dell'app dal menu del dispositivo di destinazione.
    Menu Dispositivo di destinazione.
    Figura 1. Menu del dispositivo di destinazione.

    Se non hai configurato alcun dispositivo, devi collegarne uno tramite USB, collegarne uno tramite Wi-Fi o creare un AVD per utilizzare Android Emulator.

  3. Nella barra degli strumenti, fai clic su Debug .

    Se l'app è già in esecuzione sul dispositivo, viene visualizzata una finestra di dialogo che ti chiede se vuoi passare da Esegui a Debug. Il dispositivo dovrà essere riavviato per iniziare il debug. Per mantenere in esecuzione la stessa istanza dell'app, fai clic su Annulla debug e collega il debugger a un'app in esecuzione. In caso contrario, Android Studio compila un APK, lo firma con una chiave di debug, lo installa sul dispositivo selezionato e lo esegue.

    Se aggiungi codice C e C++ al tuo progetto, Android Studio esegue anche il debugger LLDB nella finestra di debug per eseguire il debug del codice nativo.

  4. Se la finestra Debug non è aperta, seleziona Visualizza > Finestre degli strumenti > Debug oppure fai clic su Debug nella barra della finestra degli strumenti.

Collega il debugger a un'app in esecuzione

Se l'app è già in esecuzione sul dispositivo, puoi avviare il debug senza riavviarla nel seguente modo:

  1. Fai clic su Collega il debugger al processo Android .
  2. Nella finestra di dialogo Scegli processo, seleziona il processo a cui vuoi collegare il debugger.
    1. Se utilizzi un emulatore o un dispositivo con root, puoi selezionare Mostra tutti i processi per visualizzare tutti i processi. Su un dispositivo con root, verranno visualizzate tutte le attività in esecuzione sul dispositivo. Tuttavia, su un dispositivo non rooted, verranno mostrati solo i processi di cui è possibile eseguire il debug.
    2. Dal menu Usa le impostazioni di Android Debugger da, puoi selezionare una configurazione di esecuzione/debug esistente. Per il codice C e C++, ti consente di riutilizzare i comandi di avvio LLDB, i comandi post-aggancio LLDB e le directory di simboli in una configurazione esistente.
    3. Se non hai una configurazione di esecuzione/debugging esistente, seleziona Crea nuova. Questa selezione attiva il menu Tipo di debug, in cui puoi selezionare un tipo di debug diverso. Per impostazione predefinita, Android Studio utilizza il tipo di debug Rileva automaticamente per selezionare l'opzione di debugger migliore per te in base al fatto che il progetto includa codice Java o C/C++.
  3. Fai clic su OK.

    Viene visualizzata la finestra di debug.

La scheda Processi in Esplora dispositivi (Visualizza > Finestre degli strumenti > Esplora dispositivi) contiene anche un elenco di processi di debug. Da qui puoi selezionare un processo ed eseguire un'operazione di terminazione , un'interruzione forzata di o collegare il debugger a un determinato processo .

La finestra di debug

Figura 2.La finestra Debug.

La finestra di debug è divisa in

  1. Barra degli strumenti di esecuzione e navigazione. Consulta l'articolo Utilizzare i punti di interruzione
  2. Selettore thread
  3. Valutazione e inserimento di espressioni di orologio. Consulta Esaminare le variabili.
  4. Visualizzazione della pila
  5. Riquadro Variabili. Consulta Esaminare le variabili.

Nota:il debugger e il garbage collector di Android Studio sono integrati in modo flessibile. La macchina virtuale Android garantisce che qualsiasi oggetto di cui il debugger sia a conoscenza non venga considerato garbage collection fino alla disconnessione del debugger. Ciò può causare l'accumulo di oggetti mentre il debugger è connesso. Ad esempio, se il debugger rileva un thread in esecuzione, l'oggetto Thread associato non viene sottoposto a garbage collection finché il debugger non si disconnette, anche se il thread è terminato.

Modificare il tipo di debugger

Poiché per eseguire il debug del codice Java/Kotlin e del codice C/C++ sono necessari strumenti diversi, il debugger di Android Studio consente di selezionare il tipo di debugger da utilizzare. Per impostazione predefinita, Android Studio decide quale debugger utilizzare in base alle lingue che rileva nel progetto utilizzando il tipo di debugger Rileva automaticamente.

Per selezionare manualmente il debugger nella configurazione di debug, fai clic su Esegui > Modifica configurazioni. Puoi anche selezionare il debugger nella finestra di dialogo visualizzata quando fai clic su Esegui > Collega il debugger al processo Android.

I tipi di debug disponibili sono i seguenti:

Rileva automaticamente
Seleziona questo tipo di debug se vuoi che Android Studio scelga automaticamente l'opzione migliore per il codice in fase di debug. Ad esempio, se nel progetto è presente codice C o C++, Android Studio utilizza automaticamente il tipo di debug duale. Altrimenti, Android Studio utilizza il tipo di debug solo Java.
Solo Java
Seleziona questo tipo di debug se vuoi eseguire il debug solo del codice scritto in Java o Kotlin. Il debugger Solo Java ignora i punti di interruzione o gli osservatori impostati nel codice nativo.
Solo nativo (disponibile solo con codice C/C++)
Seleziona questo tipo di debug se vuoi utilizzare solo LLDB per eseguire il debug del codice. Quando utilizzi questo tipo di debug, la visualizzazione della sessione del debugger Java non è disponibile. Per impostazione predefinita, LLDB ispeziona solo il codice nativo e ignora i breakpoint nel codice Java. Se vuoi eseguire il debug anche del codice Java, passa al tipo di debug Rileva automaticamente o Dual.

Il debug nativo funziona solo sui dispositivi che soddisfano i seguenti requisiti:

  • Il dispositivo supporta run-as.

    Per verificare se il dispositivo supporta run-as, esegui il seguente comando sulla shell ADB connessa al dispositivo:

    run-as your-package-name pwd
    

    Sostituisci your-package-name con il nome del pacchetto dell'app. Se il dispositivo supporta run-as, il comando dovrebbe restituire un output senza errori.

  • Sul dispositivo è attivo ptrace.

    Per verificare se ptrace è abilitato, esegui il seguente comando sulla shell ADB collegata al dispositivo:

    sysctl kernel.yama.ptrace_scope
    

    Se ptrace è attivato, il comando stampa il valore 0 o un errore unknown key. Se ptrace non è attivato, verrà stampato un valore diverso da 0.

Dual (Java + nativo): disponibile solo con il codice C/C++
Seleziona questo tipo di debug se vuoi passare dal debug del codice Java a quello del codice nativo e viceversa. Android Studio collega sia il debugger Java sia LLDB al processo dell'app per consentirti di esaminare i breakpoint sia nel codice Java sia in quello nativo senza riavviare l'app o modificare la configurazione di debug.

Nella figura 2, noterai le due schede a destra del titolo della finestra di debug. Poiché l'app contiene codice Java e C++, una scheda è destinata al debug del codice nativo e l'altra al debug del codice Java, come indicato da -java.

Figura 3. Scheda per il debug del codice nativo e scheda per il debug del codice Java.

Nota: durante il debug del codice nativo ottimizzato dal compilatore, potresti visualizzare il seguente messaggio di avviso:
This function was compiled with optimizations enabled. Some debugger features may not be available. Quando utilizzi i flag di ottimizzazione, il compilatore apporta modifiche al codice compilato per eseguirlo in modo più efficiente. Ciò può causare il reporting da parte del debugger di informazioni impreviste o errate perché è difficile per il debugger mappare il codice compilato ottimizzato al codice sorgente originale. Per questo motivo, devi disabilitare le ottimizzazioni del compilatore durante il debug del codice nativo.

Utilizzare il log di sistema

Il log di sistema mostra messaggi di sistema durante il debug dell'app. Questi messaggi includono informazioni sulle app in esecuzione sul dispositivo. Se vuoi utilizzare il log di sistema per eseguire il debug dell'app, assicurati che il codice scriva i messaggi di log e stampi la traccia di stack per le eccezioni mentre l'app è in fase di sviluppo.

Scrivere messaggi di log nel codice

Per scrivere messaggi di log nel codice, utilizza la classe Log. I messaggi di log ti aiutano a comprendere il flusso di esecuzione raccogliendo l'output di debug del sistema mentre interagisci con l'app. I messaggi di log possono anche indicarti la parte dell'app in cui si è verificato l'errore. Per ulteriori informazioni sul logging, consulta Scrivere e visualizzare i log con Logcat.

L'esempio seguente mostra come aggiungere messaggi di log per determinare se le informazioni sullo stato precedente sono disponibili all'avvio dell'attività:

Kotlin

import android.util.Log
...
class MyActivity : Activity() {
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        if (savedInstanceState != null) {
            Log.d(TAG, "onCreate() Restoring previous state")
            /* restore state */
        } else {
            Log.d(TAG, "onCreate() No saved state available")
            /* initialize app */
        }
        ...
    }
  ...
  companion object {
    private val TAG: String = MyActivity::class.java.simpleName
    ...
  }
}

Java

import android.util.Log;
...
public class MyActivity extends Activity {
    private static final String TAG = MyActivity.class.getSimpleName();
    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
       ...
       if (savedInstanceState != null) {
            Log.d(TAG, "onCreate() Restoring previous state");
            /* restore state */
        } else {
            Log.d(TAG, "onCreate() No saved state available");
            /* initialize app */
        }
        ...
    }
}

Durante lo sviluppo, il codice può anche intercettare le eccezioni e scrivere la traccia dello stack nel log del sistema:

Kotlin

fun someOtherMethod() {
    try {
        ...
    } catch (e : SomeException) {
        Log.d(TAG, "someOtherMethod()", e)
    }
}

Java

void someOtherMethod() {
    try {
        ...
    } catch (SomeException e) {
        Log.d(TAG, "someOtherMethod()", e);
    }
}

Nota:rimuovi i messaggi di log di debug e le chiamate di stampa dell'analisi dello stack dal codice quando è tutto pronto per la pubblicazione dell'app. Per farlo, imposta un DEBUG flag e inserisci i messaggi di log di debug all'interno di istruzioni condizionali.

Visualizza il log di sistema

Puoi visualizzare e filtrare i messaggi di debug e di altro tipo di sistema nella finestra Logcat, come mostrato nella figura 4. Ad esempio, puoi visualizzare i messaggi quando si verifica la garbage collection o i messaggi che aggiungi alla tua app con la classe Log.

Per utilizzare Logcat, avvia il debug e seleziona la scheda Logcat.

Figura 4. Finestra Logcat con le impostazioni del filtro.

Per una descrizione di Logcat e delle sue opzioni di filtro, consulta Scrivere e visualizzare i log con Logcat.

Utilizzare i punti di interruzione

Android Studio supporta punti di interruzione che attivano diverse azioni di debug. Esistono diversi tipi di punti di interruzione:

Punto di interruzione di riga
Il tipo più comune è un punto di interruzione di riga che mette in pausa l'esecuzione dell'app in una riga di codice specificata. In pausa, puoi esaminare le variabili, valutare le espressioni e poi continuare l'esecuzione riga per riga per determinare le cause degli errori di runtime.
Punto di interruzione del metodo
Un punto di interruzione del metodo mette in pausa l'esecuzione dell'app quando entra o esce da un metodo specifico. In pausa, puoi esaminare le variabili, valutare le espressioni e poi continuare l'esecuzione riga per riga per determinare le cause degli errori di runtime. Quando imposti un punto di interruzione in una funzione componibile, il debugger elenca i parametri del componibile e il relativo stato per aiutarti a identificare le modifiche che potrebbero aver causato la ricompozione.
Punto di interruzione del campo
Un punto di interruzione del campo mette in pausa l'esecuzione dell'app quando legge o scrive in un campo specifico.
Punto di interruzione per eccezione
Un punto di interruzione per eccezione mette in pausa l'esecuzione dell'app quando viene generata un'eccezione.

Puoi impostare punti di interruzione condizionali che sospenderanno l'esecuzione solo se vengono soddisfatte condizioni specifiche. Puoi anche impostare punti di interruzione di logging che scrivono in Logcat senza sospendere l'esecuzione. In questo modo puoi evitare di riempire il codice di istruzioni di log.

Per aggiungere un punto di interruzione di riga:

  1. Individua la riga di codice in cui vuoi mettere in pausa l'esecuzione.
  2. Fai clic sul riquadro sinistro lungo la riga di codice o posiziona il cursore sulla riga e premi Ctrl+F8 (su macOS, Comando+F8).
  3. Se l'app è già in esecuzione, fai clic su Collega il debugger al processo Android . In caso contrario, per avviare il debug, fai clic su Debug .

Quando imposti un punto di interruzione, accanto alla riga viene visualizzato un punto rosso, come mostrato nella figura 5.

Figura 5. Quando imposti un punto di interruzione, accanto alla linea viene visualizzato un punto rosso.

Quando l'esecuzione del codice raggiunge il punto di interruzione, Android Studio mette in pausa l'esecuzione dell'app.

Per identificare lo stato dell'app, usa gli strumenti nella scheda Debugger:

  • Per esaminare l'albero degli oggetti di una variabile, espandi la variabile nella visualizzazione Variabili. Se la visualizzazione Variabili non è visibile, fai clic su Impostazioni di layout e assicurati che sia selezionata la casella di controllo Variabili.

  • Per passare alla riga successiva del codice senza inserire un metodo, fai clic su Ignora .

  • Per passare alla prima riga all'interno di una chiamata di metodo, fai clic su Passa al livello successivo .

  • Per passare alla riga successiva al di fuori del metodo corrente, fai clic su Esci .

  • Per continuare a eseguire l'app normalmente, fai clic su Riprendi programma .

Se il progetto utilizza codice nativo, per impostazione predefinita il tipo di debug Rileva automaticamente collega il debugger Java e l'LLDB all'app come due processi separati. Puoi passare dall'ispezione dei breakpoint Java a quella dei breakpoint C/C++ e viceversa senza riavviare l'app o modificare le impostazioni.

Nota: affinché Android Studio rilevi i breakpoint nel codice C o C++, devi utilizzare un tipo di debug che supporti LLDB, ad esempio Rileva automaticamente, Nativo o Dual. Puoi modificare il tipo di debug utilizzato da Android Studio modificando la configurazione di debug. Per approfondire i diversi tipi di debug, leggi la sezione sull'utilizzo di altri tipi di debug.

Quando Android Studio esegue il deployment dell'app sul dispositivo di destinazione, la finestra di debug si apre con una scheda o una visualizzazione della sessione di debug per ogni processo di debugger, come mostrato nella figura 6.

Figura 6. Esegui il debug del codice nativo utilizzando LLDB.
  1. Android Studio passa alla scheda <your-module> quando il debugger LLDB rileva un punto di interruzione nel codice C/C++. Sono disponibili anche i riquadri Frame, Variabili e Monitor e funzionano esattamente come se stessi eseguendo il debug del codice Java.

    Anche se il riquadro Thread non è disponibile nella visualizzazione della sessione LLDB, puoi accedere alle tue app tramite l'elenco nel riquadro Frame. Scopri di più su questi riquadri nelle sezioni su come eseguire il debug dei frame della finestra e ispezionare le variabili.

    Nota: durante l'ispezione di un punto di interruzione nel codice nativo, il sistema Android sospende la macchina virtuale che esegue il bytecode Java della tua app. Ciò significa che non riesci a interagire con il debugger Java o a recuperare informazioni sullo stato dalla sessione del debugger Java mentre esamini un punto di interruzione nel codice nativo.

  2. Android Studio passa alla scheda <your-module>-java quando il debugger Java rileva un punto di interruzione nel codice Java o Kotlin.
  3. Durante il debug con LLDB, puoi utilizzare il terminale LLDB nella visualizzazione della sessione LLDB per passare opzioni a riga di comando a LLDB. Se hai determinati comandi che vuoi che LLDB esegua ogni volta che avvii il debugging della tua app, appena prima o appena dopo che il debugger si aggancia al processo dell'app, puoi aggiungerli alla configurazione di debug.

Durante il debug del codice C/C++, puoi anche impostare tipi speciali di breakpoint, chiamati punti di controllo, che possono sospendere il processo dell'app quando l'app interagisce con un determinato blocco di memoria. Per saperne di più, consulta la sezione su come aggiungere checkpoint.

Visualizzare e configurare i punti di interruzione

Per visualizzare tutti i punti di interruzione e configurarne le impostazioni, fai clic su Visualizza punti di interruzione nella finestra di debug. Viene visualizzata la finestra Punti di interruzione, come mostrato nella figura 7.

Figura 7. La finestra Punti di interruzione elenca tutti i punti di interruzione correnti e include le impostazioni di comportamento per ciascuno.

La finestra Punti di interruzione consente di abilitare o disabilitare ogni punto di interruzione dall'elenco nel riquadro. Se un punto di interruzione è disattivato, Android Studio non mette in pausa l'app quando raggiunge quel punto di interruzione.

Seleziona un punto di interruzione dall'elenco per configurarne le impostazioni. Puoi configurare un punto di interruzione in modo che sia disattivato inizialmente e che il sistema lo attivi dopo aver raggiunto un altro punto di interruzione. Puoi anche configurare se un breakpoint deve essere disattivato dopo essere stato raggiunto. Per impostare un punto di interruzione per qualsiasi eccezione, seleziona Breakpoint eccezione nell'elenco dei punti di interruzione.

Per disattivare temporaneamente tutti i punti di interruzione, fai clic su Disattiva punti di interruzione nella finestra di debug. Fai di nuovo clic per riattivare.

Telai della finestra di debug

Nella finestra del debugger, il riquadro Frame ti consente di esaminare il frame dello stack che ha causato l'hit del breakpoint corrente. In questo modo, puoi navigare ed esaminare il frame dello stack e anche controllare l'elenco dei thread nella tua app per Android.

Per selezionare un thread, utilizza il menu di selezione del thread e visualizza il relativo frame dello stack. Fai clic sugli elementi del riquadro per aprire l'origine nell'editor. Puoi anche personalizzare la presentazione del thread e esportare il frame dello stack come descritto nella guida Esamina frame.

Controllare le variabili

Nella finestra del debugger, il riquadro Variabili ti consente di esaminare le variabili quando il sistema arresta l'app in un punto di interruzione e selezioni un frame dal riquadro Frame. Il riquadro Variabili consente inoltre di valutare espressioni ad hoc utilizzando metodi statici e/o variabili disponibili all'interno del frame selezionato.

Per aggiungere un'espressione all'albero degli oggetti (durante il debug dell'applicazione):

Figura 8. Struttura ad albero degli oggetti e casella di immissione delle espressioni nella finestra di debug.
  1. Inserisci l'espressione da guardare o visualizzare
  2. Fai clic su Aggiungi a orologi o premi Invio per valutare l'espressione una volta.

In alternativa, se l'albero degli oggetti contiene l'espressione che vuoi monitorare, puoi trascinarla nella parte superiore dell'albero per aggiungerla come espressione monitorata.

Le espressioni monitorate vengono aggiornate quando vengono raggiunti i punti di interruzione o quando esegui la procedura dettagliata del codice.

Le espressioni valutate rimarranno visualizzate nella parte superiore dell'albero degli oggetti finché non valuterai manualmente un'altra espressione o non eseguirai la procedura guidata del codice.

Per rimuovere un'espressione monitorata dall'albero degli oggetti, fai clic con il tasto destro del mouse sull'espressione, quindi su Rimuovi monitoraggio.

Aggiungi watchpoint

Durante il debug del codice C/C++, puoi impostare tipi speciali di breakpoint, chiamati punti di controllo, che possono sospendere il processo dell'app quando questa interagisce con un determinato blocco di memoria. Ad esempio, se imposte due puntatori a un blocco di memoria e lo assegni a un punto di controllo, l'utilizzo di uno dei due per accedere al blocco di memoria attiva il punto di controllo.

In Android Studio, puoi creare un watchpoint durante il runtime selezionando una variabile specifica, ma LLDB assegna il watchpoint solo al blocco di memoria che il sistema alloca alla variabile, non alla variabile stessa. Questo è diverso dall'aggiunta di una variabile al riquadro Monitor, che consente di osservare il valore di una variabile, ma non di sospendere il processo dell'app quando il sistema legge o modifica il suo valore in memoria.

Nota: quando il processo dell'app esce da una funzione e il sistema libera le variabili locali dalla memoria, devi riassegnare tutti i punti di monitoraggio che hai creato per queste variabili.

Per impostare un punto di guardia, devi soddisfare i seguenti requisiti:

  • Il dispositivo fisico o l'emulatore di destinazione utilizza una CPU x86 o x86_64. Se il tuo dispositivo utilizza una CPU ARM, devi allineare il confine dell'indirizzo della variabile in memoria a 4 byte per i processori a 32 bit o a 8 byte per i processori a 64 bit. Per allineare una variabile nel codice nativo, specifica __attribute__((aligned(num_bytes))) nella decelerazione della variabile, come mostrato di seguito:
    // For a 64-bit ARM processor
    int my_counter __attribute__((aligned(8)));
  • Hai già assegnato tre o meno punti di monitoraggio. Android Studio supporta solo fino a quattro watchpoint su dispositivi di destinazione x86 o x86_64. Altri dispositivi potrebbero supportare meno punti di monitoraggio.

Nota:quando esegui il debug della tua app con ABI ARM a 32 bit, l'aggiunta di un watchpoint o il passaggio del mouse sopra le variabili all'interno del codice per analizzarne i valori potrebbe causare un arresto anomalo. Come soluzione alternativa, esegui il debug utilizzando file binari ARM, x86 o x86_64 a 64 bit. Questo problema verrà risolto in una release futura di Android Studio.

Se soddisfi i requisiti, puoi aggiungere un punto di controllo come segue:

  1. Mentre l'app è sospesa su un punto di interruzione, vai al riquadro Variabili nella visualizzazione della sessione LLDB.
  2. Fai clic con il tasto destro del mouse su una variabile che occupa il blocco di memoria che vuoi monitorare e seleziona Aggiungi punto di controllo.

    Figura 9. Aggiungi un punto di controllo a una variabile in memoria.
  3. Viene visualizzata una finestra di dialogo per configurare il punto di controllo, come mostrato nella figura 9.

    Configura il tuo watchpoint con le seguenti opzioni:

    • Attivato:deseleziona questa opzione se vuoi chiedere ad Android Studio di ignorare il punto di controllo finché non modifichi l'impostazione. Android Studio salva il tuo punto di visualizzazione per consentirti di accedervi in un secondo momento.
    • Sospendi:per impostazione predefinita, il sistema Android sospende il processo dell'app quando accede a un blocco di memoria assegnato a un punto di controllo. Deseleziona questa opzione se non vuoi che venga applicato questo comportamento. Verranno visualizzate opzioni aggiuntive che puoi utilizzare per personalizzare il comportamento quando il sistema interagisce con il punto di controllo: Registra messaggio nella console e Rimuovi al raggiungimento.
    • Tipo di accesso:seleziona se l'app deve attivare il punto di controllo quando tenta di leggere o scrivere nel blocco di memoria allocato alla variabile. Per attivare il punto di controllo su una lettura o una scrittura, seleziona Qualsiasi.
  4. Fai clic su Fine.

Per visualizzare tutti i punti di controllo e configurarne le impostazioni, fai clic su Visualizza punti di interruzione nella finestra di debug. Viene visualizzata la finestra di dialogo breakpoint, come mostrato nella figura 10.

Figura 10. La finestra di dialogo Punti di interruzione elenca i watchpoint attuali e include le impostazioni del comportamento per ciascuno.

Dopo aver aggiunto il punto di controllo, fai clic su Riprendi programma nella finestra di debug per riprendere il processo dell'app. Per impostazione predefinita, se l'app tenta di accedere a un blocco di memoria per il quale hai impostato un punto di controllo, il sistema Android sospende il processo dell'app e accanto alla riga di codice eseguita per ultima dall'app viene visualizzata un'icona del punto di controllo , come mostrato nella figura 11.

Figura 11. Android Studio indica la riga di codice eseguita dalla tua app appena prima dell'attivazione di un punto di controllo.

Visualizzare e modificare il formato di visualizzazione del valore della risorsa

In modalità di debug, puoi visualizzare i valori delle risorse e selezionare un formato di visualizzazione diverso per le variabili nel codice Java o Kotlin. Dopo aver visualizzato la scheda Variabili e selezionato un frame, procedi nel seguente modo:

  1. Nell'elenco Variabili, fai clic con il tasto destro del mouse in un punto qualsiasi di una riga della risorsa per visualizzare l'elenco.
  2. Nell'elenco, seleziona Visualizza come e scegli il formato che vuoi utilizzare.

    I formati disponibili dipendono dal tipo di dati della risorsa selezionata. Potresti visualizzare una o più delle seguenti opzioni:

    • Classe: mostra la definizione della classe.
    • toString: il formato stringa visualizzata.
    • Oggetto: mostra la definizione dell'oggetto (un'istanza di una classe).
    • Array:da visualizzare in un formato array.
    • Timestamp: mostra data e ora come segue: aaaa-mm-gg hh:mm:ss.
    • Automatico: Android Studio sceglie il formato migliore in base al tipo di dati.
    • Binario:mostra un valore binario utilizzando zeri e uno.
    • MeasureSpec:il valore passato dal valore principale a quello secondario selezionato. Consulta MeasureSpec.
    • Hex: viene visualizzato come valore esadecimale.
    • Primitivo:viene visualizzato come valore numerico utilizzando un tipo di dati primitivi.
    • Numero intero:da visualizzare come valore numerico di tipo Integer.

Per creare un formato personalizzato:

  1. Fai clic con il tasto destro del mouse sul valore della risorsa.
  2. Seleziona Visualizza come.
  3. Seleziona Crea.
  4. Viene visualizzata la finestra di dialogo Renderer per i tipi di dati Java. Segui le istruzioni riportate in Java Data type renderers.