| ダルヴィク | |
|---|---|
| 原作者 | ダン・ボーンスタイン |
| オペレーティング·システム | Linuxカーネル |
| プラットフォーム | アンドロイド |
| 後継 | Android ランタイム |
| タイプ | 仮想マシン |
| ライセンス | Apacheライセンス2.0 |
| Webサイト | ソース |
| リポジトリ | |
Dalvikは、 Androidオペレーティングシステムで廃止されたプロセス仮想マシン(VM)であり、Android用に作成されたアプリケーションを実行します。[ 1 ](Dalvikバイトコード形式は現在も配布形式として使用されていますが、新しいAndroidバージョンでは実行時には使用されなくなりました。)Dalvikは、(現在はサポートされていない)Androidバージョン4.4「KitKat」以前のAndroidソフトウェアスタックの不可欠な部分であり、携帯電話やタブレットコンピューターなどのモバイルデバイス、さらにはスマートテレビやウェアラブルなどの一部のデバイスで一般的に使用されていました。Dalvikはオープンソースソフトウェアで、もともとDan Bornsteinによって作成され、アイスランドのエイヤフィヨルズルにある漁村Dalvíkにちなんで名付けられました。[ 2 ] [ 3 ]
Android向けプログラムは通常Javaで記述され、 Java仮想マシン(Java VM )用のバイトコードにコンパイルされます。その後、Dalvikバイトコードに変換され、(Dalvik実行可能ファイル)および(最適化されたDalvik実行可能ファイル)ファイルに保存されます。関連用語であるodexおよびde-odexは、それぞれのバイトコード変換に関連しています。コンパクトなDalvik実行可能ファイル形式は、メモリとプロセッサ速度の制約があるシステム向けに設計されています。 .dex.odex
Dalvikの後継はAndroid Runtime(ART)です。ARTはDalvikと同じバイトコードと.dexファイル(ただし.odexファイルは使用しない)を使用し、パフォーマンス向上を目指しています。この新しいランタイム環境は、Android 4.4「KitKat」で初めてテクノロジープレビューとして搭載され、[ 4 ] [ 5 ]、その後のバージョンではDalvikに完全に置き換えられました。Android 5.0「Lollipop」は、ARTのみがランタイムとして搭載された最初のバージョンです。
歴史
Dalvikは、作者のダン・ボーンスタインによってアイスランドの町にちなんで名付けられ、 [ 6 ] RAMとCPUの非常に少ない組み込みデバイスでJavaコードを実行するために設計され、[ 7 ]最終的には「高負荷アプリ」向けにC++を、「軽量ウィジェットのようなアプリ」向けにJavaScriptを第一級言語としてサポートし、Javaが残りの部分に対応することになりました。最終的にC++サポートへの道を開いたAndroid Native Development Kitは、 Dalvikの最初の公開リリースから存在していました。ボーンスタインによると、複数のプロセスにまたがる実行可能ファイルとライブラリのメモリマッピングと、レジスタベースのセマンティクスを備えたより高速なインタープリタの構築が、バイト境界整列命令セットと仮想マシンの初期設計の大部分を推進しました。サイドキックの危機でJ2MEを扱った経験から、ボーンスタインはJ2MEがAndroidには簡素化されすぎていて制約がかなり大きいことに気づきました。当時サンが計画していたIsolateなどの改善は、 Androidのデバイス内セキュリティモデルを破壊するため、プロセス分離を実現不可能にしました。 Dalvik VMに関しては、Bornsteinは特にダブリンのトリニティ・カレッジのブライアン・デイビスらが執筆した「レジスタマシンの事例」[ 6 ]からインスピレーションを得ました。 [ 8 ]
Dalvikは2008年にAndroidオープンソースプロジェクトの他の部分と同様にApache License v2の下でオープンソース化されました。[ 9 ]
建築

