Javaの VM で実行できるほぼすべての Java をDalvik の VMで実行できることは知っていますが、制限はあまり明確ではありません。大きな障害に遭遇した人はいますか? 問題を抱えている主要なライブラリはありますか? Java バイト コード ( Scala、Jythonなど) にコンパイルされる言語は期待どおりに動作しませんか?
4 に答える
Dalvikが処理しない、または標準のJavaバイトコードとまったく同じように処理しないものがいくつかありますが、それらのほとんどは非常に高度です。
最も深刻な例は、ランタイムバイトコードの生成とカスタムクラスのロードです。バイトコードを作成し、クラスローダーを使用してロードしたいとします。そのトリックが通常のマシンで機能する場合、バイトコードの生成を変更しない限り、Dalvikでは機能しないことが保証されます。
これにより、特定の依存性注入フレームワークを使用できなくなります。最もよく知られている例はGoogle Guiceです(ただし、一部の人はそれに取り組んでいると思います)。一方、AspectJは、コンパイルステップとしてバイトコードインストルメンテーションを使用するため、機能するはずです(誰かが試したかどうかはわかりませんが)。
他のjvm言語に関しては、最終的に標準のバイトコードにコンパイルされ、実行時にバイトコードインストルメンテーションを使用しないものはすべて、Dalvikに変換でき、機能するはずです。私は人々がAndroid上でJythonを実行したことを知っています、そしてそれはうまくいきました。
他に注意すべきことは、実行時コンパイルだけではないということです。これは厳密にはDalviksの問題ではありませんが(必要に応じていつでもその場でバイトコードをコンパイルできます)、Androidはこれをサポートしておらず、サポートする可能性はほとんどありません。その結果、標準Javaのマイクロベンチマークは役に立たなかったが、テストでは、コンポーネントの実行時の特性が大規模なシステムの一部とは異なっていたが、Androidフォンのマイクロベンチマークは完全に理にかなっている。
「Dalvik Virtual Machine internals 」Google IO セッションが表示された場合、Dalvik が世代別 GCをサポートしていないことがわかります。
そのため、頻繁なオブジェクトの作成と削除のパフォーマンスが低下する可能性があります。Java VM は世代別 GC をサポートしているため、同じ状況で GC のパフォーマンスが向上します。
また、Dalvik はメソッド粒度 JIT の代わりにトレース粒度 JITを使用します。
ここに追加できると思うもう1つのことは、リフレクションAPIを使用してクラスのフィールドを一覧表示するときに、Dalvikがフィールドの順序を保持しないように見えることです。現在、リフレクションAPIはとにかくそれを保証しません(したがって、理想的にはとにかくそれに依存するべきではありません)が、そこにある他のほとんどのVMは順序を保持します。
会話に追加するだけで、古いスレッドを復活させることを意図したものではありません. 検索でこれに出くわしましたが、JythonはDalvikでもそのままでは機能しないことを付け加えたいと思います。hello world の例を単純に実行しようとすると、次の結果が得られます。