Domanda

So che è possibile eseguire quasi tutto Java nella VM di Dalvik che è possibile nella VM di Java ma i limiti non sono molto chiari. Qualcuno ha incontrato qualche grosso ostacolo? Qualche libreria importante ha problemi? Qualsiasi lingua compilata in codice byte Java ( Scala , Jython ecc ...) non funziona come previsto?

È stato utile?

Soluzione

Esistono diverse cose che Dalvik non gestirà o non gestirà esattamente allo stesso modo del bytecode Java standard, sebbene la maggior parte di essi sia piuttosto avanzata.

L'esempio più grave è la generazione del bytecode di runtime e il caricamento personalizzato della classe. Supponiamo che tu voglia creare un bytecode e quindi utilizzare classloader per caricarlo per te, se quel trucco funziona sulla tua macchina normale, è garantito che non funzionerà su Dalvik, a meno che tu non cambi la tua generazione di bytecode.

Ciò ti impedisce di utilizzare determinati framework di iniezione di dipendenza, l'esempio più noto è Google Guice (anche se sono sicuro che alcune persone ci lavorano). D'altra parte AspectJ dovrebbe funzionare poiché utilizza la strumentazione bytecode come fase di compilazione (anche se non so se qualcuno ci ha provato).

Per quanto riguarda gli altri linguaggi jvm, tutto ciò che alla fine viene compilato in bytecode standard e non utilizza la strumentazione bytecode in fase di esecuzione può essere convertito in Dalvik e dovrebbe funzionare. So che la gente ha eseguito Jython su Android e ha funzionato bene.

Un'altra cosa da tenere presente è che non esiste nessuna compilazione just in time . Questo non è un problema strettamente di Dalviks (puoi sempre compilare qualsiasi bytecode al volo se lo desideri) ma che Android non lo supporta ed è improbabile che lo faccia. In effetti, mentre il microbenchmarking per Java standard era inutile - i componenti presentavano caratteristiche di runtime diverse nei test rispetto ai componenti di sistemi più grandi - i microbenchmark per telefoni Android hanno perfettamente senso.

Altri suggerimenti

Se vedi " interni della macchina virtuale Dalvik " Sessione Google IO, puoi trovare Dalvik non supporta GC generazionale .

Quindi, potrebbe degradare le prestazioni della creazione e della cancellazione frequenti di oggetti. Java VM supporta GC generazionali, quindi, mostrerebbe migliori prestazioni GC per la stessa situazione.

Inoltre, Dalvik utilizza trace-granuality JIT invece della graniticità del metodo JIT.

Un'altra cosa che suppongo possa essere aggiunta qui è che Dalvik apparentemente non mantiene l'ordine dei campi quando elenca i campi di una classe usando l'API di reflection. Ora, l'API di riflessione non fornisce alcuna garanzia su di essa (quindi idealmente non dovresti dipendere da esso comunque), ma la maggior parte delle altre VM là fuori non conserva l'ordine.

Solo per aggiungere alla conversazione, non destinato a far rivivere un vecchio thread. Mi sono appena imbattuto in questo nella mia ricerca e voglio aggiungere che Jython non funziona nemmeno con Dalvik. Il semplice tentativo di fare un esempio di ciao mondo produrrà quanto segue:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top