Que ne pouvez-vous pas faire sur la machine virtuelle Dalvik (la machine virtuelle Android) que vous pouvez sur la machine virtuelle Sun?

StackOverflow https://stackoverflow.com/questions/230193

  •  04-07-2019
  •  | 
  •  

Question

Je sais que vous pouvez exécuter la quasi-totalité de Java dans la machine virtuelle de Dalvik que dans la machine virtuelle de Java , mais les limitations ne sont pas très claires. Quelqu'un a-t-il rencontré des obstacles majeurs? Des grandes bibliothèques ont des problèmes? Les langues compilées en code octet Java ( Scala , Jython , etc.) ne fonctionnent-elles pas comme prévu?

Était-ce utile?

La solution

Il existe un certain nombre de choses que Dalvik ne gérera pas ou ne gérera pas de la même manière que le bytecode Java standard, bien que la plupart d'entre elles soient assez avancées.

L'exemple le plus grave est la génération de bytecode au moment de l'exécution et le chargement de classes personnalisées. Supposons que vous souhaitiez créer un bytecode, puis que vous utilisiez classloader pour le charger, si cette astuce fonctionne sur votre machine normale, il est garanti que cela ne fonctionnera pas sur Dalvik, à moins que vous ne changiez la génération de votre bytecode.

Cela vous empêche d'utiliser certains frameworks d'injection de dépendance, l'exemple le plus connu étant Google Guice (bien que certaines personnes y travaillent, j'en suis sûr). Par ailleurs, AspectJ devrait fonctionner, car il utilise l’instrumentation de code temporel comme étape de compilation (bien que je ne sache pas si quelqu'un essaie de le faire).

En ce qui concerne les autres langages JVM - tout ce qui à la fin est compilé en octet standard et qui n’utilise pas d’instrumentation en octetcode au moment de l’exécution peut être converti en Dalvik et devrait fonctionner. Je sais que des gens ont exécuté Jython sur Android et cela a fonctionné correctement.

Une autre chose à prendre en compte est qu'il n'y a pas de compilation Just in Time . Ce n'est pas strictement un problème Dalviks (vous pouvez toujours compiler n'importe quel bytecode à la volée si vous le souhaitez), mais Android ne le supporte pas et a peu de chances de le faire. Bien que la comparaison micrométrique pour Java standard ait été inutile - les tests avaient des caractéristiques d'exécution différentes pour les composants que pour les systèmes plus grands - les repères micrométriques pour les téléphones Android ont tout leur sens.

Autres conseils

Si vous voyez les composants internes de la machine virtuelle Dalvik " Si vous êtes dans une session Google IO, Dalvik ne prend pas en charge les les CG de génération .

Cela pourrait donc dégrader les performances de la création et de la suppression fréquentes d'objets. La machine virtuelle Java prenant en charge le GC générationnel, elle afficherait de meilleures performances pour la même situation.

Dalvik utilise également trace-granuality JIT au lieu de la granularité de la méthode JIT.

Une autre chose qui pourrait être ajoutée ici est que Dalvik ne préserve apparemment pas l'ordre des champs lors de la liste des champs d'une classe à l'aide de l'API de réflexion. Désormais, l’API de réflexion n’apporte aucune garantie (de manière idéale, vous ne devriez pas en dépendre de toute façon), mais la plupart des autres machines virtuelles existantes conservent l'ordre.

Juste pour ajouter à la conversation, pas pour relancer un ancien fil. Je viens de croiser cela dans mes recherches et je veux ajouter que Jython ne fonctionne pas non plus avec Dalvik. Essayer simplement de faire un exemple hello world donnera les résultats suivants:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top