Androidのソースコードを取得する方法

ここではWindows環境で作業することを前提として解説します。

次の手順で行います。

  1. Cygwinのインストール
  2. Repoのインストール
  3. リポジトリからソースコードをダウンロード

1. Cygwinのインストール

デフォルトのパッケージに加え、gitとcurlをインストールする必要があります。インストールの方法はCygwinのインストールで解説しています。

2. Repoのインストール

ここからはCygwinで作業を行います。

Cygwinのホーム ディレクトリに /binディレクトリを作成します。

$ mkdir ~/bin

そしてそのディレクトリにパスを設定します。

$ PATH=~/bin:$PATH

curlコマンドで、Repoスクリプトをダウンロードします。

$ curl http://android.git.kernel.org/repo > ~/bin/repo
※URLが変更されたようで、次が正しいです。
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo

成功すると、

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 17451  100 17451    0     0   1235      0  0:00:14  0:00:14 --:--:--  4328

のように表示されます。Repoのアクセス権に、すべてのユーザーに対する実行権を与えます。

$ chmod a+x ~/bin/repo

Repo clientの初期化

作業用のディレクトリを作成します。ここではandroid-sourceとしています。

$ mkdir ~/android-source

そのディレクトリをカレントディレクトリとします。

$ cd ~/android-source

Repoの初期化を行います。リビジョンを指定しない場合は最新のソースコードが取得されます。

$ repo init -u git://android.git.kernel.org/platform/manifest.git
$ repo init -u https://android.googlesource.com/platform/manifest

成功すると次のように表示されます。

gpg: WARNING: using insecure memory!
gpg: please see http://www.gnupg.org/faq.html for more information
gpg: keyring `/home/UserName/.repoconfig/gnupg/secring.gpg' created
gpg: keyring `/home/UserName/.repoconfig/gnupg/pubring.gpg' created
gpg: /home/UserName/.repoconfig/gnupg/trustdb.gpg: trustdb created
gpg: key 920F5C65: public key "Repo Maintainer <repo@android.kernel.org>" import
ed
gpg: Total number processed: 1
gpg:               imported: 1

Getting repo ...
   from git://android.git.kernel.org/tools/repo.git
remote: Counting objects: 1293, done.
remote: Compressing objects: 100% (564/564), done.
remote: Total 1293 (delta 831), reused 1134 (delta 706)
Receiving objects: 100% (1293/1293), 355.00 KiB | 149 KiB/s, done.
Resolving deltas: 100% (831/831), done.
From git://android.git.kernel.org/tools/repo
 * [new branch]      maint      -> origin/maint
 * [new branch]      master     -> origin/master
 * [new branch]      stable     -> origin/stable
 * [new tag]         v1.7.4.3   -> v1.7.4.3
