hydrakecat’s blog

Walking like a cat

『Androidを支える技術』を読むべきか?

ソフトウェア・エンジニアを長くやっていると、自然と得意分野というものが出来る。 自分だったら、Androidアプリ開発Javaの仕様についてはそれなりに知っているつもりだけれど、LinuxカーネルGPUについて詳しいとはお世辞にも言えない。

得意分野というと聞こえはよいけれど、それは裏を返すと、他のことを学ぶのに及び腰になるということだ。さっきの例でいえば、LinuxカーネルについてもGPUについても知っておくにこしたことはない。それでも、「興味はあるけれど、いますぐに必要じゃないからいいか」という気分になって後回しにしてしまう。

この記事で紹介する『Androidを支える技術』はそういう知っておくにこしたことはないことを解説している。

Androidを支える技術』とは

Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム (WEB+DB PRESS plus)

Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム (WEB+DB PRESS plus)

この本が扱っている内容は、Android OSの裏側だ。しかも、ただの裏側ではない。アプリの動きがどうしてこうなるのか、ということを表から突きつめていくと辿り着く裏側だ。自分たちの馴染みがあるAndroidフレームワークAPIを呼んだときに裏側で何が行われるかが綿密に解説されている。 それはとても刺激的で、最後にさまざまなピースがはまっていく過程は推理小説の解説編のようにスリリングですらある。

でも、みんながみんな裏側を知る必要はない。裏側を知らなくても、Android Developersのドキュメントをきちんと読めば、誰でもアプリを実装できる。自分は面白かったけれど、みんなが面白がれるかどうかは分からない。

読み終わった直後に自分が抱いた感想はそういうものだった。せっかく献本を頂いたのに、どう記事に書いたらよいか悩んだのもこの点だ。自分にとっては面白くて、一気に読んでしまった。でも単に面白い読み物としてだけで、この本を勧めてよいのだろうか?

その後、『Androidを支える技術出版記念』というイベントで著者の有野さんの話を聞く機会を得た。さらに、時間を経て、自分の考えは変わっていった。

本書は、Androidアプリ開発をする人にとって必読だ、と。「読むべきか?」と聞かれたら「読むべき」と答える。これくらいは知っておいた方がよい、と。それをいまから説明したい。

本書が扱っている内容

この本は2巻に分かれている。1巻はサブタイトルからも分かるように、アプリの画面がどうレンダリングされるか、という話だ。有野さんの言葉を借りれば「GUIのパイプラインの話」だ。

なにがすごいって、ちょっとアプリ開発をした人なら馴染みがあるViewツリーの話だけでなく、UIスレッドを実現するためのLooperや、タッチイベントの入力を扱うインプットデバイスドライバがどういう形で提供されているか、といったことがLinuxのレベルから解説されていることだ。さらに、HWCの話に触れつつ、DisplayListをSurfaceFlingerが処理していく過程を解き明かしてみせている。

考えたら当たり前なのだけれど、GUIというのは、Viewツリーを作って終わりではない。それはレンダリングされ描画される必要があるし、イベントは何かの形で検知されて僕らのアプリコードまで到達する。

でも、ふだんSDKAPIを利用するだけの立場からすると、そこはうまくやっているんだろう、くらいの感覚になる。measureとlayoutがあるのくらいは知っているし、カスタムViewを作るときは気をつけるけれど、せいぜいそれくらいだ。つまりViewツリーくらいまでしか気にしないのだ。

一方、2巻はActivityのライフサイクルについて扱っている。こちらもOOM Killerの話に始まって、どのようにAndroid OSがプロセスの優先度を付けているのか、shrink_slab()をどう利用しているのかというLinuxレベルの話が続く。知識としてバックグラウンドのアクティビティがonDestroy()も呼ばれずに殺されるのは知っていても、それがどう実装されているかまでは知らないアプリ開発者が大半だろう。

