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

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

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

『Androidを支える技術』

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

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

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

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

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

本書が扱っている内容

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

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

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

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

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

さらに4章ではActivityManagerServiceが具体的になにをやっているか、という話をしているのだが、このあたりはアプリ開発をしているときにも大変お世話になるので、把握しておくと良いだろう。SDKのコードが格段に読みやすくなるはずだ。

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

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

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

なぜ読むべきなのか

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

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

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

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

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

自分は、どこかでフレームワークのコードより低いところは、よく知らないことと思って敬遠していた。苦手意識があったといってもよい。

でも、本書を読んでからは、順に理解していけばなんとかなるんじゃないかと思い始めている。

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

すくなくとも、お話として読むだけでも面白いのだ。それは保証する。

知っておいた方がよいことを勉強すること

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

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

それでも、分かることは、多くの分野に精通することで初めて理解できるものもあるということだ。Androidを理解することも、その1つなのだろう。

最後に宣伝

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