この記事はAndroid Advent Calendar 2014の14日目です。
Androidアプリケーション開発をiOSのそれと比べると、SDKのソースコードが公開されていることがアドバンテージの一つになると思います。自分は半年ほど前から、開発時に時々SDKのソースコードを参照するようになり、それからSDKへの理解が深まって、開発効率が高まったと感じています。
この記事では、自分がSDKのソースコードを読む際に使っている方法をまとめます。たぶんよく知られている方法ばかりです。
1. ブラウザで見る
GrepCode
特定のクラス名でぐぐっていたりすると、GrepCode というサイトが時々引っかかります。Javaのソースコードを集めて検索可能にしてくれているサイトですが、ちょっとSDKのコードを読みたいというときは、このサイトで読むのがおすすめです。
Android SDKの各バージョンが置かれているので大変便利。SDKに同梱されているSupport Libraryも置いてあります(例えば新しく追加されたToolbarとか)。クラス名がリンクになっていて他のクラスにすぐ飛べるので、コードの流れを追いたいときにも便利です。コードレビュー時にリンクを貼る時にも重宝します。
ただし最新のSDKの反映は遅めなので、その点だけ注意が必要です(先週ようやく5.0のコードが反映されました)。
GitHub
オリジナルのgoogle codeのリポジトリをGitHubにミラーしたリポジトリがあります。最新のソースをWebで見たい場合は、こちらの方が便利です。GitHubのソースブラウザや検索が使えるというメリットもあります。こちらはコード名のリンクのような機能はありません。
2. SDK Managerでダウンロードして見る
SDK Managerを起動して、各バージョンのソースをダウンロードできます。ソースは$ANDROID_HOME/sources/android-21/support/
のようなパスに保存されます。落としたソースは自動的にリンクされ、Andrdoid Studioを使っていればCommand+クリックでジャンプできるようになります*1。開発に使っているSDKと対応するものは、入れておいて損はないと思います。
Support Libraryのソースも自動的に入ります($ANDROID_HOME/sources/android-21/support/
)。しかしここにあるのはSDKリリース時点のもので、Support Library単体のアップデートには追従していないようです。そこで最新のSupport Libraryを読むには次の方法を使っています。
3. gitでcloneして見る
google codeからSDKやSupport Libraryのソースがgit cloneできます*2。恐らくこちらにあるソースが、アプリケーション開発者が手に入れられる一番最新のものだと思います*3。そのままcloneするとかなり時間がかかるので注意。 リリースバージョンにはtagが振られているので、特定のバージョンのソースを見たければtagをcheckoutする必要があります。
gitのローカルリポジトリになるのでgit grepでコードを追うことができます。自分はSDKが提供しているパーツがSDK内でどう使われているかを探す場合によく使います。(たとえばIntentのflagの使われ方の例を探す、とか)
2の方法で手に入れたソースをgit initしたり、何らかのindexを作っておくだけでも検索はできるので、grep用途だけならこの方法は必要ないかもしれません。ただ自分はghq+percol/pecoでリポジトリを横断するフローに慣れてしまったため、他のgithubプロジェクトと同じ方法でソースにアクセスできるこの方法をよく使っています。
おわりに
色々書いてみましたが、自分が一番主張したいのは、Android SDKのソースを読みながら開発すると捗る!ということです。自分としては、これはもっと早くに知っておけば良かったと思っています*4
先日勉強会で、他社のAndroidエンジニアさんたちに「SDKのソース読んでますか?」と聞いてみたところ、話したほとんどのエンジニアは多かれ少なかれSDKのコードを読んだ経験を持っていました*5。その席で聞いてみたところでは、よく読むものとしてはFragment、Activity、Viewなどが人気があるようでした。
自分の経験では、Support LibraryのFragmentとViewPagerは読みづらいけど役に立つ鉄板、PagerTitleStripはカスタムViewの勉強になりました。
Android SDKのコードベースはとても大きく、知らないクラスを読む度新たな発見があります。SDKの語りかけに耳を澄ませて、彼の気持ちを理解するのです。そのとき、SDKは大いなる力、新たな可能性をあなた開示することでしょう。
という感じで雑に締めたいと思います。
*1:自分の環境ではたまにSDKのディレクトリへのリンクが切れることがあるので、その都度Attache Sources…で指定し直しています
*2:他にも多数のリポジトリがありますが、NDKを使わない自分の用途としては、ほぼplatform/frameworks/baseとplatform/frameworks/supportだけで足りています
*3:SDK MangerでSDKやSupport Libraryのリリースがあっても、その直後にはまだ反映されていなかったりすることがあるので、その場合はじっと待つしかないです。
*4:しかしこれは自分がiOS脳だったので思いつかなかっただけで、OSSなプラットフォームならフレームワークを読むのは当たり前のことではあります
*5:ぐぐったりして見たことがある人はほぼ全員、積極的に読むという人もそれなりに居る様子