2008-10-23 13 views

risposta

32

C'è un numero di cose che Dalvik non gestirà o non gestirà allo stesso modo del bytecode Java standard, sebbene la maggior parte di esse sia abbastanza avanzata.

L'esempio più grave di è la generazione di codice bytecode e il caricamento della classe personalizzata. Diciamo che ti piacerebbe creare qualche bytecode e quindi usare classloader per caricarlo per te, se quel trucco funziona sulla tua macchina normale, è garantito che non funzioni su Dalvik, a meno che tu non modifichi la generazione del bytecode.

Ciò impedisce di utilizzare alcuni framework di dipendenze per l'iniezione, l'esempio più noto è Google Guice (anche se sono sicuro che alcune persone lavorino su questo). D'altra parte AspectJ dovrebbe funzionare in quanto utilizza la strumentazione bytecode come una fase di compilazione (anche se non so se qualcuno ha provato).

Per quanto riguarda altre lingue JVM - tutto ciò che, alla fine, viene compilato in bytecode standard non utilizza strumentazione bytecode durante il runtime possono essere convertiti in Dalvik e dovrebbe funzionare. So che le persone hanno eseguito Jython su Android e ha funzionato bene.

Un'altra cosa di cui essere a conoscenza è che non è disponibile la compilazione just in time. Questo non è un problema strettamente di Dalviks (puoi sempre compilare qualsiasi bytecode se lo desideri) ma Android non lo supporta ed è improbabile che lo faccia. In effetti, mentre il microbenchmarking per Java standard era inutile - i componenti avevano caratteri di runtime diversi nei test piuttosto che parti di sistemi più grandi - i microbenchmark per i telefoni Android erano assolutamente logici.

+6

Alcuni aggiornamenti: C'è una versione speciale di Guice che funzionerà su Android. http://code.google.com/p/google-guice/downloads/detail?name=guice-2.0-no_aop.jar Google ha una squadra che lavora a un JIT per Android. http: // groups.google.com/group/android-platform/browse_thread/thread/331d5f5636f5f532 –

+10

Da Android Froyo supporta il compilatore JIT trace-granularity. – Wonil

+2

Google Guice funziona bene. Scopri http://roboguice.org per come usare guice su Android. – emmby

11

Se vedi "Dalvik Virtual Machine internals" sessione di Google IO, Dalvik non supporta generational GC.

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

E inoltre, Dalvik utilizza trace-granuality JIT anziché il metodo di granularità JIT.

2

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

-1

Solo per aggiungere alla conversazione, non destinato a far rivivere un thread precedente. Ho appena trovato questo nella mia ricerca, e voglio aggiungere che Jython non funziona immediatamente con Dalvik. Semplicemente cercando di fare un esempio ciao mondo produrrà il seguente:

Problemi correlati