Androidのソースプログラムを取得する
Androidのソースプログラムを取得して自分でビルドしてみようと、いろいろ試みています。その備忘録として書いておきます。
Windowsユーザなので、Androidのビルドはlinux環境で行うのが簡単そうです。ということで、VMWareを使ってUbuntuを起動し、ビルドを行うことにしました。その前に、最新のGingerbread(Android v2.3)は64ビット環境で無いとビルドできないということを知り、OSをXP Pro32bitからWin7 Pro64bitに変更しました。
ここで、既に1つ勘違いしていました。OSが64bitになっても、CPUがVTモード(Intel Virtualization Technology)をサポートしていないと、VMWareへの64bitOSのインストールができないということでした。自分のPCのCPUを見てみると、Dual-Core E5200という型番でVT非対応でした。仕方が無いので、Core i3マシンを一台購入しました。
ここで、1つ疑問が残りました。もしかしたら、「CPUが64bitでVTモードに対応していれば、Win7 64bit版を購入しなくても、XP 32bit版のホストでVMWareにUbuntu 64bit版を入れることができたのではないか?」というものです。今となっては、Core i3機にXP 32bit版をインストールする気も無いので、答えはわからないですが、できるような気がします。
Ubuntu10.10
先ずは本家Ubuntuから、Ubuntu10.10 64bit版のイメージをダウンロードして、VMWareにインストールしました。WMWareの設定は以下のような感じです。
- メモリ 1GB
- CPU 4つ
- 64bit OS
- HDD 64GB
ソース取得準備
Androidのソースを取得するために、諸先輩方のサイトを参考に以下のツールをインストールしました。
git(ギット)のインストール
sudo apt-get install git-core
GingerbreadはJava6を使うので、Java6のインストール
sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" sudo apt-get update sudo apt-get install sun-java6-jdk
その他、必要そうなツールをまとめてインストール
sudo apt-get install gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib x11proto-core-dev libx11-dev libsdl-dev libesd0-dev libwxgtk2.6-dev valgrind unzip
repoの取得と権限設定
cd ~ mkdir bin curl http://android.git.kernel.org/repo >~/bin/repo chmod a+x ~/bin/repo
ソースの取得
それでは、最新のandroid-2.3.3_r1aのソースを取得しようとして、下記のようにしたら怒られました。
mkdir android-2.3.3_r1a cd android-2.3.3_r1a ~/bin/repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.3_r1a | error: revision android-2.3.3_r1a in manifests not found
マニフェストが無いと言っている。仕方が無いので、r1を取得することにしました。
~/bin/repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.3_r1
そして、実行します。
~/bin/repo sync
エラーでとまります。あきらめずに、
~/bin/repo sync
エラーでとまります。あきらめずに、
~/bin/repo sync
10分くらい繰り返して、あきらめました。
VMWareでのソース取得をあきらめる
どうも、repoによるソースの取得がうまくいかないので調べてみると、LANが遅くて切られているような感じでした。VMWareからだと速度が出ないのか?と思い、それなら、VMWareをあきらめて、cygwinを使ってソースを取得することにしました。
cygwinによるソースの取得
Androidのndkをコンパイルするために、cygwinは既にインストール済です。ただし、Androidのソースを取得するためのツールを追加しなければなりません。後、Pythonのバージョンにも問題がありました。
とりあえず、今時点のcygwinには下記のようにDevlとPythonをインストールしてあるものとします。
Pythonのバージョンを下げる
Androidのソースを取得するrepoはPython2.6では動作しないようで、Python2.5を再インストールするように設定を変更しました。そのためには、setup.exeを起動します。そして、下図のように、2.6.5-2となっているところを、2.5.5-1に変更しました。
curlをインストールする
repoを取得するのにcurlを使います。そこで、curlをインストールするように再設定しました。下図でKeepとなっているのは、既にインストールした後、画面をキャプチャしたからです。
gnupgをインストールする
repoしたところ、gnupgに関してワーニングが出ました。そこで、gnupgもインストールするように再設定しました。下図でKeepとなっているのは、既にインストールした後、画面をキャプチャしたからです。
いよいよAndroidのソースを取得
cygwinを起動します。そして、もう一度、repoの取得から行います。
cd ~ mkdir bin curl http://android.git.kernel.org/repo >~/bin/repo chmod a+x ~/bin/repo
Android-2.3.3_r1のソースを取得します。
mkdir android-2.3.3_r1 cd android-2.3.3_r1 ~/bin/repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.3.3_r1 ~/bin/repo sync
絶好調でソース取得が始まりました。ところが、快調といえども、やっぱりエラーで止まります。エラー無しですんなりとは行ってくれません。
repo自動繰り返しスクリプト作成
仕方が無いので下記のようなスクリプト(getloop.sh)を書きました。これは引数の数だけ、repoを自動的に繰り返すスクリプトです。引数をいくつにするかは、実行環境で決めてください。
if [ $# != 1 ]; then echo "usage: $0 MAX" 1>&2 exit 0 fi MAX=$1 i=0 while [ $i -le $MAX ]; do echo "$i" 1>&2 i=`expr $i + 1` ~/bin/repo sync sleep 4 done
そして、スクリプトの実行
chmod a+x getloop.sh ./getloop.sh 30
これで、cygwinをしばらく放置していたら、Android-2.3.3_r1のすべてのソースの取得が終わっていました。
取得したソースをVMWareへ
取得したソースをWindowsの共有を利用してVMWareに持っていったのですが、make中に見事にエラーが出ました。何かなぁと調べてみると、シンボリックリンクが壊れていました。どうも、Androidのソースにはたくさんシンボリックリンクが張られているようで、検索したらいっぱい出てきました。Windowsの共有を用いてフォルダ毎VMWareに持ってきたので、シンボリックリングが壊れてしまったようです。
そこで、tarして持ってくることに。
cd android-2.3.3_r1
tar cvf android-2.3.3_r1.tar ./*
そして、android-2.3.3_r1.tarをWindowsの共有でコピーして、Ubuntuで解凍。
mkdir android-2.3.3_r1 cd android-2.3.3_r1 tar xvf ../android-2.3.3_r1.tar
これで、移行完了。
さて、makeですが、このブログを書いている今も、まだ、Ubuntuがビルドを続けています。