本書について

『Androidを支える技術〈Ⅱ〉─⁠─真のマルチタスクに挑んだモバイルOSの心臓部』
(2017年3月、技術評論社)より転載

本書は、Androidの内部を解説する本です。とりわけ「Activity」という概念を実現するための仕組みを中心とした巻になります。

モバイルにおいてマルチタスク(multitasking)でたくさんのアプリが連携し、裏でもいろいろなプログラムが動き続けるシステムを作るのは一筋縄では行きません。Androidは、モバイルのシステムでもトップクラスに多くのアプリが同時に動くことのできるシステムですが、スワップもなくユーザーに専門的な管理を期待できないスマホにおいて、たくさんのアプリが動きながら日常的に使い続けられるシステムを実現するのは容易なことではありません。

本書では、メモリなどが限られたスマホにおいて、Androidがどのように安定して動き続けるシステムを実現するのかを解説していきます。特に「Activityとその再生成」は核となるテーマです。

Androidと名の付いた本のほとんどがアプリを書く時の話を扱うのに対し、本書は書かれたアプリがどのようにして動くのか、そのAndroid側の解説を行った本である点に特徴があります。本書は、読者がアプリ開発に関しては既に知っているという前提で、普段使っているクラスライブラリなどの中身がAndroidの内部でどのように動いているのかを、Linuxのカーネルのレベルから普段使っているアプリのAPIまですべて解説することを目的にしています。

問題に関わるすべてのレイヤを説明する ……Linuxカーネルからクラスライブラリまで

Android自身について書かれた本はそれ自体が極めて少ないのが現状ですが、その数少ないAndroid自身の本もどれも低レベルな所だけの解説に終わっています。init周辺やプロセスの解説などは豊富にありますが、肝心のアプリそのものについてと、その周辺の話題であるActivityやGUIといった部分の解説が皆無です。

