ninjinkun's diary

ninjinkunの日記

Android SDKのソースコードを読みながら開発する

この記事は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でダウンロードして見る

f:id:ninjinkun:20141214121259p:plain

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からSDKSupport 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。その席で聞いてみたところでは、よく読むものとしてはFragmentActivityViewなどが人気があるようでした。

自分の経験では、Support LibraryのFragmentViewPagerは読みづらいけど役に立つ鉄板、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:ぐぐったりして見たことがある人はほぼ全員、積極的に読むという人もそれなりに居る様子