@numa08 猫耳帽子の女の子

明日目が覚めたら俺達の業界が夢のような世界になっているとイイナ。

Androidを支える技術II を読んだ

組み込みOSでありつつもセキュリティアップデートやユーザがインストールするアプリケーションに対応しそれらをマルチタスクで実行し、さらにユーザのリテラシーはサーバーやPCと比べても低いであると想像される。それが、Androidに求められた要件。これを、一般的なPCやサーバーと比較して貧弱な携帯電話上に構築する必要があった。

自分が初めてAndroidのアプリ作りを経験したのは、2009年か2010年のことだったと思う。初めて本を買ってきて4つのコンポーネントを学び、コードを意味もわからず写経していたとき、なぜ画面単位をActivityと言うもので管理するのだろうか?と考えていた。それ以前にGUIのプログラミンををやったことがあるわけでもなかったので、「きっと頭の良い人が考えれば理解ができる点なんだろうな」と思って後回しにしていた。それから10年近く経った今の今まで深くその理由を考えることなく進んできた。

本書はActivityが生成されて画面に出るまで、そしてどういった条件下でActivityが破棄されるのかのプロセスをLinuxのレイヤーから順番に追いかける構成になっている。アプリのインストールが行われたらPackageManagerServiceがpackage.xmlを更新してIntentを解決できるようにし、端末がブートしたときに関連するサービス群を起動し、Activityをスタックで管理する仕組みの中にユーザが起動したActivityを含めていく・・・という流れになると言える。

更に、再生成におけるデータの保持を実現するためのBundleの仕組みについての解説もある。どうやってActivityのもつデータを一時的に保持しておくのか、再生成のときだけ復元するのかの仕組みをコードとともに紹介している。実は自分はBandleは一度ファイルI/Oが発生するものだと思っていたけど、そう言う訳ではないらしい。こう言った誤った知識が正しく訂正されるきっかけとなるのも嬉しい。

Androidソースコードに注目をした本は他にもあったと思うが、やはりこの本が別なのはLinux的部分ではなくてAndroid的な部分に重点を置いていること、そして話題とする部分を絞って解説してくれることで、注目するべきソースコードが何のかがわかりやすくなる構成にあると思う。この本で言えばActivityの起動に関するプロセスについてのみの話題で1冊が構成されている。手広くなって読者目線で何が起こっているのかわからなくなってしまう、ということが無いのだ。

Androidのアプリを開発する中で、Zygoteというプロセスを見かけることはよくある。スタックトレースを辿っていくと最後の方に現れるやつだ。あれが一体何なのかは雰囲気的にランループを作るところなのかな?くらいの認識だったけれど、その実態はアプリケーションの起動を司るめちゃくちゃ重要なシステムサービスの1つだ。今まで単語が出てきても深くは考えずスルーしていた部分についてしっかりと理解をすることで、今後のバク調査やアプリ開発でも役立つかもしれない。

この本を読んで学んだことの1つに、1つのアプリケーションは1つのプロセスになるとは限らないと言えることだと思う。Androidアプリのパターンの1つにApplicationクラスの参照ツリーの中にデータを持たせて、アプリの中からSingletonのように利用するパターンが有るように思う。しかし、Applicationクラスはプロセスに対して一意ではあるが、外部から起動なActivityやServiceの提供をしている場合などにアプリのプロセスが2つ以上になることはあるようだ。そうなると、アプリの中でSingletonだと思っていたデータは実はプロセスの中でのSingletonであるという点が問題になってくるケースがあるかもしれない。良い具体例は思いつかないけれど。

誰もが使うパターンだからと言って、そのまま心を無にして利用することの危険さを思い出した。

今一度自分の知識をおさらいして、間違えた理解がないのか、間違った考え方をしていないのかを確認する意味でもこの本は非常に有用だ。そして、それ以上に普段は意識することのないアプリよりも下のレイヤーに対する詳細な解説があるおかげで、やってはいけないパターンに思いを馳せたり、パフォーマンスを高める工夫を発見したり、バグが発生したときの効率の良い調査を実現できるだろう。

少なくとも、Androidアプリ開発を現役でバリバリ行う人には必読書であると感じている。