From git://android.git.kernel.org/tools/repo
 * [new tag]         v1.0       -> v1.0
 * [new tag]         v1.0.1     -> v1.0.1
 * [new tag]         v1.0.2     -> v1.0.2
 * [new tag]         v1.0.3     -> v1.0.3
 * [new tag]         v1.0.4     -> v1.0.4
 * [new tag]         v1.0.5     -> v1.0.5
 * [new tag]         v1.0.6     -> v1.0.6
 * [new tag]         v1.0.7     -> v1.0.7
 * [new tag]         v1.0.8     -> v1.0.8
 * [new tag]         v1.0.9     -> v1.0.9
 * [new tag]         v1.1       -> v1.1
 * [new tag]         v1.2       -> v1.2
 * [new tag]         v1.3       -> v1.3
 * [new tag]         v1.3.1     -> v1.3.1
 * [new tag]         v1.3.2     -> v1.3.2
 * [new tag]         v1.4       -> v1.4
 * [new tag]         v1.4.1     -> v1.4.1
 * [new tag]         v1.4.2     -> v1.4.2
 * [new tag]         v1.4.3     -> v1.4.3
 * [new tag]         v1.4.4     -> v1.4.4
 * [new tag]         v1.5       -> v1.5
 * [new tag]         v1.5.1     -> v1.5.1
 * [new tag]         v1.6       -> v1.6
 * [new tag]         v1.6.1     -> v1.6.1
 * [new tag]         v1.6.10    -> v1.6.10
 * [new tag]         v1.6.10.1  -> v1.6.10.1
 * [new tag]         v1.6.10.2  -> v1.6.10.2
 * [new tag]         v1.6.2     -> v1.6.2
 * [new tag]         v1.6.3     -> v1.6.3
 * [new tag]         v1.6.4     -> v1.6.4
 * [new tag]         v1.6.5     -> v1.6.5
 * [new tag]         v1.6.6     -> v1.6.6
 * [new tag]         v1.6.7     -> v1.6.7
 * [new tag]         v1.6.7.1   -> v1.6.7.1
 * [new tag]         v1.6.7.2   -> v1.6.7.2
 * [new tag]         v1.6.7.3   -> v1.6.7.3
 * [new tag]         v1.6.7.4   -> v1.6.7.4
 * [new tag]         v1.6.7.5   -> v1.6.7.5
 * [new tag]         v1.6.8     -> v1.6.8
 * [new tag]         v1.6.8.1   -> v1.6.8.1
 * [new tag]         v1.6.8.10  -> v1.6.8.10
 * [new tag]         v1.6.8.11  -> v1.6.8.11
 * [new tag]         v1.6.8.2   -> v1.6.8.2
 * [new tag]         v1.6.8.3   -> v1.6.8.3
 * [new tag]         v1.6.8.4   -> v1.6.8.4
 * [new tag]         v1.6.8.5   -> v1.6.8.5
 * [new tag]         v1.6.8.6   -> v1.6.8.6
 * [new tag]         v1.6.8.7   -> v1.6.8.7
 * [new tag]         v1.6.8.8   -> v1.6.8.8
 * [new tag]         v1.6.8.9   -> v1.6.8.9
 * [new tag]         v1.6.9     -> v1.6.9
 * [new tag]         v1.6.9.1   -> v1.6.9.1
 * [new tag]         v1.6.9.2   -> v1.6.9.2
 * [new tag]         v1.6.9.3   -> v1.6.9.3
 * [new tag]         v1.6.9.4   -> v1.6.9.4
 * [new tag]         v1.6.9.5   -> v1.6.9.5
 * [new tag]         v1.6.9.6   -> v1.6.9.6
 * [new tag]         v1.6.9.7   -> v1.6.9.7
 * [new tag]         v1.6.9.8   -> v1.6.9.8
 * [new tag]         v1.7       -> v1.7
 * [new tag]         v1.7.1     -> v1.7.1
 * [new tag]         v1.7.2     -> v1.7.2
 * [new tag]         v1.7.3     -> v1.7.3
 * [new tag]         v1.7.3.1   -> v1.7.3.1
 * [new tag]         v1.7.4     -> v1.7.4
 * [new tag]         v1.7.4.1   -> v1.7.4.1
 * [new tag]         v1.7.4.2   -> v1.7.4.2
Getting manifest ...
   from git://android.git.kernel.org/platform/manifest.git
