という事で前回の続きを。なんかタイトルがやたら長いのが気になってるけど、しかたないか…。
前回はソースコードのダウンロードからTOPフォルダの解説までしてみた。今回からダウンロードしたAndroidソースコードをいろいろ覗いてみる。
動いているアプリのソースコードがお手元に
まずその1つめ、OHA-Android-2.2_r1.1/package/apps フォルダから。
このには標準でインストールされるアプリケーションのソースコードがすべてある。ちなみに、計28アプリある。
フォルダ名 | 概要 |
---|---|
AccountsAndSyncSettings | アカウント設定 |
CertInstaller | (?) |
IM | インスタントメッセンジャー |
Provision | (?) |
AlarmClock | アラームクロック |
Contacts | 電話帳 |
Launcher2 | ランチャ |
QuickSearchBox | 検索(widget) |
Bluetooth | Bluetooth |
DeskClock | アナログ時計(widget) |
Mms | MMS |
Settings | 設定 |
Browser | ブラウザ |
メール | |
Music | 音楽プレイヤ |
SoundRecorder | サウンドレコーダ |
Calculator | 計算機 |
Gallery | ギャラリー |
PackageInstaller | パッケージインスーラ |
SpeechRecorder | 音声レコーダ |
Calendar | カレンダー |
Gallery3D | ギャラリー(3D) |
Phone | 電話 |
Stk | (?) |
Camera | カメラ |
HTMLViewer | HTMLビュアー |
Protips | (?) |
VoiceDialer | 音声ダイヤラー |
このフォルダには、Androidケータイにあって、オープンソース版に含まれていないアプリがある。それは、Google Mapsアプリ。これはGoogle Mapsを利用するにはGoogleとのライセンス契約が必要になってくるので、オープンソース版には含まれていないのだ。ちなみに、オープンソースでビルドされるSDKもGoogle Maps対応のものは生成されない。あと、マーケットアプリも。
それでも、これだけのソースがあれば、ソースを読んでみたいアプリが1つぐらいあるはず。
ソースコードの構成
これらのアプリのソースコードのファイル構成は通常のAndroidアプリケーションと同じ構成になっているのでご安心を。ちなみにCameraアプリのTopフォルダはこのような構成になっている。
.
├── Android.mk
├── AndroidManifest.xml
├── CleanSpec.mk
├── MODULE_LICENSE_APACHE2
├── NOTICE
├── proguard.flags
├── res
│ ├── anim
│ ...
├── src
│ └── com
│ └── ...
└── tests
├── AndroidManifest.xml
└── src
└── ...
ちょっと見たことないファイル(proguard.flagsとか)あるけど、まあ気にするな。 ここまで分かれば、あとはアプリのソースを調べていけるはず。
ソースコードの活かし方
で、このソースをどうしたらいいの? 実際にこのソースを読んで役に立つシチュエーションが思いつかないって人もいるだろうから、そのあたりも書いてみる。 まあAndroidに限った話でもないが、今回はAndroidに絡めて。
一歩踏み込んだ関数の使い方を知りたい
大抵はある機能を実現するために、リファレンスマニュアルを読んで必要なメソッドを調べて実装、というパターンが多い。それはそれでいいのだが、残念ながらリファレンスマニュアルというものは、そのメソッド単体での解説しか書いてない事が多い。
例えば、○○を確保したら終了時は必ず解放せよ、とか、○○で新規にインスタンスを生成したら次に必ず××を設定しなきゃいけないとか、そういった手順通りに行わないとちゃんと動作しない事とか割と多い。
先のように何らかの手順が必要な機能を実装するときは、ググって調べたりするんだけど、必ずしその解決方法が見つかるとは限らない。そんな時は、それらの機能を実現しているアプリのソースを読むと早く解決できる。場合によっては、ググるより早かったりも。
○○機能をパクりたい
ソフト開発者であれば、一度は考えるであろう事の一つに「○○アプリの○○の実装が知りたい!」ってのがある。
ソースが公開されてないアプリであれば、動きから想像してアルゴリズムを作成するとか、ググってそれっぽいものを実装するという手法になる。しかし、ソースが公開されていれば、ソースが手元にあるのだがら、その実装がまんま分かる。しかも、その実装を自分のアプリに取り込む事もできてしまう。
この時に一つ気をつけないといけないのは、取り込む元のソースコードのライセンス。Linuxなどに採用されているGNU General Public Licenseならば、ソースコードの開示義務なども発生するので、作成中のソースコードを公開したくない場合には、いろいろ気を使わねばならなくなる。
しかし、Androidのソースコードが採用しているライセンスはApache Licenseなので、ライセンスを深く気にする必要がなくなる。Apacheライセンスであれば、ソースコード公開の義務は発生しない。
Intentで連携を取りたい
Androidには自作アプリケーションから他のアプリケーションへ制御&データを渡すIntentという機能がある。これがAndroidの大きな特徴の一つ。わかりやすい説明は第4回 Androidの重要な機能、インテント | Think ITを見てもらうとして。
このIntentを利用して、自作アプリケーションから外部アプリケーションのActivityを呼び出すときは、Intentを作成、データを設定後にActivityを呼び出す必要がある。で、問題はどのようなIntentを生成、設定したら、その外部アプリケーションはちゃんとIntentを受け取り、ちゃんとActivityを表示してくれるのか? ということ。
間違ったIntentを発行した場合は、自分がIntentを届けたい外部アプリケーションにはIntent-filterで弾かれてしまって、結局Activityが開けないー、という事になる。
リファレンスマニュアルにも、IntentのActionの一覧が書かれてはいるが、リファレンスマニュアルのみでは探しているアクションや引数を見つけるのは割と大変。そんな時は、その外部アプリケーションのAndroidManifest.xmlを読むと、ActivityとIntent-filterの定義ががちゃんと書かれている。あとは、それに従ってIntentを生成、設定することで、希望するActivityが表示される。
この外部アプリケーションのAndroidManifest.xmlを読まないと、マニュアルを首っ引きになって、自分でIntentを発行して試行錯誤しなきゃいけなくなる…。
Androidアプリのソースコードを読む目的は、だいたいこんなところじゃないかと。まさか、Androidアプリのソースコードを読んでJavaを勉強しようという人はいないよね…(Java勉強が目的なら他のコードがいいよと思うよ)
他にも読むべきソースはある
これらのソースコードを読むだけでもいろいろ参考になって便利なのだけど、他にも読んでおくべきソースコードは存在する。
それはどこか? それはまた次回に。