Il testing è una parte cruciale dello sviluppo di Android, che ti consente di appianare tutti i bug, gli errori e i problemi di prestazioni che potrebbero essere in agguato nella tua app, prima di scatenarla sul grande pubblico.
Ogni volta che si verifica un errore, Android genera un messaggio di errore e quindi visualizza tale messaggio come parte di Android Studio Logcat Monitor o come dialogo sul dispositivo che stai utilizzando per testare la tua app.
Questi messaggi di errore sono in genere brevi e pertinenti e, a prima vista, potrebbero non sembrare utili. Tuttavia, questi messaggi contengono effettivamente tutte le informazioni necessarie per riportare il progetto in linea: è sufficiente sapere come decifrarli!
In questo articolo, daremo un'occhiata approfondita ai 13 messaggi di errore che è più probabile incontrare durante lo sviluppo qualunque App per Android Esamineremo ciò che ciascuno di questi messaggi di errore veramente significa, esaminando tutti i possibili motivi per cui potresti incontrare ogni errore e, soprattutto, condividere le istruzioni passo-passo su come risolverli.
C'è una vasta gamma di messaggi di errore che potresti incontrare durante il test della tua app, che vanno da gravi errori che causeranno l'arresto anomalo della tua app la prima volta che proverai a installarlo su un dispositivo di destinazione a errori più sottili che degradano le prestazioni dell'applicazione nel tempo.
A seconda del tipo di errore riscontrato, Android visualizzerà il messaggio di errore sul dispositivo che stai utilizzando per testare la tua app o in Android Studio.
Individuare i messaggi di errore che appaiono su un dispositivo fisico o AVD è facile: basta prestare attenzione a tutti i dialoghi che appaiono sullo schermo del dispositivo! Tuttavia, gli errori di individuazione visualizzati in Android Studio possono essere complicati, in quanto il monitor Logcat registra un'enorme quantità di informazioni, rendendo facile perdere importanti messaggi di errore.
Il modo più semplice per assicurarti di non perdere messaggi di errore è aprire Logcat Monitor verboso menu a discesa e impostalo su Errore, che filtrerà tutto tranne i messaggi di errore.
Questo errore è causato quando Android Studio non è in grado di generare il tuo R.java file correttamente, e può spesso emergere dal nulla - un minuto tutto funzionerà bene, e il minuto successivo ogni parte del tuo progetto non riesce a compilare. A peggiorare le cose, quando Android Studio incontra il R.layout
errore, di solito contrassegna tutti i file di risorse del layout come contenenti errori, il che rende difficile sapere da dove iniziare a cercare la fonte dell'errore.
Spesso, la soluzione più efficace è la più semplice: pulire e ricostruire il tuo progetto. Selezionare Build> Clean Project dalla barra degli strumenti di Android Studio, attendi qualche istante, quindi crea il tuo progetto selezionando Build> Rebuild Project.
Se un singolo ciclo di pulizia / ricostruzione non funziona, provare a ripetere questo processo alcune volte, poiché alcuni sviluppatori hanno riportato risultati positivi dopo aver completato più cicli di pulizia / ricostruzione in rapida successione.
Se si verifica questo errore dopo aver spostato alcuni file e directory, è possibile che sia R.layout
l'errore è causato da una mancata corrispondenza tra la cache di Android Studio e il layout corrente del progetto. Se si sospetta che questo possa essere il caso, quindi selezionare File> Invalidate Caches / Restart> Invalidate and Restart dalla barra degli strumenti di Android Studio.
Problemi con i nomi delle tue risorse possono anche impedire il R.java il file viene creato correttamente, quindi controlla di non avere più risorse con lo stesso nome e che nessuno dei tuoi nomi di file contiene caratteri non validi. Android Studio supporta solo lettere minuscole a-z, 0-9, punti fermi e trattini bassi e un singolo carattere non valido può causare un R.layout
errore in tutto il tuo progetto, anche se in realtà non lo fai uso questa risorsa ovunque nel tuo progetto!
Se identifichi e risolvi un errore, ma Android Studio continua a visualizzare il file R.layout
errore, potrebbe essere necessario completare un ciclo di pulizia / ricostruzione prima che Android Studio registri correttamente le modifiche.
Quando si compila l'app, l'APK contiene file bytecode eseguibili sotto forma di file bytecode Dalvik Executable (DEX). La specifica DEX afferma che un singolo file DEX può fare riferimento a un massimo di 65.536 metodi e se si incontra il Troppi campi ... errore quindi significa che la tua app ha superato questo limite. Nota che questa è una limitazione del numero di metodi del tuo progetto Riferimenti, e non il numero di metodi del tuo progetto definisce.
Se riscontri questo errore, puoi:
Il processo di attivazione del supporto multidex varierà a seconda delle versioni di Android supportate dal tuo progetto.
Se hai come target Android 5.0 o versioni successive, il primo passaggio è l'apertura del file build.gradle a livello di modulo e delle impostazioni multiDexEnabled
a vero
:
android defaultConfig minSdkVersion 21 multiDexEnabled true
Tuttavia, se il tuo minSdkVersion
è 20 o inferiore, quindi dovrai aggiungere il multiDexEnabled true
attributo e quindi aggiungere la libreria di supporto multidex come dipendenza del progetto:
dipendencies compile 'com.android.support:multidex:1.0.1'
Il prossimo passo dipende dal fatto che tu stia ignorando il Applicazione
classe.
Se il tuo progetto ha la precedenza su Applicazione
classe, quindi apri il tuo manifest e aggiungi il seguente al
etichetta:
...
Se il tuo progetto non ha la precedenza su Applicazione
classe, quindi è necessario estendere MultiDexApplication
anziché:
La classe pubblica MyApplication estende MultiDexApplication
Infine, se si esegue l'override del Applicazione
classe ma non può cambiare la classe base, quindi è possibile abilitare il multidex sovrascrivendo il attachBaseContext ()
metodo e chiamata MultiDex.install (questo)
, per esempio:
@Override protected void attachBaseContext (Context base) super.attachBaseContext (base); MultiDex.install (questo);
Se ricevi un errore JDK ogni volta che provi a creare la tua app, significa che Android Studio fatica a trovare dove è installato JDK sulla tua macchina di sviluppo.
Per correggere questo errore:
Se ciò non risolve il problema, torna a File> Struttura del progetto ...> Posizione SDK, e inserisci manualmente il percorso completo del file per il tuo JDK. Se non sei sicuro di dove JDK è installato sul tuo computer di sviluppo, puoi scoprirlo aprendo il Terminale (Mac) o il Prompt dei comandi (Windows) e inserendo il seguente comando:
/ Usr / libexec / java_home
Mentre gli AVD sono ottimi per testare la tua app su una vasta gamma di hardware e software diversi, devi sempre testare la tua app su almeno uno smartphone o tablet Android fisico. Tuttavia, la capacità di Android Studio di riconoscere un dispositivo Android connesso è notoriamente incostante.
Se hai collegato il tuo dispositivo al tuo computer di sviluppo ma stai incontrando un Errore durante l'installazione dell'APK messaggio ogni volta che provi ad installare l'APK o il tuo dispositivo non appare nemmeno nel Seleziona Target di distribuzione finestra, quindi prova le seguenti correzioni:
Apri il dispositivo impostazioni, quindi selezionare Opzioni per gli sviluppatori, e assicurati Debug USB è abilitato. Se non vedi Opzioni per gli sviluppatori nel impostazioni menu, quindi selezionare Info sul telefono e continua a toccare Numero di build fino a a Ora sei uno sviluppatore appare la notifica. Ritorna al principale impostazioni schermo, e dovresti trovarlo Opzioni per gli sviluppatori è stato aggiunto.
A volte il tuo dispositivo potrebbe richiedere qualche input aggiuntivo prima che si connetta al tuo computer di sviluppo. Ad esempio, potrebbe chiederti di scegliere tra diverse modalità o autorizzare esplicitamente la connessione.
Se stai sviluppando su Windows, dovrai scaricare il driver USB OEM appropriato per il tuo dispositivo. Se sei un utente Nexus, puoi scaricare il Google USB driver attraverso l'SDK Manager di Android Studio.
Troverai l'SDK minimo del tuo progetto nel tuo file gradle.build a livello di modulo e potrai controllare quale versione di Android è installata sul tuo dispositivo aprendo il suo impostazioni e striscia verso il Info sul telefono sezione.
Aprire una finestra del terminale o del prompt dei comandi, quindi modificare la directory (CD
), quindi punta al tuo platform-tools finestra, ad esempio:
cd / Utenti / Download / adt-bundle-mac / sdk / piattaforma-strumenti
Quindi, termina e riavvia il processo adb immettendo i seguenti comandi, uno dopo l'altro:
./ adb kill-server
./ adb start-server
Se tutto il resto fallisce, prova a scollegare e quindi riconnettere il dispositivo, riavviare il dispositivo, riavviare Android Studio e, come ultima risorsa, riavviare la tua macchina di sviluppo.
Se si verifica questo errore quando si tenta di installare il progetto, significa che il dispositivo di destinazione non ha memoria sufficiente.
Se stai cercando di installare il tuo progetto su un AVD, allora dovresti controllare quanto spazio hai assegnato a questo particolare AVD:
Questa sezione elenca i vari tipi di memoria che hai assegnato a questo particolare AVD. Se uno qualsiasi di questi valori è insolitamente basso, dovresti aumentarli per riflettere più da vicino la memoria disponibile per il tuo smartphone o tablet Android:
Se non c'è niente di strano nella memoria del tuo AVD, o stai cercando di installare la tua app su uno smartphone o tablet Android fisico, questo errore di solito significa che l'app compilata è semplicemente troppo grande. Un'applicazione che prende un morso significativo dalla memoria del dispositivo al momento dell'installazione non andrà mai giù bene.
Se hai bisogno di ridurre drasticamente le dimensioni del tuo APK, prova le seguenti tecniche:
Utilizzare ProGuard per rimuovere classi, campi, metodi e attributi non utilizzati. Per abilitare ProGuard, apri il file build.gradle a livello di modulo e aggiungi quanto segue:
buildTypes release // Abilita ProGuard // minifyEnabled true // Poiché vogliamo ridurre il più possibile le dimensioni dell'APK, sto utilizzando le impostazioni del file proguard-android-optimize.txt // proguardFiles getDefaultProguardFile ('proguard -android-optimize.txt '),' proguard-rules.pro '
shrinkResources true
al file build.gradle del progetto.Android: tinta
e tintMode
, e puoi ruotare un'immagine usando Android: fromDegrees
, Android: toDegrees
, Android: pivotX
, e Android: pivotY
.Ottimizza le tue librerie. Prova a rimuovere dal tuo progetto tutte le librerie inutili o ad alta memoria. Se è necessario utilizzare una libreria di grandi dimensioni, verificare se è possibile ottimizzare questa libreria per l'ambiente mobile, poiché il codice della libreria esterna spesso non viene scritto tenendo presente il cellulare. Si dovrebbe anche tenere presente che molte librerie contengono una grande quantità di stringhe localizzate. Se la tua app non supporta ufficialmente queste librerie, potresti essere in grado di ridurre la dimensione della libreria dicendo a Gradle di non includere queste stringhe nel tuo APK compilato. Per specificare le lingue ufficialmente supportate dall'app, apri il file build.gradle a livello di modulo e utilizza il file resConfigs
attributo. Ad esempio, qui stiamo specificando che vogliamo includere solo stringhe in inglese nel nostro progetto:
android defaultConfig resConfigs "it"
Valuta se il tuo APK contiene una grande quantità di contenuti che il singolo utente può scaricare ma non utilizzare mai. Ad esempio, un dispositivo con uno schermo HDPI non ha molto senso per xxxhdpi
risorse! Uno dei modi più efficaci per ridurre le dimensioni dell'APK è separarlo in più APK, quindi quando l'utente scarica la tua app, riceverà un APK che contiene solo il codice e le risorse che hanno senso per il loro particolare dispositivo. Troverai maggiori informazioni sulla creazione di APK che hanno come target densità di schermi differenti e ABI specifici (interfacce binarie delle applicazioni) rispetto ai documenti ufficiali di Android.
Un ActivityNotFoundException
si verifica quando una chiamata a startActivity (Intent)
o una delle sue varianti fallisce perché Attività
non è possibile eseguire il dato Intento
.
La causa più comune di un ActivityNotFoundException
dimentica di dichiarare un'attività nel tuo manifest, quindi apri il tuo manifest e controlla di aver dichiarato tutte le tue attività. Dovresti anche controllare di aver dichiarato ogni attività correttamente, utilizzando un nome di classe completo o un punto fermo come una scorciatoia per il nome del pacchetto. Ad esempio, entrambi i seguenti sono validi:
Se non riesci a individuare alcun problema con il tuo manifest, allora ci sono alcune altre potenziali cause di ActivityNotFoundExceptions
. In primo luogo, se si verifica questo errore dopo aver spostato un Attività
classe da un pacchetto all'altro, quindi è possibile che hai confuso Android Studio e solo bisogno di pulire e ricostruire il tuo progetto.
Un ActivityNotFoundException
può anche essere causato da un errore nel bersaglio Attività
non si sta caricando correttamente. Per verificare se questo si sta verificando nel tuo progetto, inserisci il tuo codice di intent all'interno di un blocco try-catch:
prova // Your code here // catch (ActivityNotFoundException e) e.printStackTrace ();
Esegui nuovamente l'applicazione, quindi dai un'occhiata al monitor Logcat di Android Studio per verificare se sono state rilevate eventuali eccezioni che potrebbero impedire la creazione dell'attività di destinazione. Se questo è il caso, quindi risolvere questi errori dovrebbe risolvere il ActivityNotFoundException
, pure.
Il ClassCastException
l'errore è correlato alla funzionalità di conversione del tipo di Java, che consente di trasmettere variabili di un tipo a un altro. Incontri a ClassCastException
quando provi a lanciare un oggetto su una classe di cui non è un'istanza. Ad esempio, entrambi i seguenti frammenti di codice genereranno a ClassCastException
:
Object x = new Integer (0); System.out.println ((String) x);
ImageView image = (ImageView) context.findViewById (R.id.button);
Questo messaggio di errore contiene informazioni sulla linea che sta causando il ClassCastException
errore, quindi naviga verso questa parte del tuo progetto, controlla quali oggetti vengono lanciati lì e risolvi eventuali discrepanze.
Se non riesci a individuare un problema con il tuo casting, valuta se ne hai spostati di recente Visualizzazioni
nei file di risorse del layout, come alcuni utenti hanno segnalato di incontrare a ClassCastException
dopo aver risistemato il loro Visualizzazioni
. Se sospetti che questa possa essere la causa del tuo ClassCastException
, quindi comunica a Android Studio di rigenerare i file di layout da zero, eseguendo un ciclo di pulizia / ricostruzione. Ciò impone ad Android Studio di registrare correttamente le modifiche al layout recenti, che dovrebbero risolvere il problema ClassCastException
.
In Java, quando dichiari una variabile di riferimento, stai effettivamente creando un puntatore a un oggetto. È possibile dichiarare che un oggetto sta attualmente puntando a una porzione di dati sconosciuta assegnando un valore nullo al riferimento di quell'oggetto. I valori nulli possono essere utili nella codifica di alcuni modelli di progettazione, ma se si incontra un NullPointerException (NPE), significa che si è tentato di utilizzare un riferimento che punta a un valore nullo, come se si riferisse a un oggetto. Poiché non c'è codice da eseguire nella posizione in cui questo riferimento sta puntando, si finisce con un NPE.
Di solito un NPE è accompagnato da informazioni su dove è stata rilevata questa eccezione, quindi il Monitor Logcat dovrebbe contenere la riga esatta in cui si è verificato questo errore. Passare a questa area del progetto e identificare il riferimento uguale a null. Dovrai quindi trovare la posizione in cui deve essere impostato il valore e impostarlo.
Il findViewById
il metodo può anche restituire null se richiesto vista
non può essere trovato, quindi se il tuo NPE si sta verificando in una linea che contiene a findViewById
, controlla di aver inizializzato il layout che contiene questo vista
. Inoltre, stai attento a eventuali errori di ortografia o errori di battitura che potrebbero essersi introdotti nei tuoi findViewById
chiamata, in quanto possono anche risultare in un NPE.
Per evitare NPE che si verificano nel tuo progetto, assicurati che tutti gli oggetti siano inizializzati prima di tentare di usarli e verifica sempre che una variabile non sia null prima di richiedere un metodo o un campo da quell'oggetto.
Si tratta di un errore visualizzato come dialogo sul dispositivo Android o AVD che stai utilizzando per testare la tua app. Il Applicazione non rispondente (ANR) errore si verifica quando l'interfaccia utente della tua app si blocca e rimane non risponde per l'input dell'utente per più di cinque secondi. Questo di solito accade perché la tua app sta tentando di eseguire operazioni lunghe o intensive sul thread principale dell'interfaccia utente di Android.
In Android, il thread principale dell'interfaccia utente è responsabile dell'invio di tutti gli eventi di input dell'utente ai widget dell'interfaccia utente appropriati e per l'aggiornamento dell'interfaccia utente dell'app. Tuttavia, questo thread può elaborare solo un'attività alla volta, quindi se blocchi il thread principale con operazioni di lunga durata o intense, la tua interfaccia utente non risponderà fino a quando questa attività non sarà completata.
Se incontri un messaggio ANR durante il test della tua app, allora tu decisamente bisogno di dare un'occhiata al lavoro che stai eseguendo sul thread principale. Tuttavia, se non si verifica questo errore in modo esplicito, ma si nota che l'app a volte risulta lenta o lenta, è un'indicazione che si è sull'orlo di un errore ANR, e ancora una volta si dovrebbe dare un'occhiata allo stato del tuo thread UI.
Per risolvere gli errori ANR (e vicino-Errori ANR), è necessario identificare tutte le operazioni potenzialmente in grado di funzionare lentamente o che richiedono una potenza di elaborazione significativa e quindi spostarle dal thread principale. Puoi farlo creando un thread di lavoro in cui queste operazioni possono essere eseguite con il rischio zero di bloccare il thread dell'interfaccia utente principale.
Esistono diversi metodi per creare thread aggiuntivi, ma la soluzione più semplice è usare un AsynTask
, poiché questa classe contiene già il proprio thread di lavoro e un OnPostExecute ()
callback che è possibile utilizzare per comunicare con il thread principale dell'interfaccia utente di Android.
Tuttavia, AsyncTasks è più adatto per eseguire operazioni di background brevi, quindi se è necessario eseguire un'operazione di lunga durata, è necessario utilizzare un Servizio
o un IntentService
anziché.
Sebbene lo spostamento di attività di lunga durata e intensi dal thread principale abbia un impatto maggiore sulle prestazioni della tua app, è consigliabile eseguire il minor lavoro possibile sul thread dell'interfaccia utente principale. Anche l'esecuzione di una piccola quantità di codice non necessario sul thread principale può avere un impatto sulla reattività della tua app, quindi una volta che hai riposizionato tutte le tue operazioni lunghe e intensive, dovresti controllare se c'è altro codice che puoi spostati dalla discussione principale.
In Android, puoi aggiornare la tua interfaccia utente solo dal thread principale. Se si tenta di accedere agli elementi dell'interfaccia utente da qualsiasi altro thread, si verificherà questo errore.
Per risolvere questo problema, identifica la parte dell'attività in background che sta tentando di aggiornare l'interfaccia utente e spostarla in a runOnUiThread
, per esempio:
runOnUiThread (new Runnable () @ Override public void run () // Aggiorna l'interfaccia utente //);
In alternativa, puoi usare un gestore o eseguire il lavoro in background in un AsyncTask, dato che puoi comunicare con il thread principale usando AsyncTask OnPostExecute ()
metodo di callback. Infine, se ti trovi regolarmente a passare da un thread all'altro, potresti voler esaminare RxAndroid, in quanto questa libreria ti consente di creare un nuovo thread, pianificare il lavoro da eseguire su questo thread e quindi postare i risultati sul thread principale, tutto con solo poche righe di codice.
Questa eccezione viene generata quando l'app tenta di eseguire operazioni di rete sul thread principale, ad esempio l'invio di richieste API, la connessione a un database remoto o il download di un file. Poiché le operazioni di rete possono richiedere molto tempo e molto lavoro, è molto probabile che blocchino il thread principale, quindi Android 3.0 (Honeycomb) e versioni successive genereranno questo errore ogni volta che tenterai di fare una richiesta di rete sul thread principale.
Se incontri una NetworkOnMainThreadException
, quindi trova il codice di rete in esecuzione sul thread principale e spostalo in un thread separato.
Se hai bisogno di fare frequenti richieste di networking, allora potresti voler dare un'occhiata a Volley, una libreria HTTP che avvia i suoi thread in background in modo che tutte le richieste di networking vengano eseguite fuori dal thread principale per impostazione predefinita.
Questo errore si verifica quando si tenta di mostrare un dialogo dopo aver chiuso l'attività. Se riscontri questo problema, apri la tua attività e assicurati di chiudere correttamente il dialogo, chiamando respingere()
in entrambe le attività OnDestroy ()
o onPause ()
metodo, ad esempio:
@Override protected void onDestroy () super.onDestroy (); if (pDialogue! = null) pDialogue.dismiss ();
Questo errore si verifica quando l'app effettua una richiesta di memoria che il sistema non è in grado di soddisfare. Se si verifica questo messaggio di errore, quindi iniziare eliminando tutti gli errori più comuni di gestione della memoria. Controlla di aver ricordato di annullare la registrazione di tutti i tuoi ricevitori di trasmissione e di aver interrotto tutti i tuoi servizi; assicurati di non tenere traccia dei riferimenti in qualsiasi variabile membro statica e che non stai tentando di caricare alcun bitmap di grandi dimensioni.
Se hai escluso tutte le cause ovvie di un OutOfMemoryError
, quindi dovrai scavare più a fondo ed esaminare esattamente come la tua app stia allocando memoria, poiché è probabile che ci siano alcune aree in cui puoi migliorare la gestione della memoria della tua app.
Android Studio ha un'intera area dedicata ad aiutarti ad analizzare l'utilizzo della memoria della tua app, quindi inizia selezionando Visualizza> Finestra Strumenti dalla barra degli strumenti di Android Studio. A questo punto vedrai o un Monitor Android o Android Profiler opzione, a seconda della versione di Android Studio installata.
Abbiamo discusso prima di lavorare con Memory Monitor su questo sito Web, ma poiché Android Profiler è una nuova aggiunta ad Android Studio, diamo uno sguardo alle sue principali funzionalità.
Quando apri Android Profiler, inizia a registrare automaticamente tre informazioni.
Poiché siamo interessati al modo in cui la nostra app utilizza la memoria, dai il Memoria sezione un clic, che lancerà il Memory Profiler.
Il Memory Profiler è costituito da una timeline che mostra i diversi tipi di memoria attualmente allocati dalla tua app, per esempio Giava, nativo, e pila. Sopra questo grafico troverai una serie di icone che puoi utilizzare per attivare azioni diverse:
Per identificare le parti della tua applicazione che sono responsabili per OutOfMemoryError
, trascorri del tempo interagendo con la tua app e monitora il modo in cui le allocazioni della memoria della tua app cambiano in risposta a diverse azioni. Una volta identificata la sezione del progetto che causa il problema, dedica un po 'di tempo a scrutarlo per eventuali perdite di memoria, nonché a eventuali inefficienze nel modo in cui utilizza la memoria.
In questo articolo abbiamo esaminato 13 dei messaggi di errore che è più probabile incontrare durante lo sviluppo per Android. Abbiamo discusso di tutti i diversi fattori che possono contribuire a questi errori e dei passaggi necessari per risolverli.
Se ti senti afflitto da un messaggio di errore che non abbiamo coperto, il tuo primo passaggio dovrebbe essere quello di copiare / incollare l'intero messaggio di errore in Google, in quanto spesso questo genera thread e post di blog in cui le persone stanno discutendo su come risolvere questo particolare errore.
Inoltre, se non riesci a trovare una soluzione sul Web, puoi sempre contattare direttamente la community di Android inviando la tua domanda a StackTranslate.it.
Mentre s