Runtime di Android e Dalvik

Il runtime Android (ART) è il runtime gestito utilizzato dalle app e da alcuni servizi di sistema su Android. ART e il suo predecessore Dalvik sono stati originariamente creati specificamente per il progetto Android. ART, in qualità di runtime, esegue il formato eseguibile Dalvik (DEX) e la specifica del bytecode DEX.

ART e Dalvik sono runtime compatibili che eseguono il bytecode DEX, pertanto le app sviluppate per Dalvik dovrebbero funzionare quando vengono eseguite con ART. Tuttavia, alcune tecniche che funzionano su Dalvik non funzionano su ART. Per informazioni sui problemi più importanti, consulta Verificare il comportamento dell'app nel runtime Android (ART).

Funzionalità ART

Ecco alcune delle principali funzionalità implementate da ART.

Compilazione ahead-of-time (AOT)

ART introduce la compilazione ahead-of-time (AOT), che può migliorare il rendimento delle app. ART ha anche una verifica più rigorosa al momento dell'installazione rispetto a Dalvik.

Al momento dell'installazione, ART compila le app utilizzando lo strumento dex2oat on-device. Questa utility accetta file DEX come input e genera un file eseguibile dell'app compilata per il dispositivo di destinazione. L'utilità dovrebbe essere in grado di compilare tutti i file DEX validi senza difficoltà. Tuttavia, alcuni strumenti di post-elaborazione producono file non validi che potrebbero essere tollerati da Dalvik, ma non possono essere compilati da ART. Per ulteriori informazioni, consulta Risolvere i problemi di raccolta dei rifiuti.

Garbage collection migliorata

La raccolta dei rifiuti (GC) richiede molte risorse, il che può influire sulle prestazioni di un'app, provocando una visualizzazione discontinua, una scarsa reattività dell'interfaccia utente e altri problemi. ART migliora la raccolta del garbage in diversi modi:

  • Progettazione prevalentemente concorrente con una singola interruzione del GC
  • Copia simultanea per ridurre l'utilizzo e la frammentazione della memoria in background
  • La durata della pausa del GC è indipendente dalle dimensioni dell'heap
  • Gestore con tempo di GC totale inferiore per il caso speciale di pulizia degli oggetti di breve durata allocati di recente
  • Miglioramento dell'ergonomia della raccolta dei rifiuti, che rende più tempestive le raccolte contemporaneamente, rendendo gli eventi GC_FOR_ALLOC estremamente rari nei casi d'uso tipici

Miglioramenti per lo sviluppo e il debug

ART offre una serie di funzionalità per migliorare lo sviluppo e il debug delle app.

Supporto per il profiler del campionamento

In passato, gli sviluppatori utilizzavano lo strumento Traceview (disponibile per il monitoraggio dell'esecuzione delle app) come profiler. Sebbene Traceview fornisca informazioni utili, i suoi risultati su Dalvik sono stati alterati dall'overhead per chiamata di metodo e l'utilizzo dello strumento influisce notevolmente sul rendimento in fase di esecuzione.

ART aggiunge il supporto di un profiler di campionamento dedicato che non presenta queste limitazioni. In questo modo viene fornita una visione più accurata dell'esecuzione dell'app senza un rallentamento significativo. Il supporto del campionamento è stato aggiunto a Traceview per Dalvik nella release KitKat.

Supporto di altre funzionalità di debug

ART supporta una serie di nuove opzioni di debug, in particolare nelle funzionalità relative al monitoraggio e alla raccolta dei rifiuti. Ad esempio, puoi:

  • Controlla quali lock sono trattenuti nelle tracce dello stack, quindi vai al thread che detiene una serratura.
  • Chiedi quante istanze attive sono presenti di una determinata classe, chiedi di visualizzarle e controlla quali riferimenti mantengono attivo un oggetto.
  • Filtra gli eventi (ad esempio i breakpoint) per un'istanza specifica.
  • Visualizza il valore restituito da un metodo quando esce (utilizzando gli eventi "method-exit").
  • Imposta un punto di controllo del campo per sospendere l'esecuzione di un programma quando viene eseguito l'accesso a un campo specifico e/o viene modificato.

Dettagli diagnostici migliorati nelle eccezioni e nei report sugli arresti anomali

ART fornisce il maggior contesto e i dettagli possibili quando si verificano eccezioni di runtime. ART fornisce dettagli estesi sulle eccezioni per java.lang.ClassCastException, java.lang.ClassNotFoundException e java.lang.NullPointerException. Le versioni successive di Dalvik fornivano dettagli estesi sulle eccezioni per java.lang.ArrayIndexOutOfBoundsException e java.lang.ArrayStoreException, che ora includono le dimensioni dell'array e l'offset fuori intervallo, e ART lo fa anche.

Ad esempio, java.lang.NullPointerException ora mostra informazioni su cosa stava cercando di fare l'app con il puntatore nullo, ad esempio il campo in cui stava tentando di scrivere o il metodo che stava tentando di chiamare. Di seguito sono riportati alcuni esempi tipici:

java.lang.NullPointerException: Attempt to write to field 'int
android.accessibilityservice.AccessibilityServiceInfo.flags' on a null object
reference
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String java.lang.Object.toString()' on a null object reference

ART fornisce inoltre informazioni contestuali migliorate nei report sugli arresti anomali nativi dell'app, includendo sia le informazioni sullo stack Java che quelle native.

Segnalare problemi

Se riscontri problemi non dovuti a problemi JNI dell'app, segnalali tramite il tracker dei problemi del progetto Android Open Source. Includi un adb bugreport e un link all'app nel Google Play Store, se disponibile. In caso contrario, se possibile, allega un APK che riproduca il problema.