スタックマシンであるJava仮想マシンとは異なり、Dalvik VMはレジスタベースのアーキテクチャを採用しており、より少ない、通常はより複雑な仮想マシン命令を必要とします。Dalvikプログラムは、Androidアプリケーションプログラミングインターフェース(API)を使用してJavaで記述され、Javaバイトコードにコンパイルされ、必要に応じてDalvik命令に変換されます。
Javaの.classファイルを.dex形式に変換するには、と呼ばれるツールdxを使用します。複数のクラスが1つの.dexファイルに含まれます。複数のclassファイルで使用されている重複した文字列やその他の定数は、スペースを節約するために、.dex出力では一度だけ含まれます。Javaバイトコードも、Dalvik VMで使用される代替命令セットに変換されます。非圧縮の.dexファイルは、通常、同じ.classファイルから作成された圧縮されたJavaアーカイブ(JAR)よりも数パーセントサイズが小さくなります。 [ 10 ]
Dalvik実行ファイルは、モバイルデバイスにインストールされた際に再度変更される可能性があります。さらなる最適化を図るため、例えば、特定のデータのバイトオーダーを入れ替えたり、単純なデータ構造や関数ライブラリをインラインリンク したり、空のクラスオブジェクトをショートサーキット化したりといった変更が行われる場合があります。
Dalvikはメモリ要件が低いように最適化されており、他の標準的なVMとは異なるいくつかの特徴を持っています。[ 11 ]
- VM はスリム化され、使用するスペースが少なくなりました。
- インタープリタを簡素化するために、定数プールは32 ビットのインデックスのみを使用するように変更されました。
- 標準的なJavaバイトコードは8ビットのスタック命令を実行します。ローカル変数は、別の命令でオペランドスタックにコピーしたり、オペランドスタックからコピーしたりする必要があります。Dalvikは、代わりにローカル変数に直接作用する独自の16ビット命令セットを使用します。ローカル変数は通常、 4ビットの「仮想レジスタ」フィールドによって選択されます。これにより、Dalvikの命令数は削減され、インタープリタの速度が向上します。
Dalvikの設計により、デバイスはVMの複数のインスタンスを効率的に実行することができます。[ 12 ] [ 13 ]
Android 2.2「Froyo」では、トレースベースのジャストインタイム(JIT)コンパイルがDalvikに導入され、アプリケーションの実行ごとに継続的にプロファイリングを行い、頻繁に実行されるバイトコードの短いセグメントをネイティブマシンコードに動的にコンパイルすることで、アプリケーションの実行を最適化しました。Dalvikはアプリケーションの残りのバイトコードを解釈しますが、「トレース」と呼ばれるこれらの短いバイトコードセグメントをネイティブ実行することで、パフォーマンスが大幅に向上します。 [ 14 ] [ 15 ] [ 16 ]潜在的なトレースヘッドは、コンパイラのフロントエンドで解析段階とバイトコード変換後に識別されます。実行時には変換キャッシュが維持されます。複数のトレースを連結することで、コンパイラとインタープリタ間の同期を削減できます。トレースは、単一の静的代入形式に変換することで最適化され、デッドストアの除去、変数の折りたたみ、ゲッターとセッターのインライン化などの最適化が可能になります。[ 12 ]
パフォーマンス