remote: Counting objects: 794, done.
remote: Compressing objects: 100% (319/319), done.
Receiving objectsremote: Total 794 (delta 329), reused 786 (delta 323):   % (414
Receiving objects: 100% (794/794), 215.77 KiB | 134 KiB/s, done.
Resolving deltas: 100% (329/329), done.
From git://android.git.kernel.org/platform/manifest
 * [new branch]      android-1.5 -> origin/android-1.5
 * [new branch]      android-1.5r2 -> origin/android-1.5r2
 * [new branch]      android-1.5r3 -> origin/android-1.5r3
 * [new branch]      android-1.5r4 -> origin/android-1.5r4
 * [new branch]      android-1.6_r1 -> origin/android-1.6_r1
 * [new branch]      android-1.6_r1.1 -> origin/android-1.6_r1.1
 * [new branch]      android-1.6_r1.2 -> origin/android-1.6_r1.2
 * [new branch]      android-1.6_r1.3 -> origin/android-1.6_r1.3
 * [new branch]      android-1.6_r1.4 -> origin/android-1.6_r1.4
 * [new branch]      android-1.6_r1.5 -> origin/android-1.6_r1.5
 * [new branch]      android-1.6_r2 -> origin/android-1.6_r2
 * [new branch]      android-2.0.1_r1 -> origin/android-2.0.1_r1
 * [new branch]      android-2.0_r1 -> origin/android-2.0_r1
 * [new branch]      android-2.1_r1 -> origin/android-2.1_r1
 * [new branch]      android-2.1_r2 -> origin/android-2.1_r2
 * [new branch]      android-2.1_r2.1p -> origin/android-2.1_r2.1p
 * [new branch]      android-2.1_r2.1p2 -> origin/android-2.1_r2.1p2
 * [new branch]      android-2.1_r2.1s -> origin/android-2.1_r2.1s
 * [new branch]      android-2.2.1_r1 -> origin/android-2.2.1_r1
 * [new branch]      android-2.2.1_r2 -> origin/android-2.2.1_r2
 * [new branch]      android-2.2.2_r1 -> origin/android-2.2.2_r1
 * [new branch]      android-2.2_r1 -> origin/android-2.2_r1
 * [new branch]      android-2.2_r1.1 -> origin/android-2.2_r1.1
 * [new branch]      android-2.2_r1.2 -> origin/android-2.2_r1.2
 * [new branch]      android-2.2_r1.3 -> origin/android-2.2_r1.3
 * [new branch]      android-2.3.1_r1 -> origin/android-2.3.1_r1
 * [new branch]      android-2.3.2_r1 -> origin/android-2.3.2_r1
 * [new branch]      android-2.3.3_r1 -> origin/android-2.3.3_r1
 * [new branch]      android-2.3.3_r1.1 -> origin/android-2.3.3_r1.1
 * [new branch]      android-2.3.4_r0.9 -> origin/android-2.3.4_r0.9
 * [new branch]      android-2.3.4_r1 -> origin/android-2.3.4_r1
 * [new branch]      android-2.3_r1 -> origin/android-2.3_r1
 * [new branch]      android-adt-0.9.8 -> origin/android-adt-0.9.8
 * [new branch]      android-adt-0.9.9 -> origin/android-adt-0.9.9
 * [new branch]      android-cts-2.1_r2 -> origin/android-cts-2.1_r2
 * [new branch]      android-cts-2.1_r3 -> origin/android-cts-2.1_r3
 * [new branch]      android-cts-2.1_r4 -> origin/android-cts-2.1_r4
 * [new branch]      android-cts-2.1_r5 -> origin/android-cts-2.1_r5
 * [new branch]      android-cts-2.2_r1 -> origin/android-cts-2.2_r1
 * [new branch]      android-cts-2.2_r2 -> origin/android-cts-2.2_r2
 * [new branch]      android-cts-2.2_r3 -> origin/android-cts-2.2_r3
 * [new branch]      android-cts-2.2_r4 -> origin/android-cts-2.2_r4
 * [new branch]      android-cts-2.2_r5 -> origin/android-cts-2.2_r5
 * [new branch]      android-cts-2.3_r1 -> origin/android-cts-2.3_r1
 * [new branch]      android-cts-2.3_r2 -> origin/android-cts-2.3_r2
 * [new branch]      android-cts-2.3_r3 -> origin/android-cts-2.3_r3
 * [new branch]      android-sdk-1.5-pre -> origin/android-sdk-1.5-pre
 * [new branch]      android-sdk-1.5_r1 -> origin/android-sdk-1.5_r1
 * [new branch]      android-sdk-1.5_r3 -> origin/android-sdk-1.5_r3
 * [new branch]      android-sdk-1.6-docs_r1 -> origin/android-sdk-1.6-docs_r1
 * [new branch]      android-sdk-1.6_r1 -> origin/android-sdk-1.6_r1
 * [new branch]      android-sdk-1.6_r2 -> origin/android-sdk-1.6_r2
 * [new branch]      android-sdk-2.0.1-docs_r1 -> origin/android-sdk-2.0.1-docs_
r1
 * [new branch]      android-sdk-2.0.1_r1 -> origin/android-sdk-2.0.1_r1
 * [new branch]      android-sdk-2.0_r1 -> origin/android-sdk-2.0_r1
 * [new branch]      android-sdk-2.1_r1 -> origin/android-sdk-2.1_r1
 * [new branch]      android-sdk-2.2_r1 -> origin/android-sdk-2.2_r1
 * [new branch]      android-sdk-2.2_r2 -> origin/android-sdk-2.2_r2
 * [new branch]      android-sdk-2.3.4_r1 -> origin/android-sdk-2.3.4_r1
 * [new branch]      android-sdk-tools_r2 -> origin/android-sdk-tools_r2
 * [new branch]      android-sdk-tools_r3 -> origin/android-sdk-tools_r3
 * [new branch]      android-sdk-tools_r4 -> origin/android-sdk-tools_r4
 * [new branch]      android-sdk-tools_r5 -> origin/android-sdk-tools_r5
 * [new branch]      android-sdk-tools_r6 -> origin/android-sdk-tools_r6
 * [new branch]      android-sdk-tools_r7 -> origin/android-sdk-tools_r7
 * [new branch]      cdma-import -> origin/cdma-import
 * [new branch]      cupcake    -> origin/cupcake
 * [new branch]      cupcake-release -> origin/cupcake-release
 * [new branch]      donut      -> origin/donut
 * [new branch]      donut-plus-aosp -> origin/donut-plus-aosp
 * [new branch]      eclair     -> origin/eclair
 * [new branch]      froyo      -> origin/froyo
 * [new branch]      froyo-plus-aosp -> origin/froyo-plus-aosp
 * [new branch]      gingerbread -> origin/gingerbread
 * [new branch]      master     -> origin/master
 * [new branch]      release-1.0 -> origin/release-1.0
 * [new branch]      tools-adt_r11 -> origin/tools-adt_r11
 * [new branch]      tools_r10  -> origin/tools_r10
 * [new branch]      tools_r11  -> origin/tools_r11
 * [new branch]      tools_r7   -> origin/tools_r7
 * [new branch]      tools_r8   -> origin/tools_r8
 * [new branch]      tools_r9   -> origin/tools_r9
 * [new tag]         android-1.5 -> android-1.5
 * [new tag]         android-1.5r2 -> android-1.5r2
 * [new tag]         android-1.5r3 -> android-1.5r3
 * [new tag]         android-1.5r4 -> android-1.5r4
 * [new tag]         android-1.6_r1 -> android-1.6_r1
 * [new tag]         android-1.6_r1.1 -> android-1.6_r1.1
 * [new tag]         android-1.6_r1.2 -> android-1.6_r1.2
 * [new tag]         android-1.6_r1.3 -> android-1.6_r1.3
 * [new tag]         android-1.6_r1.4 -> android-1.6_r1.4
 * [new tag]         android-1.6_r1.5 -> android-1.6_r1.5
 * [new tag]         android-1.6_r2 -> android-1.6_r2
 * [new tag]         android-2.0.1_r1 -> android-2.0.1_r1
 * [new tag]         android-2.0_r1 -> android-2.0_r1
 * [new tag]         android-2.1_r1 -> android-2.1_r1
 * [new tag]         android-2.1_r2 -> android-2.1_r2
 * [new tag]         android-2.1_r2.1p -> android-2.1_r2.1p
 * [new tag]         android-2.1_r2.1p2 -> android-2.1_r2.1p2
 * [new tag]         android-2.1_r2.1s -> android-2.1_r2.1s
 * [new tag]         android-2.2.1_r1 -> android-2.2.1_r1
 * [new tag]         android-2.2.1_r2 -> android-2.2.1_r2
 * [new tag]         android-2.2.2_r1 -> android-2.2.2_r1
 * [new tag]         android-2.2_r1 -> android-2.2_r1
 * [new tag]         android-2.2_r1.1 -> android-2.2_r1.1
 * [new tag]         android-2.2_r1.2 -> android-2.2_r1.2
 * [new tag]         android-2.2_r1.3 -> android-2.2_r1.3
 * [new tag]         android-2.3.1_r1 -> android-2.3.1_r1
 * [new tag]         android-2.3.2_r1 -> android-2.3.2_r1
 * [new tag]         android-2.3.3_r1.1 -> android-2.3.3_r1.1
 * [new tag]         android-2.3.3_r1a -> android-2.3.3_r1a
 * [new tag]         android-2.3.4_r0.9 -> android-2.3.4_r0.9
 * [new tag]         android-2.3.4_r1 -> android-2.3.4_r1
 * [new tag]         android-2.3_r1 -> android-2.3_r1
 * [new tag]         android-adt-0.9.8 -> android-adt-0.9.8
 * [new tag]         android-adt-0.9.9 -> android-adt-0.9.9
 * [new tag]         android-cts-2.1_r2 -> android-cts-2.1_r2
 * [new tag]         android-cts-2.1_r3 -> android-cts-2.1_r3
 * [new tag]         android-cts-2.1_r4 -> android-cts-2.1_r4
 * [new tag]         android-cts-2.1_r5 -> android-cts-2.1_r5
 * [new tag]         android-cts-2.2_r1 -> android-cts-2.2_r1
 * [new tag]         android-cts-2.2_r2 -> android-cts-2.2_r2
 * [new tag]         android-cts-2.2_r3 -> android-cts-2.2_r3
 * [new tag]         android-cts-2.2_r4 -> android-cts-2.2_r4
 * [new tag]         android-cts-2.2_r5 -> android-cts-2.2_r5
 * [new tag]         android-cts-2.3_r1 -> android-cts-2.3_r1
 * [new tag]         android-cts-2.3_r2 -> android-cts-2.3_r2
 * [new tag]         android-cts-2.3_r3 -> android-cts-2.3_r3
 * [new tag]         android-sdk-1.5-pre -> android-sdk-1.5-pre
 * [new tag]         android-sdk-1.5_r1 -> android-sdk-1.5_r1
 * [new tag]         android-sdk-1.5_r3 -> android-sdk-1.5_r3
 * [new tag]         android-sdk-1.6-docs_r1 -> android-sdk-1.6-docs_r1
 * [new tag]         android-sdk-1.6_r1 -> android-sdk-1.6_r1
 * [new tag]         android-sdk-1.6_r2 -> android-sdk-1.6_r2
 * [new tag]         android-sdk-2.0.1-docs_r1 -> android-sdk-2.0.1-docs_r1
 * [new tag]         android-sdk-2.0.1_r1 -> android-sdk-2.0.1_r1
 * [new tag]         android-sdk-2.0_r1 -> android-sdk-2.0_r1
 * [new tag]         android-sdk-2.1_r1 -> android-sdk-2.1_r1
 * [new tag]         android-sdk-2.2_r1 -> android-sdk-2.2_r1
 * [new tag]         android-sdk-2.2_r2 -> android-sdk-2.2_r2
 * [new tag]         android-sdk-2.3.4_r1 -> android-sdk-2.3.4_r1
 * [new tag]         android-sdk-tools_r2 -> android-sdk-tools_r2
 * [new tag]         android-sdk-tools_r3 -> android-sdk-tools_r3
 * [new tag]         android-sdk-tools_r4 -> android-sdk-tools_r4
 * [new tag]         android-sdk-tools_r5 -> android-sdk-tools_r5
 * [new tag]         android-sdk-tools_r6 -> android-sdk-tools_r6
 * [new tag]         android-sdk-tools_r7 -> android-sdk-tools_r7
From git://android.git.kernel.org/platform/manifest
 * [new tag]         android-1.0 -> android-1.0
 * [new tag]         android-2.3.3_r1 -> android-2.3.3_r1

名前とメールアドレスの入力を求められます。

Your Name  [ ]:
Your Email [ ]:

さらに入力内容の確認を求められます。

Your identity is:
is this correct [y/n]?

カラー表示を有効にするかどうかを問われます。

Testing colorized output (for 'repo diff', 'repo status'):
  black    red      green    yellow   blue     magenta   cyan     white
  bold     dim      ul       reverse
Enable color display in this user account (y/n)?

初期化が完了すると、

repo initialized in /home/UserName/android-source

のように表示されます。初期化に成功したならば、次はソースコードをダウンロードします。

Repoの初期化に失敗する場合

Repoの初期化時に、

C:\cygwin\bin\python.exe: *** fatal error - unable to remap
 \\?\C:\cygwin\lib\python2.6\lib-dynload\select.dll to same
 address as parent: 0x380000 != 0x3F0000

のようなエラーが表示され、初期化に失敗することがあります。

このような場合には、まずCygwinとそれに関連するプロセスを終了させます。なお関連するプロセスはProcess ExplorerでプロセスのPathを確認することで判別できます。

次にコマンドプロンプトを起動してから、ashを実行します。

c:\cygwin\bin>ash.exe

そしてrebaseallを実行することで問題を解決できます。

$ /bin/rebaseall
Cygwinで "unable to remap *.dll" が出るときは rebaseall らしい - XXXannex

特定リビジョンのソースコードの入手

特定のリビジョンのソースコードを入手するには、initの -bオプションでリビジョン番号を指定します。

$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1

取得できるリビジョン番号は、android.git.kernel.org Gitにあります。

$ git clone https://android.googlesource.com/platform/manifest

で、リポジトリからローカルにファイルをコピーして

$ cd manifest
$ git tag

とすることで一覧を取得できます。それは、たとえば次のような内容です。

android-1.6_r1.1_
android-1.6_r1.2_
android-1.6_r1.3_
android-1.6_r1.4_
android-1.6_r1.5_
android-1.6_r1_
android-1.6_r2_
android-2.0.1_r1_
android-2.0_r1_
android-2.1_r1_
android-2.1_r2.1p2_
android-2.1_r2.1p_
android-2.1_r2.1s_
android-2.1_r2_
android-2.2.1_r1_
android-2.2.1_r2_
android-2.2.2_r1_
android-2.2.3_r1
android-2.2.3_r2
android-2.2_r1.1_
android-2.2_r1.2_
android-2.2_r1.3_
android-2.2_r1_
android-2.3.1_r1_
android-2.3.2_r1_
android-2.3.3_r1.1_
android-2.3.3_r1_
android-2.3.4_r0.9_
android-2.3.4_r1_
android-2.3.5_r1_
android-2.3.6_r0.9
android-2.3.6_r1
android-2.3.7_r1
android-2.3_r1_
android-4.0.1_r1
android-4.0.1_r1.2
android-4.0.3_r1

3. ソースコードのダウンロード

Repoのsyncコマンドで、先ほど作成した作業ディレクトリにソースコードをダウンロードします。これには相当な時間がかかり、私の環境では3時間ほどでした。

$ repo sync

ダウンロードが完了すると、

Syncing work tree: 100% (183/183), done.

のように表示されます。ダウンロードされたファイル数は208,541で、サイズは9.47GBほどでした。 (2011/12現在)

Androidの情報サイトから、まとめて検索