Androidを支える技術〈Ⅰ〉──60fpsを達成するモダンなGUIシステム
本書について
本書は,Androidの内部を解説する本です。とりわけGUIシステム(Graphical User Interface system)を中心とした巻になります。特に,グラフィックスと引っ掛からないアニメーションの実現に関わる部分に半分以上の紙面を割いています。
Androidと名の付いた本のほとんどがアプリを書くための本であるのに対し,本書はその内部がどうなっているかを解説しているAndroid自身について書かれた本である点に特徴があります。アプリを書く時に必要な事項は読者が既に知っているという前提で,それを実現するためにAndroidの内部がどうなっているのかをハードウェアから通常のアプリのコードまで,その間に横たわるすべてを解説することを目的としています。
問題に関わるすべてのレイヤを説明する ハードウェアからクラスライブラリまで
Android自身について書かれた本というのはそれ自体が極めて少ないのが現状ですが,その数少ないAndroid自身の本もどれも低レベルな所だけの解説に終わっています。init周辺やプロセスの解説などは豊富にありますが,肝心のGUI周辺の話が皆無です。
どれもそのような本になってしまうのには理由があります。いまやAndroidについてすべてを解説するのは不可能なくらい,Androidは大きなシステムとなりました(下表参照)。
表 Androidのコードサイズ
年月 | 行数 |
---|---|
2008年11月 | 287万 |
2016年12月 | 1243万 |
Androidがここ数年でどれだけ大きくなってきたかを行数で比較する。Androidはさまざまなオープンソースのソフトウェアを含んだ巨大なシステムで,どこまでを行数とカウントするか,どのファイルは行数とカウントするかで大きく数字はぶれるが,同じ計測方法で複数の年を比較すると,どれだけ成長しているのかは知ることができる。以上の数字では大体8年で4倍以上に膨れ上がっていることがわかる。
このようなAndroidについて各レイヤを解説していこうと思うと,1つ2つのレイヤについて解説しただけで本1冊分の内容となってしまうのです。上から下まですべてのレイヤを,万遍なく解説するのは不可能と言えます。
しかし,レイヤを上から下までつなぐ所にAndroidのおもしろさが多く含まれています。各レイヤの途中で力尽きてしまうと,Androidのおもしろさは伝わりません。
そこで本書は,各レイヤのすべてを解説するということはしません。それよりもある一つの問題について,一番上のレイヤから一番下のレイヤまで,その問題に関連する部分だけを解説するという手法を取っています。デバイスドライバやHAL(Hardware Abstract Layer)から始まり,ViewRootImplやCanvasのdraw関連メソッドといった通常のアプリ開発者が触れる所まですべての構造を解説してあります。
本書で扱っている問題は,GUIシステムです。特にViewを中心としたGUIプログラミング,とりわけ「引っ掛からないアニメーション」を中心的課題に設定し,それに付随してイベントやUIスレッドなどのGUIプログラミングの話題も扱っています。
難しいテーマと解説の方針 できる限りの平易さ
本書は扱うテーマについて一切の妥協をしていません。どれだけ難しくても,必要だと思うことについてはすべて正面からしっかりと扱う方針で書きました。結果として,本書はかなり難しい本になっています。
しかしながら,同じレベルの内容を扱う類書に比べると,本書は極めて平易に詳しく解説が書かれています。少し見てもらえばわかるように図解も極めて豊富に用意しました。うまく図解するのが難しいようなことでも,それが理解を助ける人もいるだろうと思ったらなるべく図解を試みました。本書のレベルの内容にしては,これだけ図解があるのは大変珍しいと思います。
一方で,やはり本書はそれなりの前提条件を満たした技術者でないとしっかりとは理解できないというのも間違いありません。そうした本来の読者の邪魔になる解説をたくさん付けて,本来なら最後まで読むだけの実力があったのに挫折させてしまっては本末転倒です。
そこで本書の方針としては,本書の対象読者として標準的なレベルの技術者が邪魔と感じないぎりぎりの所まで基礎的な解説を足すという考えで書きました。冗長には感じても理解を妨げるほどではないと思う範囲で,できるだけ基礎的な解説を行うというのが本書の方針です。
Android 7.0 Nougatのバイトコード実行環境の解説
本書の中心的な話題である「60fps(60 frames per second,秒間60フレーム)を実現するためのGUIシステム」について語るためには,バイトコード実行環境についてもかなり突っ込んだ解説が必要になります。
本書の執筆を開始した時はまだLollipopで,それを前提にバイトコード実行環境の解説を書いていたのですが,執筆途中で登場したAndroid 7.0 Nougatでまさかのバイトコード実行環境の大変更が入り,バイトコード実行環境についてはほぼすべてを書き直すことになりました。Nougatのバイトコード実行環境は素晴らしく,業界でも類を見ない最先端の洗練されたものとなっています。
そのようなタイミング的な幸運に恵まれたので,本書は恐らくNougatのバイトコード実行環境について本格的に書かれた世界で最初の本だと思います。世界のすべての本を読んでいるわけではないのでひょっとしたら筆者以外にもこれについて解説を書いている人がいるかもしれませんが,いずれにせよタイミング的なことを考えればかなり希少なのは間違いありません。本書でどれほど詳しい説明を行っているかについては,目次を見ると大まかに把握できるでしょう。
本書を読んで得られるもの
本書の内容は,Hello Worldアプリを書く時には必要ありません。もう少し凝ったアプリを作る時にも必要ないでしょう。それでは本書を読むと,どのようなメリットがあるのでしょうか。
複雑で高いパフォーマンスの必要なViewが作れるようになる
本章の内容が必要になるのはそのさらに先,Androidの中まで良く理解していないと達成できないパフォーマンスが必要になるアプリを作る時に必要になります。たとえば「高いフレームレートを維持して複雑なレイアウトをこなす」「自分のアプリの問題領域にあったViewGroupを作成しなくてはいけない」といったレベルの問題に挑む時に,本書の内容は必要になります。
View関連の込み入ったトラブルシュートができるようになる
また,View関連の少しググっても答えが出てこないような自分の書いたコードに特有の込み入ったトラブルに遭遇した時に,自分でソースコードを調べて解決しようとするなら本書の内容は役に立つと思います。Androidのソースコードはプロセス境界と言語境界を頻繁にまたぐため,ただ順番にコードを読んで行くだけだとなかなか全体像が掴みづらくなっています。ですが本書の内容を理解しておけば,Viewの周辺や描画の周辺,そしてイベント回りで発生するどのようなトラブルでも,どこを追うべきかすべてがわかり,手早く必要なコードに辿り着いて問題を解決できるようになるはずです。
「Androidの今」を理解できる
Androidの重要な特徴として「リッチなGUIシステムを持つ」点が挙げられます。実際それ以前の組み込みLinuxの上に載せるGUIシステムと比べると,GPU(Graphics Processing Unit)の使い方やIDE(Integrated Development Environment)との統合など,今や他とは一段レベルの違う完成度となっています。
Androidがどのくらい洗練されているのかを考えるには,アプリ開発者に見えるレイヤだけ見てもよくわかりません。と言うのは,過去の互換性をある程度維持した範囲でシステムは発展を続けているからです。
現在のAndroidを理解するには,その下を見ていかなければなりません。
GUIシステムとバイトコード実行環境周辺は,最近のAndroidの主要な部分です。本書の内容は,まさに現在のAndroidとはどれだけ洗練されたシステムかを解説する内容となっています。
なぜスマホ(smartphone)市場は実質iPhoneとAndroidの2つだけになってしまったのか,その他の携帯電話のシステムはどうしてまったく見なくなってしまったのかということを知りたい業界関係者にとっては,本書の内容は示唆に富むものになっているでしょう。
Androidに限らずGUIシステムの解説は数あれど,本書ほど詳細にGUIシステムが解説されることは滅多にありません。と言うのも,本書のレベルの解説を行うためにはソースが公開されている必要があるからです。しかも,そのソースコードが公開されたGUIシステムのうち,業界でもホットな分野であるモバイルの業界最先端のものの一つがAndroidのGUIシステムなのですから,これを調べてみる価値は十分にあるに違いありません。筆者がAndroidのGUIシステムのソースコードの探求で多くのことを学んだように,きっと読者の皆さんも本書から多くの発見が得られると思います。
2017年1月 有野 和真