スタックマシンとレジスタベースのアプローチの相対的な利点については、現在も議論が続いている。[ 17 ]
一般的に、スタックベースのマシンは、スタックにデータをロードし、そのデータを操作するために命令を使用する必要があるため、同じ高水準コードを実装するためにレジスタベースのマシンよりも多くの命令が必要になります。しかし、レジスタベースのマシンの命令はソースレジスタとデスティネーションレジスタをエンコードする必要があるため、命令サイズが大きくなる傾向があります。この違いは、オペコードのディスパッチがコスト高になる傾向があるVMインタープリタにとって重要であり、ジャストインタイムコンパイルにも同様に関係する他の要因も同様です。
2010年にOracle(Javaテクノロジーの所有者)がARMv7デバイスで標準の非グラフィカルJavaベンチマークを使用して行ったテストでは、Java SE組み込みのHotSpot VMがAndroid 2.2(JITコンパイラを搭載した最初のAndroidリリース)のJITベースのDalvik VMよりも2~3倍高速であることが示されました。 [ 18 ] 2012年には、学術的なベンチマークで、同じAndroidボード上のHotSpotとDalvikの間で3倍の速度が確認され、DalvikコードはHotspotよりも小さくないことも指摘されました。[ 19 ]
さらに、2014年3月時点で、Androidデバイスで実行されたベンチマークでは、同じAndroidデバイス上のネイティブアプリケーションとDalvikアプリケーションの間で、最大100倍の速度向上が見られました。[ 20 ] 2009年の初期のインタープリタを使用してベンチマークを実行したところ、Java Native Interface(JNI)とネイティブコードの両方で桁違いの高速化が見られました。[ 21 ]
ライセンスと特許
DalvikはApache License 2.0の条件に基づいて公開されています。[ 22 ] Dalvikは標準Javaランタイム上での開発ではなくクリーンルーム実装であると考える人もいます。つまり、標準版やオープンソース版のJavaランタイムから著作権ベースのライセンス制限を継承していないということです。[ 23 ] Oracleや一部のレビュー担当者はこれに異議を唱えています。[ 24 ]
2010年8月12日、 2009年4月にサン・マイクロシステムズを買収し、Javaの権利を所有するオラクルは、著作権と特許を侵害したとしてグーグルを提訴した。オラクルは、グーグルがAndroidの開発において、オラクルのJava関連の知的財産を故意に直接繰り返し侵害したと主張した。 [ 25 ] [ 26 ] [ 27 ] 2012年5月、この事件の陪審はグーグルがオラクルの特許を侵害していないとの判決を下し、裁判官はグーグルが使用したJava APIの構造は著作権で保護されないとの判決を下した。[ 28 ] [ 29 ]両当事者は、コピーされた9行のコードに対する法定損害賠償を0ドルにすることで合意した。[ 30 ] [ 31 ]
参照
- Android ランタイム
- Androidソフトウェア開発
- アプリケーション仮想化
- アプリケーション仮想化ソフトウェアの比較
- JavaとAndroid APIの比較
- JEB デコンパイラ– Dalvik (DEX および APK) デコンパイラ
- Dalvik Turbo仮想マシン– 独自の代替Dalvik実装
参考文献
- ^ 「ARTガベージコレクションのデバッグ」 。 2015年10月6日閲覧。Dalvik
ランタイムは[Androidの現在のバージョンでは]メンテナンスされておらず、利用できなくなっており、そのバイトコード形式は現在ARTで使用されています。
- ^名前の由来について言及した日記
- ^ 「Google Calling: Inside Android, the gPhone SDK」 . onlamp.com . 2017年1月10日時点のオリジナルよりアーカイブ。 2008年2月5日閲覧。
- ^ショーン・バックリー (2013年11月6日) .Android KitKatの「ART」実験により、バッテリー寿命が延び、アプリの速度も向上。Engadget 。2014年7月5日閲覧。
- ^ Daniel P. (2013年11月7日). 「Android KitKatの実験的なGoogle ARTランタイムは、アプリの実行速度を2倍に高速化します」 . phonearena.com . 2014年7月5日閲覧。
- ^ a b Dalvik VMの作者、Dan Bornstein氏とのライブQ&A。InfoQ。 2015年9月29日 – YouTube経由。
- ^ Google I/O 2008 - Dalvik 仮想マシンの内部構造。Google 。 2008年6月4日 – YouTube経由。
- ^ブライアン・デイビス、アンドリュー・ビーティー、ケビン・ケイシー、デビッド・グレッグ、ジョン・ウォルドロン (2003年6月8日). 「仮想レジスタマシンのケース」(PDF) . 2003年インタープリタ、仮想マシン、エミュレータに関するワークショップ議事録. pp. 41– 49. doi : 10.1145/858570.858575 . ISBN 1-58113-655-2. 2024年2月1日時点のオリジナル(PDF)からアーカイブ。
{{cite book}}:|journal=無視されました (ヘルプ) - ^ Beschizza, Rob (2007年11月12日). 「Android SDK Open For Code」 . WIRED . 2024年1月31日時点のオリジナルよりアーカイブ。
- ^ Bornstein, Dan (2008-05-29). 「Dalvik VM内部構造のプレゼンテーション」(PDF) . p. 22. 2017-04-16時点のオリジナル(PDF)からのアーカイブ。2010-08-16閲覧。
- ^ Rose, John (2008年5月31日). 「AndroidとDalvikを使ったGoogle I/O」 . 2008年6月4日時点のオリジナルよりアーカイブ。2008年6月8日閲覧。
- ^ a b Ramanan, Neeraja (2011年12月12日). 「JITの歴史」(PDF) .
- ^ Google (2009年4月13日). 「Androidとは?」 . 2009年6月27日時点のオリジナルよりアーカイブ。2009年4月19日閲覧。
- ^ Ben Cheng、Bill Buzbee (2010年5月). 「AndroidのDalvik VM向けJITコンパイラ」(PDF) . android-app-developer.co.uk . pp. 5– 14. 2015年11月6日時点のオリジナル(PDF)からのアーカイブ。 2015年3月18日閲覧。
- ^ Phil Nickinson (2010年5月26日). 「Google Android開発者がDalvikとFroyoのJITについてさらに詳しく説明」 . androidcentral.com . 2014年7月14日時点のオリジナルよりアーカイブ。 2014年7月8日閲覧。
- ^ 「Nexus OneはAndroid 2.2 Froyoを搭載。2.1と比べてどれくらい速いのか? なんと、わずか450%程度しか速くない」 2010年5月13日. 2010年5月21日閲覧。
- ^ Shi, Yunhe; Gregg, David; Beatty, Andrew; Ertl, M. Anton (2005-06-11). 「仮想マシン対決:スタック対レジスタ」(PDF) . 2009年12月22日閲覧。
- ^ Vandette, Bob (2010-11-22). 「Java SE Embedded と Android 2.2 のパフォーマンス比較」 . Oracle Corporation . 2011-06-28 にオリジナルからアーカイブ。2011-09-04に取得。
結果によると、Android の新しい JIT はインタープリタのみの実装に比べて改善されていますが、Android は依然として Hotspot 対応の Java SE Embedded のパフォーマンスに遅れをとっています。上記の結果からわかるように、Java SE Embedded は Android 2.2 よりも 2~3 倍高速に Java バイトコードを実行できます。
- ^ Hyeong-Seok Oh; Beom-Jun Kim; Hyung-Kyu Choi; Soo-Mook Moon (2012). Proceedings of the 10th International Workshop on Java Technologies for Real-time and Embedded Systems - JTRES '12 . Association for Computing Machinery . p. 115. doi : 10.1145/2388936.2388956 . ISBN 9781450316880. S2CID 36316611 .
ただし、JITC モードでは、Dakvik は HotSpot よりも 2.9 倍以上遅く、コード品質の悪さとトレース チェーン コードが原因で、生成されるコード サイズは HotSpot よりも小さくなりません。
- ^ 「Top AndEBench Scores」 . www.eembc.org . 2014年3月23日閲覧。
- ^ Batyuk, Leonid; Schmidt, Aubrey-Derrick; Schmidt, Hans-Gunther; Camtepe, Ahmet; Albayrak, Sahin (2009-04-29). 「AndroidにおけるネイティブLinuxアプリケーションの開発とベンチマーク」. MobileWirelessミドルウェア、オペレーティングシステム、およびアプリケーション. コンピュータサイエンス、社会情報学、電気通信工学研究所講義ノート. 第7巻. pp. 381– 392. Bibcode : 2009mmos.book..381B . doi : 10.1007/978-3-642-01802-2_28 . ISBN 978-3-642-01801-5. S2CID 12131309 .
結果によると、ネイティブCアプリケーションは、Dalvik VMで実行される同一アルゴリズムと比較して最大30倍高速化できます。Javaアプリケーションは、JNIを利用することで最大10倍高速化できます。
- ^ 「ソースツリーのダウンロード - Android Open Source」 . Android.git.kernel.org. 2009年4月17日時点のオリジナルよりアーカイブ。 2012年6月7日閲覧。
- ^ガーリング、カレブ。 「GoogleとOracleの『専門家』がAndroidのJava Mimicをめぐって対立」Wired。
- ^ Ed Bott (2011年9月8日). 「Googleが語るJavaとAndroidの本当の歴史」 . ZDNet . 2011年11月27日閲覧。
「クリーンルーム」実装の定義は、コードを書くエンジニアが、コード、仕様、その他のドキュメントを含む、著作権で保護されたオリジナルの資料に直接触れないことです。昨日の投稿で述べたように、これはGoogleにとって問題です。なぜなら、プロジェクトに携わったエンジニアが著作権で保護された資料に直接アクセスしていたという確固たる証拠があるからです。
- ^ 「Oracle、AndroidデバイスにおけるJava使用をめぐりGoogleを提訴」 digitaltrends.com、2010年8月13日。 2011年8月8日閲覧。
- ^ James Niccolai (2010年8月12日). 「Oracle、AndroidにおけるJavaの使用をめぐりGoogleを提訴」 Computerworld . 2023年4月1日時点のオリジナルよりアーカイブ。 2010年8月13日閲覧。
- ^ Mark Hachman (2010年8月13日). 「Oracle、AndroidでのJava使用をめぐりGoogleを提訴」 . PC Magazine . Ziff Davis .
- ^ Josh Lowensohn (2012年5月23日). 「陪審、GoogleのOracle特許侵害を否定」 . ZDNet . 2012年5月25日閲覧。
- ^ Joe Mullin (2012年5月31日). 「GoogleがAPI訴訟で重要な判決を勝ち取る、Oracleの訴訟は壊滅的」 Ars Technica . 2012年6月1日閲覧。
- ^ Niccolai, James (2012年6月20日). 「Oracle、Google訴訟で損害賠償「ゼロ」に合意、控訴を検討」 . 2023年4月1日時点のオリジナルよりアーカイブ。2012年6月23日閲覧。
- ^ Adam Outler (2012年5月16日). 「Oracle対Google裁判の最新情報」 . 2013年5月16日時点のオリジナルよりアーカイブ。 2013年1月18日閲覧。Oracle
の主張の大部分は、Java.Util.Arrays.rangeCheck() に含まれる9行のコードに基づいています。問題のコードは次のとおりです。
外部リンク
- Dalvikバイトコード–命令セットの公式Androidドキュメント
- Dex実行ファイル形式– Android公式ドキュメント
- YouTubeの「Android の Dalvik VM 用 JIT コンパイラ」、Google I/O 2010、Ben Cheng と Bill Buzbee 著
- Dalvik VM 内部構造は、 2010 年 3 月 1 日にWayback Machineにアーカイブされました。Google I/O 2008、著者: Dan Bornstein
- 8 億ドルの価値がある質問: 商標と著作権の違いは何ですか?