2冊を通じて感じるのは、分野横断的ということだ。Linuxカーネルからハードウェアの処理まで、必要になるものはその都度解説され、全体のなかに位置付けられる。そして、最後にそれらがどう綿密に連携しているか描いてみせる。

これはすごいことだ。必要になるものだけ過不足なく解説して全体の流れにうまくのせなければならないのだ。執筆にあっては、かなり細部まで構成を苦慮されたのではないかと思う。

しかし、これは同時に必要なことだったのだろう。Androidは、モバイル端末というスペックが限定されたデバイスで、60fpsや画面遷移を達成するために、OS、フレームワーク、ハードウェアが密接に繋がっている。だから、一部だけを見ても理解できないことが、全体を見ることでようやく理解できるようになる。本書を読んで、ようやくその凄さの一端が分かった気がする。

なぜ読むべきなのか

では、Androidアプリ開発をしている人は、この本を読むべきなのだろうか?

自分が本書を読んで、自分自身でちょっと変わったなと思うことがある。それは、妙な安心感というか自信を持てるようになったという点だ。

たとえば、端末側のなんらかの入力がアプリまで届かなかったとする。自分のアプリコードがおかしいのか、Android OSがおかしいのか、はたまた端末がおかしいのか。そういうときに、いざとなればコードや設定を追える、という自信だ。実際にやってみたら、そううまくはいかないかもしれない。でも手掛かりはすでに知っているのだから、なんとかなるだろう、という気分になる。

あるいは、SDKの奇妙な振舞いを発見したときに、ソースのどこを読めば確認できるかという見当が付けられる。AndroidフレームワークのコードはCとJavaのコードを行ったり来たりして、追うのが大変だったりする。そういうときに当たりを付けられるというのは、とても大事なことだ。

アプリ開発者は自問してほしい。クラッシュや特定の端末の不具合などに出会ったときに、どこかで諦めるポイントがないだろうか?Zygoteという文字列を見たら、なんとなく自分の知らないことだ、と思ってしまったりしていないだろうか。

本書を読むと、そういったものも、追っていけば分かるだろう、という気分になれる。気のせいかもしれないけれど、そういった手掛かりや見当というものが、エンジニアリングではとても重要なのではないだろうか。すくなくとも諦める前に一踏ん張りする気にさせるのではないだろうか。

だから、Androidアプリ開発をしている人で本書に興味を持った人は、ぜひ読んでみてほしい。よく分からなかったり、すべてを把握するのが大変だったとしても、あとできっと役に立つ場面が来るに違いない。そのときに読み直して理解すればよい。

本書について「読むべきか?」と聞かれたら、僕は「読むべき」と答えるだろう。「読むべきか?」と質問する時点できっと役に立つと思うからだ。

そして、なにより、冒頭でも書いたが、お話として読むだけでも面白いのだ。それは保証する。

分野をまたがるということ

蛇足ながらもう1つ。『Androidを支える技術出版記念』イベントに参加して、思ったことがあった。著者の有野さんは、このような広汎な知識をどう身に付けたか、ということだ。そして、そのどれも理解の深さが余人よりも一段深い印象を受ける。

これは、推測に過ぎないのだけれど、自分の得意分野を限定することなく、貪欲に学んできたのではないだろうか。これはちょっと万人が真似できることではない。自分の経験を築いた分野ならともかく、そうでない分野をいまから勉強してその道のプロと同等になれるのだろうかと怯んでしまう。

それでも、多くの分野に精通することで初めて理解できるものがある、ということは実感した。Androidを理解することは、その1つだ。そして、それ故に、本書は有野さんをおいて他に書ける人はいなかったであろう、ということも。

最後に宣伝

ところで、この『Androidを支える技術出版記念』イベントのレポートを今月の『WEB+DB PRESS Vol.100』に寄稿させていただいた。ご興味のある方はぜひお手にとっていただければ幸いである。

WEB+DB PRESS Vol.100

WEB+DB PRESS Vol.100