どれもそのような本になってしまうのには理由があります。いまやAndroidについてすべてを解説するのは不可能なくらい、Androidは大きなシステムとなりました(下表を参照⁠⁠。

 Androidのコードサイズ
年月行数
2008年11月287万
2016年12月1243万

Androidがここ数年でどれだけ大きくなってきたかを行数で比較する。Androidはさまざまなオープンソースのソフトウェアを含んだ巨大なシステムで、どこまでを行数とカウントするか、どのファイルは行数とカウントするかで大きく数字はぶれるが、同じ計測方法で複数の年を比較すると、どれだけ成長しているのかは知ることができる。以上の数字では大体8年で4倍以上に膨れ上がっていることがわかる。

このようなAndroidについて各レイヤを解説していこうと思うと、1つ2つのレイヤについて解説しただけで本1冊分の内容となってしまうのです。上から下まですべてのレイヤを、万遍なく解説するのは不可能と言えます。

しかし、レイヤを上から下までつなぐ所にAndroidのおもしろさが多く含まれています。各レイヤの途中で力尽きてしまうと、Androidのおもしろさは伝わりません。

そこで本書は、各レイヤのすべてを解説するということはしません。それよりもある一つの問題について、一番上のレイヤから一番下のレイヤまで、その問題に関連する部分だけを解説するという手法を取っています。

各章で扱う内容は基本的には独立して書いていて、扱うモジュールに関して基本的には総合的な説明を行っているつもりです。各モジュールで、Activityとは関係ない事項についてもしっかり扱っています。しかしながら、話題の取捨選択の基準に「Activityのライフサイクルの理解に必要かどうか」は強く影響を与えています。Activityのライフサイクルの理解に必要なものは少し細かい所まで扱う反面、Activityのライフサイクルにあまり関係がない上に重要ではないと思った部分はカットしたトピックもいくつかあります。

本書では、一番下のレイヤとしてLinuxカーネルを想定しています。と言うのは、本書で話題とするメモリ管理やプロセスについては、Linuxカーネルより下に関しては通常のLinuxがほぼそのまま使われているので、本書で改めて解説する必要はないと考えるからです。通常のLinuxについてのハードウェアからLinuxカーネルまでに関しては、本書以外に既に十分に情報があります。

本書で扱っている中心的なテーマは「Activity」です。Activityはさまざまなシステムサービスやデーモン、そしてLinuxカーネルの仕組みを総動員して実現されています。そこで、本書でもLinuxカーネルの必要な機能やシステムサービスの仕組みについても見ていきます。

本書を読んで得られるもの

本書の内容は、Hello Worldアプリを書く時には必要ありません。もう少し凝ったアプリを作る時にも必要ないでしょう。それでは本書を読むと、どのようなメリットがあるのでしょうか。

Activityのライフサイクルに関する深い理解 ……Androidのアプリの背後にある哲学を理解するために

Androidでのアプリ開発の最初の壁と言えば、Activityのライフサイクルでしょう。ちょっと触った時には動くのに、いろいろ使い込んでいると落ちたり、別のアプリに移って作業をした後に戻ってきたら入力途中のデータが消えてしまっていたり、といったようなさまざまなことが起きます。

個々の問題に対しては見よう見真似でコールバックを実装しておけば対応できるかもしれませんが、そうした問題に都度アドホックに対処していくのはコストもかかり、最終的にできるものが当初作ろうとしていたような使い心地にはできないことも多々あります。

本書はActivityのライフサイクルの実装側で使われているLinuxのOOM KillerやActivityManagerServiceなどを詳細に見ていく過程で、⁠Activityのライフサイクルとはそもそもどのような哲学で作られたものなのか」⁠Activityとは何か」といった根源的な問いを解き明かしていきます。

そうしたことをすべて理解した上で、Activityという仕組みの上にアプリを作ると、そもそもどのようなデザインでなくてはいけないのか、逆にどのようなデザインのものはActivity上ではうまく動かせないのかをあらかじめ理解することができるようになります。すると、ある要求があった時に、それをAndroidの哲学に沿ったデザインで解決するにはどのようにすれば良いかを考えることができるようになります。

Androidの哲学に沿ったデザインにできれば、開発は容易になりトラブルも少なく、何より使いやすいアプリとなります。最初の段階でAndroidの哲学を理解している人間がデザインに関わるかどうかは、Androidのアプリの出来を左右する重要な要素となります。

Activityのライフサイクルを深く理解することは、このAndroidの哲学を理解するための極めて重要な中心的なテーマと言えます。

アプリのインストールに関する詳細の把握

アプリのインストールはいろいろな事象が背後に動き、ドキュメントなどから何が起きているのかを理解するのは困難です。また、複数のapkで何かを行ったり、少し特殊なことを行ったりしたい時がたびたび発生する場所なのですが、どのようなことはできて、どのようなことはできないかというアタリをつけるのも内部の理解がないと難しいところです。

本書ではアプリのインストールについて詳細な解説を行っていて、Linuxのユーザーやファイルシステム、プロセスといったレベルで全体を理解できるようになっています。

こうした観点で理解しておくと、Androidであるアプリが他のアプリのデータを盗み見る、通信の内容を盗み見るといったことが、どの程度できないようになっているかについてサーバーやデスクトップの知識を活用しながら考えられるようになります。

そして、sharedUserIdなどの少し特殊なapkを作らなくてはならない時などに、自分が一体何を行っているのか、セキュリティ的にはどういったリスクがあるのかなどを考えられるようになります。

また、カスタマイズされた独自Androidデバイスのプレインストールアプリを作るといった少し特殊なシチュエーションの時に、Linuxのシステム開発の知識とAndroidのアプリの知識をつなげて、ずっと多くのことができるようになります。

インストール周辺のトラブルシューティングもLinuxのレベルで行えるようになり、何だかわからないがアンインストールできなくなった、インストールできなくなったといったトラブルも手動で自ら解決できるようになります。

アプリの起動時に何が起こるのか ……5.7節「アプリの起動をすべての要素を元に見ていく」について

本書で最も重要なのは、5.7節の「アプリの起動をすべての要素を元に見ていく」部分です。むしろ、この5.7節を理解するのに必要なことを説明していくために、第5章までの構成は考えられています。

第5章まで読むと、アプリが起動する時に何が起こるのかについては、完全に理解できるようになるでしょう。アプリの起動の部分にはAndroidの多くの重要な要素が結集しています。ここをしっかり理解したあかつきには、Androidというもの自体の理解度が遥かに深くなることは間違いありません。

このアプリ起動時に何が起こるのかをすべて理解していると、Activityとそのライフサイクルがどうして現在のような形をしているのかについて、外堀をすべて理解したことになります。Androidの全体像の理解も、大分違ったものとなるでしょう。

組み込みシステムとしてのAndroidを知る ……メモリに限りがあることを前提にしたシステム

一見すると、Androidは高度に洗練されたGUIシステムを持ち、たくさんの極めて高機能で複雑なアプリを後からダウンロードしてインストールし、それぞれのアプリが同時に動いたりして、組み込みシステムのようにはまったく見えず、デスクトップなどのシステムと同じようなものに見えるかもしれません。IDEでポチポチと開発するだけで何か動くものができて、Androidが実際にはどういった端末で動いているかなんて大して気にしなくて良いように見えるかもしれません。

しかし、Androidは「メモリに限りがある」ことを前提に作られたシステムです。しかもこの前提は、Androidの至るところのデザインにも影響を与えています。低レベルの部分から来た要求を踏まえた上でUIやActivity周辺を眺めれば、むしろ従来の組み込みシステムとの共通点が多くあることに気付きます。

従来の組み込みシステムは経験豊富だが最近のスマホにはさっぱりついていけないと言う日本には比較的多くいるであろうシニアの開発者にとっては、本書の内容はスマホとガラケーの間の溝を埋めて、スマホの世界が自分のわかる世界だ、と感じられるような詳細な情報を提供できていると思います。また、組み込みの知識があまりない一方でPCやAndroidに詳しい開発者は、本書を通しAndroidを組み込みシステムとして見直すことで、より深くAndroidを理解できるようになるでしょう。


第Ⅰ巻同様、本書も相当読み応えのある1冊になっています。しかし、何とか5.7節まで読み進めることができれば、ある種の達成感と感動を味わえる解説になっていると自負しています。5.7節の内容はAndroidのソース読みにおける一つのハイライトですから。

この感動を一人でも多くの読者の方々と共有できることを願っています。

2017年2月 有野 和真

有野和真(ありのかずま)

新卒でガラケー向けのブラウザ会社に入り組み込み業界で働いた後,2005年にマイクロソフトディベロップメントに移り.NETのサーバーサイド分野であるSharePointの開発に従事。2009年からフリーランスになり,機械学習関連のプロジェクトやスパコンの独自GPGPU開発に携わる傍ら,Androidのお絵描きアプリ「LayerPaint」を共同開発。