57 Stimmen

Was können Sie auf der Dalvik-VM (Android-VM) nicht tun, was Sie auf der Sun-VM können?

Ich weiß, dass Sie fast alle Java-Programme in Dalviks VM die Sie in Javas VM aber die Grenzen sind nicht ganz klar. Ist jemand auf größere Hindernisse gestoßen? Gibt es irgendwelche größeren Bibliotheken, die Probleme machen? Gibt es Sprachen, die sich zu Java-Bytecode kompilieren lassen ( Scala , Jython etc...) nicht wie erwartet funktionieren?

35voto

Marcin Punkte 7674

Es gibt eine Reihe von Dingen, die Dalvik nicht oder nicht auf die gleiche Weise wie der Standard-Java-Bytecode handhabt, obwohl die meisten von ihnen ziemlich fortgeschritten sind.

Le site Das gravierendste Beispiel ist die Erzeugung von Bytecode zur Laufzeit und das Laden benutzerdefinierter Klassen. Nehmen wir an, Sie möchten einen Bytecode erstellen und dann Classloader verwenden, um ihn für Sie zu laden. Wenn dieser Trick auf Ihrem normalen Rechner funktioniert, wird er garantiert nicht auf Dalvik funktionieren, es sei denn, Sie ändern Ihre Bytecode-Generierung.

Das hindert Sie daran, bestimmte Dependency-Injection-Frameworks zu verwenden, das bekannteste Beispiel ist Google Guice (obwohl ich sicher bin, dass einige Leute daran arbeiten). Auf der anderen Seite sollte AspectJ funktionieren, da es Bytecode-Instrumentierung als Kompilierungsschritt verwendet (obwohl ich nicht weiß, ob jemand versucht hat).

Was andere JVM-Sprachen angeht - alles, was letztendlich zu Standard-Bytecode kompiliert und keine Bytecode-Instrumentierung zur Laufzeit verwendet, kann in Dalvik konvertiert werden und sollte funktionieren. Ich weiß, dass Leute Jython auf Android ausgeführt haben und es hat gut funktioniert.

Außerdem ist zu beachten, dass es keine Just-in-Time-Zusammenstellung . Dies ist kein reines Dalvik-Problem (man kann jederzeit jeden Bytecode on the fly kompilieren, wenn man möchte), sondern dass Android dies nicht unterstützt und wahrscheinlich auch nicht tun wird. Während Microbenchmarking für Standard-Java nutzlos war - Komponenten hatten in Tests andere Laufzeiteigenschaften als als Teile größerer Systeme - machen Microbenchmarks für Android-Telefone durchaus Sinn.

6 Stimmen

Ein paar Aktualisierungen: Es gibt einen speziellen Build von Guice, der auf Android funktioniert. code.google.com/p/google-guice/downloads/ Google hat ein Team, das an einem JIT für Android arbeitet. groups.google.com/group/Android-platform/browse_thread/thread/

10 Stimmen

Ab Android Froyo unterstützt es Trace-Granularity JIT-Compiler.

2 Stimmen

Google Guice funktioniert einwandfrei. Ausprobieren roboguice.org für die Verwendung von guice auf Android.

12voto

Wonil Punkte 5996

Wenn Sie " Interna der virtuellen Dalvik-Maschine " Google IO-Sitzung, können Sie finden, Dalvik nicht unterstützt Generation GC .

Dies könnte die Leistung bei der häufigen Erstellung und Löschung von Objekten beeinträchtigen. Java VM unterstützt generationale GC und würde daher in der gleichen Situation eine bessere GC-Leistung aufweisen.

Und außerdem verwendet Dalvik Trace-Granuality JIT anstelle von JIT mit Methodengranularität.

2voto

Wilfred Springer Punkte 10773

Eine weitere Sache, die hier hinzugefügt werden könnte, ist, dass Dalvik anscheinend die Feldreihenfolge nicht beibehält, wenn die Felder einer Klasse über die Reflection-API aufgelistet werden. Nun, die Reflection-API gibt sowieso keine Garantien dafür (also sollte man sich idealerweise nicht darauf verlassen), aber die meisten anderen VMs da draußen tun die Ordnung zu erhalten.

-1voto

Sean Walsh Punkte 1

Ich wollte nur etwas zur Diskussion beitragen, nicht einen alten Thread wiederbeleben. Ich stieß gerade auf diese in meiner Suche, und möchte hinzufügen, dass Jython nicht out of the box mit Dalvik entweder funktioniert. Versuchen Sie einfach, ein Hallo-Welt-Beispiel zu tun wird das folgende Ergebnis:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X