Happy My Life

日常とか技術とか

Androidアプリ開発者のためのAndroidソースコードリーディング入門(3) Framework編

ちょっと間が開いたが、これまた続き。

前回はインストールされた標準的なアプリケーションのソースコードについていろいろ書いてみた。

で、まだ見るべきソースコードがあると書いたが、今回はAndroid Frameworkのソースコードを見ていく。アプリケーション開発をしている時にいつも見ているリファレンスマニュアルの元となっているソースコードなのだ。

この読み方を知っていると「このメソッド、マニュアル通りに設定しているのに、なんでその通り動かんのじゃ、うがー」というムダなイライラとオサラバできるというメリットがある。

まあ、オープンソースではないプラットフォームでは、このような時は試行錯誤することでようやく解決なんて事もあったりするが、Androidフレームワークのソースが読めるというメリットのおかげで、こういったムダなイライラをあまりしなくて済ませる事ができる。

Android Frameworkのソースを読んでみる

Android Frameworkまわりのソースコードは、frameworks/baseフォルダ以下にある。そこにはOpenGLなど様々なライブラリのソースが格納されているが、よく使うTextViewなど基本的なクラスは、framework/base/coreフォルダの中にある。たぶん、こっちのframework/base/coreフォルダ以下のソースコードの方が読む価値があるのではないかと思う。

フォルダの構成の一覧を表示しようかと思ったが、あまりに分量が多いので掲載するのは止めておく。その代わりにTreeコマンドで出力したものPDF化してみた(591 directories, 4167 filesだそうで)

JNIフォルダも

Android Frameworkのソースコードには、JNIフォルダも登場する。JNIというのは、JavaとCをつなぐ仕組みの事。

よく考えてみたらあたり前の話で、ハードの制御はJavaのみでできる訳が無い。どこかでLinuxカーネルシステムコールや、IOを制御する必要ある。そして、それをJavaで操作できるよう変換する必要がある。で、それらを担っているのがJNI

特にセンサー、カメラなどのハードウェアに密着しているライブラリは、JNIの依存度はかなり高い。JNIフォルダのなかは、もちろんCやC++なコード。まあ、C++なコードだったとしてもSTLなども登場しないので、それなりに読みやすいはず(STLが登場しないのは、JNI的な制約によるもの)

たまにはソースコードリーディングを

よく利用するクラスのソースコードを読んでみると意外な発見などがあったりする。「こんなメソッドがあったのか」、「あのメソッドと、このメソッドはこんな関係だったのか」など。

以前であれば、これらの情報はリファレンスマニュアルを一通り読む事で得ていたのだが、それがソースコードとなれば、それらのメソッドの中身が一段とよくわかる。1行で書かれているメソッドもあればあれば、何十行となっているものまで様々。適当に拾い読みしていくと「このCメソッドは、AメソッドとBメソッドを組み合わせたものだったのか」なんて、リファレンスに書かれてない事まで一目で分かってくる。文章じゃなくてコードの行数で判断できるんだから。

まあ、全部のソースコードを一気に目を通すのもシンドいので、まずは自分がよく利用するクラスから見ていくといいかもしれない。一度お試しあれ。

機会があれば、具体的に何かのクラスを取り上げて解説してみるのもいいかもしれない。