コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

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版のホストでVMWareUbuntu 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には下記のようにDevlPythonをインストールしてあるものとします。

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がビルドを続けています。