2017年04月16日

「Androidを支える技術T」を読んで その3

 Androidを支える技術〈T〉を読んで その3です。

3.進化し続けるバイトコード実行環境

 これは、「5.バイトコード実行環境」の部分です。

 私が初めてJAVAを知ったのは、前世紀です(^_^;)が、あれから、MSが本家よりも速く動作するJITを開発し、JVMがぐんぐん進化し、docomoのiアプリが徐々に早く動作するようになって、やがてandroidの時代が来ました。

 androidのバイトコード実行環境は、日々進歩しています。

 この本によれば、スマホでバイトコードを実行するためには、 @「厳しいリアルタイム性の要求」 A「少ないメモリ」だそうです。その2点に対する驚異の対策が、以下のように、androidのバイトコード実行環境には施されています。

 以下、androidのバージョンの移り変わりによって様々な対策が施されています。

 まず、JITが初めて入ってきた2.1~4.4の頃は…

 JITはバイトコードを読んで実行バイナリーをメモリ上に生成し、以後はその実行バイナリをCPUに実行する仕組み

 最終的にはほとんどフルアセンブルで書かれていて、相当にチューンされたVM

となっておりました。

 そして5.0からはご存知のARTの登場です。

 ARTはAndroid RunTimeの略で、アプリのインストール時にコンパイルが行われ、実行時には実行バイナリがそのまま実行されるというシステム

 JITと違い実行時にはコンパイルされず、一度コンパイルしたものを何度も使い回せるので、バッテリーに優しく、実行時にたまにコンパイルが走って遅くなることもない

 ということで、私もARTのことを聞いた時はこれで決まりだなぁ、当分これ以上のものは出てこないだろうと思っておりました。

 しかーし、いつ頃からでしょうか、やたらシステムのバージョンアップが多くなって、その度にスマホは再起動し、すべてのアプリがその都度最適化されるようになりまして、これって面倒だなぁと思っておりました。そのあたりの事情は以下のように書いてあります。

 androidのシェアが増えるに従い、セキュリティ的なアタックを受ける機会も増えて、セキュリティ修正をもっと頻繁に行いたくなった

 セキュリティアップデートの都度、全アプリの再コンパイルが走りかなりの時間がかかります。これは数十分とかのオーダーです。(中略) 2~3カ月に1回、さらには毎月更新といったことを行おうとすると、かなりの問題となります。

 システムアップデート以外の単体のアップデートも、(中略) アプリが大量にインストールされている端末だと、毎日なにかしらのアップデートは降ってくる。アプリのアップデートの都度コンパイルが走ってしまうのですが、このコンパイルが走っている間はスマホのパフォーマンスはかなり低下します。

…そうです。

 そこで、7.0の時代になります。7.0は一言で言うと

 アップデートやインストールの時には余計な事を行わず、けれど重要なところだけはあらかじめコンパイルするというシステムを目指したもの

となります。結果として、

 すべてをコンパイルしていたのが、7.0からは一部をJIT実行するように先祖返りしています。

 アプリ実行時だけ速ければコンパイルに時間をかけてもよいというわけではないというのが現在の結論

となり、さらに、

 アプリの実行時にはイメージファイルの採用により起動を高速化

 よく使うアプリのよく使うメソッドなどは、電源充電中でアイドル中の時にこっそりとprofile guidedコンパイルを行うことで、(中略) プロファイル情報を用いるため、あまり重要でないコードをコンパイルして時間やストレージを無駄にしてしまう問題を解決

するなどさらなる改善が施されています。

 先日、JAVA8に対応するためのJackコンパイラが非推奨になったというニュースがありましたが、これからのandroidのバイトコード実行環境がさらに進化していくことは間違いないようです。

 これからも、androidに大変期待が持てます(^^)/

 最後になりましたが、このような素晴らしい解説本を出して頂いた作者に感謝、感謝ですm(__)m
posted by 【なかま】 at 20:00 | Comment(0) | android