Android Runtimeについて
Android Runtimeとは?
Androidのアプリを開発するときに、APKをビルドしてバイトコードを含む.dex
ファイルを生成して、それをAndroid Runtimeで機械語に変換するようになっています。
今回は、DalvikやARTなど、これらがどう違うのかについて今回は調べてみました。
Dalvikとは?
Dalvikは、JITコンパイルをベースにした最初のAndroid Runtimeです。
JITコンパイルをベースにしているので、アプリを実行するたびにバイトコードから機械語に翻訳する必要があるので、バッテリーの消費に影響を与えたりして、パフォーマンスに影響が出ていました。
ARTとは?
ARTは、AOTコンパイルをベースにしたAndroid Runtimeです。
Android 5.0より、DalvikからARTに置き換わりました。
ARTは、AOTコンパイルをベースにしているので、アプリのインストール時のみバイトコードから機械語に翻訳されます。
先ほど見たDalvikは、アプリの実行のたびにバイトコードから変換していたので、バッテリーの消費に影響を与えるなどのデメリットがありましたが、ARTはこの問題を解決しています。
また他にもメリットがあり、ARTではガベレージコレクションの改善がされています。
具体的な例はこちらを参照してください🙏
しかし、インストール時にバイトコードからマシンコードに変換するため、アプリのインストールに時間がかかるというデメリットもあります。
他にも、変換した機械語をディスクに保存しておくため、Dalvikより多くのスペースを必要としている点もデメリットとして挙げられます。
さらに、起動時にキャッシュを構築するので、起動時間が長くなりがちなのもデメリットとして挙げられます。
これらの問題を解決するために、Android 7.0からProfile-guidedコンパイルというものが導入されました。
Profile-guidedコンパイルとは?
Profile-guidedコンパイルは、JITコンパイルをベースにしているため、アプリの実行のたびにバイトコードの変換が行われます。しかし、Profile-guidedコンパイルを使用すると、アプリのどの部分が頻繁に使われているのかを学習することができ、それにより頻繁に使われている部分をキャッシュしてディスクに保存することで、ARTのデメリットで挙げられたスペースを多く必要とする問題を解決しています。
ARTのデメリットで挙げた、ディスクのスペースを多く必要とする問題、起動時間が長くなってしまう問題などを解決することができました。
ただ、このProfile-guidedコンパイルを使用しても、残された一つの問題として、アプリの初期数回におけるパフォーマンスの低さが挙げられます。何回も実行することで、パフォーマンスを上げていくので、初期の段階ではこのメリットを活かすことができません。
この問題を解決するために、Cloud ProfilesとBaseline Profilesを使います。
Cloud ProfilesとBaseline Profiles
GoogleがPlayストアに存在するすべてのアプリについて、その使用パターンデータを収集しており、アプリのどの部分が多くのユーザーによって頻繁に実行されているかという情報を持っています。
アプリをインストールすると、APKと一緒にCode Profileもダウンロードされ、それをもとにダウンロード時によく使用される部分をバイトコードから変換することで、アプリケーションの最初の実行から、高いパフォーマンスを発揮できるようになりました。
ただ、Cloud Profilesにも課題があり、それはアプリのアップデートが毎週あるようなアプリの場合は、データを取得する前にアップデートされるため、Cloud Profilesのメリットを活かすことができません。
これを解決するために、Baseline Profilesを使用して、起動時間の改善をすることができます。
Baseline Profilesを使用することで、Cloud Profilesで収集できていないプロファイルをローカルで作成することができるので、それをAPKとしてPlayストアにアップロードすることで、アップデートが頻繁に繰り返されるようなアプリの場合でも、初回から起動時間の短縮が期待できるようになりました。
実際にBaseline Profilesを使用することで、起動時間の改善が見られたそうです。
詳しくは以下を参照してください。
参考
Discussion