アンドロイドについて「オープンソース」だと記述を見かけることがあります。「オープンソース」とは、ソースコードが公開されているという意味です。では、アンドロイドのソースコードはどこにあるのでしょうか?

アンドロイドのソースコードは、「git」(ギット)というソースコード管理システムで管理されていて、インターネットに公開されています。gitは、開発者がソースコードを管理するために利用するものです。gitの名前の由来はいろいろあるのですが、特に明確な由来があるわけではありません。ただ、LinuxやUnixで使われていない3文字の組み合わせなので、コマンドラインからツールを使うときにキーストロークが少なく済み、「取得」を意味する「get」に似ているという点は、この3文字の組み合わせになった理由の1つと考えられています。

gitのツールを使えば、誰でもソースコードを入手することができますが、公開されているgitサーバーには、Webのインターフェースもあり、「見る」だけならブラウザからもソースコードを表示させることは可能です。ですが、膨大な量のファイルがあるため、ただ、眺めるだけならまだしも、特定の標準アプリやプログラムモジュールのソースコードを探すのは結構大変です。

というわけで本格的にソースを入手するならgitが必要なのですが、ちょっとだけ見たいというのであれば、以下のURLで見ることができます。

https://android.googlesource.com/?format=HTML

gitで管理されている特定のプロジェクトのソースコードを置いた場所をリポジトリといいます。上記は、Googleが公開しているリポジトリです。ここにはgit経由でアクセスもできますが、ブラウザからアクセスすれば、リポジトリの内容をHTMLに変換したページを見ることができます。

ただ、カテゴリ分けされているとはいえ、リンクが大量でどうしようもないかもしれません。

アンドロイドアプリの開発者の人なら、標準でインストールされているアプリのソースコードが気になるでしょう。それは、「platform/packages/apps/」から始まるリンクにあります。たとえば、カレンダーなら、

https://android.googlesource.com/platform/packages/apps/Calendar/

になります。ただし、具体的なソースコードを見るためには、ブランチやタグを指定する必要があります。gitではソースコードをリビジョンという単位で記憶していきます(図01)。ブランチは、ソースコードの変更作業を分離して、別のリリースを作ることです。たとえば、Jelly Beansがリリースされているとき、Kit Katの開発を開始するためには、お互いの修正がぶつからないようにブランチを作るわけです。タグは、特定のリビジョンに対して付ける名前で、そのリビジョンのソースコードからバイナリを作り、リリースしたときなどに付けていきます。

図01: ソースコード管理システムは、ソースコードの変更を記録していき、過去のソースコードを取り出したり、ブランチを作り開発作業を分離するなどの機能がある (画像クリックで拡大)

タグやブランチといえば複雑そうですが、簡単にいえば、どのバージョンのアンドロイドに搭載されたものなのかを指定してソースコードを見るということです。とりあえず、最新状態ということであれば、「Branches」のところにある「master」ブランチを見ればいいでしょう。ブランチ(枝)でソースコードが分岐していくので、全体を「ソースコードツリー」などといいます。masterは、このソースコードツリーの「幹」にあたる部分です。

じっとみていくと、いろいろと面白いところがあります。たとえば、「時計」アプリのソースコードを見てみましょう。

https://android.googlesource.com/platform/packages/apps/DeskClock/+/master

これは、アンドロイドの標準のアプリなので、Javaのソースコードは「src/」に、画像データや文字データは「res/」にあります。アンドロイドのアプリを開発した人ならこのディレクトリ構造はなじみのあるものです。

アンドロイドアプリでは、さまざまな言語に対応するため、画面に表示する文字列データは、アプリケーションと分離されていて、各国語用の文字列を用意することができます。標準アプリは多数の言語に対応していて、もちろん日本語のメッセージもあります。

https://android.googlesource.com/platform/packages/apps/DeskClock/+/master/res/values-ja/

ここにある「string.xml」をちょっと覗いてみましょう。たしかに「時計」とか「アラーム」とかの日本語の文字列が入っています。ですが、中頃には、こんなデータが入っています。

 <string-array name="sw_share_strings">
    <item msgid="842841032273927988">"なかなかのスピード狂です。"</item>
    <item msgid="6332879039890727169">"まさに努力の賜物です。"</item>
    <item msgid="815382761274660130">"Androidも高速ですが、あなたのスピードには負けます!"</item>
    <item msgid="7916250650982813737">"肩の力を抜いて。"</item>
    <item msgid="6836603904515182333">"すご腕の持ち主です。"</item>
    <item msgid="7508085100680861631">"まさに驚きの速さです。"</item>
    <item msgid="5961245252909589573">"もう一度タイムワープしましょう。"</item>
    <item msgid="5211891900854545940">"左に移動するだけです。"</item>
    <item msgid="9071353477103826053">"急ぎのパレットがあります。"</item>
    <item msgid="3785193933691117181">"光の速さです。"</item>
  </string-array>

いったいなんでしょう? このデータは、「sw_share_strings」という名前の配列になっています(1行目)。では、これを使っている部分を探してみましょう。それは、以下の部分で参照されていました。

https://android.googlesource.com/platform/packages/apps/DeskClock/+/master/src/com/android/deskclock/stopwatch/Stopwatches.java

このメッセージの配列は、

public static String getShareTitle(Context context) {
    String [] mLabels = context.getResources().getStringArray(R.array.sw_share_strings);
    return mLabels[(int)(Math.random() * mLabels.length)];
}

で参照されていました。ここはストップウォッチ関連のソースコードがある場所で、上記のリストの1行目にある名前(getShareTitle)から想像すると「共有」機能のタイトルに使われているようです。

試しに、ストップウォッチから「共有」機能を使ってみます。ストップウォッチを起動して、右側の共有アイコンをタップすると、共有先のアプリの一覧が出るので、Google Keep(Googleのメモアプリ)で「共有」してみました。すると(写真01)のように、メッセージが付いた状態でKeepが起動します。メッセージは乱数で選ばれているので、共有するたびに変化します。

写真01: ストップウォッチによる測定結果をGoogle Keepで共有すると、1行目にお茶目なメッセージが入る

一見、普通に見えた時計アプリも、こういう「お茶目」なところがあるようです。ものすごい発見があるわけでもないのですが、ソースコードを見ていると、こういう小さな「驚き」がいろいろと隠れています。

関連リンク

連載バックナンバーはこちら