Runtime environment used by Android
Android Runtime ( ART )は、 Android オペレーティングシステム で使用される アプリケーション ランタイム環境 です。Android で元々使用されていたプロセス仮想マシンであるDalvikに代わるARTは、アプリケーションのバイトコードの一部をネイティブ命令に変換し 、 デバイス の ランタイム 環境 で 実行 し ます。 [2]
概要
DalvikとARTアーキテクチャの比較
Android 2.2「Froyo」 では、Dalvikに トレースベースのジャストインタイム(JIT)コンパイル が導入され、アプリケーションの実行 ごとに継続的に プロファイリングを 行い、頻繁に実行されるバイトコードの短いセグメントをネイティブ マシンコードに動的に コンパイルする ことで、アプリケーションの実行を最適化しました。Dalvikはアプリケーションのバイトコードの残りの部分 を解釈します が、「トレース」と呼ばれるこれらの短いバイトコードセグメントをネイティブに実行することで、パフォーマンスが大幅に向上します。 [3] [4]
Dalvikとは異なり、ARTは事前コンパイル(AOT) を導入し 、アプリケーション(以前はアプリ全体)の最もパフォーマンスが重要な部分をインストール時にネイティブマシンコードにコンパイルします。これにより、ARTは全体的な実行効率を向上させ、消費電力を削減し、 モバイルデバイス のバッテリー駆動時間を向上させます。同時に、ARTはアプリケーションの実行速度向上、 メモリ割り当て と ガベージコレクション (GC)メカニズムの改善、新しいアプリケーション デバッグ 機能、そしてより正確なアプリケーションの高レベルプロファイリングを実現します。 [2] [5] [6]
後方互換性 を維持するため 、ARTはDalvikと同じ入力バイトコードを使用します。これは APKファイル の一部として標準の .dex ファイルを通じて提供されますが、 .odexファイルはELF( Executable and Linkable Format )実行ファイルに置き換えられます。ARTのデバイス内 dex2oat ユーティリティを使用してアプリケーションをコンパイルすると 、コンパイルされたELF実行ファイルから実行されます。その結果、ARTはDalvikの解釈処理とトレースベースのJITコンパイルに関連するさまざまなアプリケーション実行オーバーヘッドを排除します。
ARTの欠点は、アプリケーションのインストール時にコンパイルに追加の時間がかかることと、 コンパイルされたコードを保存するためにアプリケーションが若干多くの 二次記憶装置 (通常は フラッシュメモリ)を占有することです。 [2] [5] [6] 長時間のAOTコンパイルは、毎月のセキュリティ更新が標準となり、更新のたびにユーザーが長期間OSにアクセスできなくなると特に問題になりました。
これらを改善するために、Android 7.0(Nougat)ではハイブリッドアプローチが導入されました。これは当初はJITコンパイルに依存していましたが、後にデバイスがアイドル状態や充電中のときに、最も頻繁に使用されるコードとUIスレッド上のコードをネイティブコードにコンパイルします。 [7]
歴史
Android 4.4「KitKat」では、 デフォルトの仮想マシンとして残っていたDalvikの代替ランタイム環境としてARTの 技術プレビュー が導入されました。 [8] [9] その後のAndroidのメジャーリリースである Android 5.0「Lollipop」 では、Dalvikは完全にARTに置き換えられました。
Android 7.0「Nougat」 では、ARTが純粋なAOTからJIT/AOTのハイブリッドソリューションへと移行し、 Javaランタイム環境 が廃止された Apache Harmonyから OpenJDK に切り替えられ 、コードプロファイリング機能を備えたJITコンパイラが導入されました。 [10] JITコンパイラはARTのAOTコンパイラを補完し、「ホットコード」(頻繁に使用されるコード、UIスレッドで実行されるコード、または起動時間に影響を与えるコード)を特定することで、実行時のパフォーマンス向上とストレージ容量の節約に役立ちます。AOTコンパイラは、デバイスがアイドル状態または充電中に、ホットコードをマシンコードにコンパイルします。使用頻度の低いコードはJITコンパイルに依存します。 [11] [12]
Android 9「Pie」 では、圧縮 バイトコードファイルを使用することで APK のストレージ使用量を削減し 、 プロファイラデータを Google Play サーバーにアップロードして 、同様のデバイスを持つユーザーがアプリをダウンロードする際にバンドルできるようになりました。これにより、Google Playからのダウンロード時間が最大40%短縮されます。Google Playのクラウドプロファイルにより、アプリはインストール時に最適化されるため、Android 7.0から8.1で発生していた初期パフォーマンスの問題を回避できます。 [13]
2021年7月、 [14] にベースラインプロファイルの概念が導入されました。ベースラインプロファイルは、アプリの初回起動時からAOTコンパイルを実行するメソッドとクラスを定義するARTプロファイルであり、Android 7.0以降と互換性があります。Android 9のGoogle Playクラウドプロファイルが利用できない場合は同様の機能を提供し、クラウドプロファイルが利用可能になった場合は自動的に統合されます。ベースラインプロファイルは、AndroidXライブラリと Jetpack Compose のリリースに含まれています。 [15]
Android 13 では、ARTが Linuxの userfaultfd システムコール を利用した新しい ガベージコレクター (GC)に更新されました 。 [16] [17] [18]これにより、メモリ負荷、コンパイルされたコードサイズ、 ジャンクが 軽減され、 ガベージコレクション 中にメモリ不足が原因でアプリが強制終了するリスクが防止されます 。 [18] その他の変更点も、アプリの起動を改善し、ジャンクを減らし、パフォーマンスを向上させます。 [18] メインラインプロジェクトにより、 Android 12 のARTも更新されます。 [16]
参照
参考文献
^ “NOTICE - platform/art - Git at Google”. 2023年3月4日時点のオリジナルよりアーカイブ。 2021年 6月25日 閲覧 。
^ abc Andrei Frumusanu (2014年7月1日). 「Android LのAndroid RunTime (ART)の詳細」. AnandTech . 2014年7月5日時点のオリジナルよりアーカイブ 。 2014年 7月5日 閲覧。
^ Ben Cheng、Bill Buzbee (2010年5月). 「AndroidのDalvik VM向けJITコンパイラ」 (PDF) . android-app-developer.co.uk . Google . pp. 5– 14. 2015年11月6日時点の オリジナル (PDF)からのアーカイブ。 2015年 3月18日 閲覧 。
^ Phil Nickinson (2010年5月26日). 「Google Android開発者がDalvikとFroyoのJITについてさらに詳しく説明」. androidcentral.com . 2017年4月8日時点のオリジナルよりアーカイブ。 2014年 7月8日 閲覧 。
^ ab 「Android Developers: ART and Dalvik」. source.android.com . 2015年3月9日. 2015年3月15日時点のオリジナルよりアーカイブ。 2015年 3月18日 閲覧 。
^ ab 「Android Developers: ART の設定 – ART の仕組み」. source.android.com . 2015年3月9日. 2015年 3月18日 閲覧 。
^ Amadeo, Ron (2016年8月22日). 「Android 7.0 Nougatレビュー:巨大なスマートフォンでもっと活用しよう」 Ars Technica . 2023年 4月5日 閲覧 。
^ Sean Buckley (2013年11月6日). 「Android KitKatの『ART』実験によりバッテリー寿命が向上、アプリの速度も向上」 Engadget . 2017年1月27日時点のオリジナルよりアーカイブ。 2014年 7月5日 閲覧 。
^ Daniel P. (2013年11月7日). 「Android KitKatの実験的なGoogle ARTランタイムは、アプリの実行速度を2倍に高速化します」. phonearena.com . 2014年7月7日時点のオリジナルよりアーカイブ。 2014年 7月5日 閲覧 。
^ 「Android 7.0 for Developers」. Android Developers . 2021年 3月22日 閲覧 。
^ Amadeo, Ron (2016年8月22日). 「Android 7.0 Nougatレビュー:巨大なスマートフォンでもっと活用しよう」 Ars Technica . 2023年 4月5日 閲覧 。
^ 「ART Just-In-Time (JIT) コンパイラの実装」. source.android.com . 2017年1月22日. 2023年8月8日時点のオリジナルよりアーカイブ 。 2017年 1月22日 閲覧。
^ Amadeo, Ron (2018年9月13日). 「Android 9 Pie、徹底レビュー」 Ars Technica . 2018年11月30日時点のオリジナルよりアーカイブ 。 2022年 8月16日 閲覧。
^ “ProfileInstaller | Jetpack”. Android Developers . 2023年8月8日時点のオリジナルよりアーカイブ。 2023年 7月5日 閲覧 。
^ Semenova, Kateryna; Ravikumar, Rahul; Craik, Chris (2022年1月28日). 「ベースラインプロファイルによるアプリパフォーマンスの向上」. Android Developers Blog . 2023年8月8日時点のオリジナルよりアーカイブ。 2023年 7月5日 閲覧 。
^ ab Gidra, Lokesh (2022年5月12日)、「What's new in app performance」、2022年8月16日時点のオリジナルよりアーカイブ 、 2022年 8月16日閲覧
^ Gidra, Lokesh; Boehm, Hans-J.; Fernandes, Joel (2020年10月12日). 「ガベージコレクションプロセスの圧縮フェーズにおけるLinux Userfaultfdシステムコールの利用」. Defensive Publications Series . 2022年8月16日時点のオリジナルよりアーカイブ。 2022年 8月16日 閲覧 。
^ abc 「Android 13がAOSPに登場!」 Android Developers Blog . 2022年8月15日時点のオリジナルよりアーカイブ。 2022年 8月16日 閲覧 。
外部リンク
Wikimedia Commons には、 Android ランタイム に関連するメディアがあります。
公式サイト
Android の基礎 101: YouTube の Android ランタイム ART を理解する 、 XDA Developers 、2014 年 2 月 12 日
ART: Android のランタイムの進化 (YouTube、 Google I/O 2014、Anwar Ghuloum、Brian Carlstrom、Ian Rogers 著)
YouTube の「Android の Dalvik VM 用 JIT コンパイラ」、Google I/O 2010、Ben Cheng と Bill Buzbee 著
インテル アーキテクチャー上で高度に最適化された Android ランタイム (ART) と Web ランタイムを実現する、 インテル 、2015 年 8 月 4 日、Haitao Feng と Jonathan Ding 著
Android 7.1 開発者向け: プロファイル ガイドによる JIT/AOT コンパイル、Android 開発者、 Android 7.1の ART の変更点について説明しています