コンピュータを楽しもう! RSSフィード Twitter

2011-04-18

[][]Androidのソースプログラムを取得する 22:19

Androidのソースプログラムを取得して自分でビルドしてみようと、いろいろ試みています。その備忘録として書いておきます。

Windowsユーザなので、Androidビルドlinux環境で行うのが簡単そうです。ということで、VMWareを使ってUbuntuを起動し、ビルドを行うことにしました。その前に、最新のGingerbread(Android v2.3)は64ビット環境で無いとビルドできないということを知り、OSXP Pro32bitからWin7 Pro64bitに変更しました。

ここで、既に1つ勘違いしていました。OSが64bitになっても、CPUVTモード(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インストールしてあるものとします。

f:id:tarosay:20110418210752p:image

Pythonのバージョンを下げる

Androidのソースを取得するrepoはPython2.6では動作しないようで、Python2.5を再インストールするように設定を変更しました。そのためには、setup.exeを起動します。そして、下図のように、2.6.5-2となっているところを、2.5.5-1に変更しました。

f:id:tarosay:20110418210751p:image

curlインストールする

repoを取得するのにcurlを使います。そこで、curlインストールするように再設定しました。下図でKeepとなっているのは、既にインストールした後、画面をキャプチャしたからです。

f:id:tarosay:20110418210741p:image:w640

gnupgインストールする

repoしたところ、gnupgに関してワーニングが出ました。そこで、gnupgインストールするように再設定しました。下図でKeepとなっているのは、既にインストールした後、画面をキャプチャしたからです。

f:id:tarosay:20110418210748p:image:w640


いよいよ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.tarWindowsの共有でコピーして、Ubuntu解凍

mkdir android-2.3.3_r1
cd android-2.3.3_r1
tar xvf ../android-2.3.3_r1.tar

これで、移行完了。

さて、makeですが、このブログを書いている今も、まだ、Ubuntuビルドを続けています。

mirai954mirai954 2011/05/05 09:42 たろささん

mirai954 です、初めまして。
(#先日神戸支部に入会させていただき5月7日のロボット会に参加予定です)

私も環境構築では同じような苦労をしましたので
参考までにコメントを。

■ VmWare の repo sync で落ちる
 対応策として、私がやってみたのは
 (例1) ~bin/repo sync bionic など
    sync の後にプロジェクト名(==ディレクトリ名)を追加して
    プロジェクト毎に取る。

(例2)メモリを増設する(私の場合はVirtualBoxで、割り当て量2GB→11GB)
    repo sync 1回で全体を取り出すことができました。

 その他、だめだった方法としては
  ・早朝、午前中、午後、深夜など時間帯を変えてみる
  ・光回線、AirH"(32Kbbs 〜 128Kbbs 程度)
 何れの方法でも程度の差はあるものの
、結局、どの時間帯でも、回線速度を変えても落ちました

■ make 中に落ちる?
 私の場合は、make -j1(CPU1個指定)でも、make中に何度も落ちました。
 make中に別の端末で "free" コマンドでメモリ残量を見ていると
 割り当てていた 2GB からみるみる減少して 20MB とかになった後に落ちてました。
 結局、対応策としては、マシンを買い替え、上記(例2)のように割り当て量を11GBに
 増やすと、make -j8 でも落ちることなく、ビルドが通るようになりました。

お互い、開発環境構築では苦労しますね(苦笑)。
アンドロイドの会で、「はまる」項目毎にFAQを作るのがいいかも?

tarosaytarosay 2011/05/05 18:51 mirai954さん、こんにちは。
repo 読み出しにメモリが影響するのですね。勉強になります。
私はmake中にメモリ不足で落ちたことは無かったです。
>お互い、開発環境構築では苦労しますね(苦笑)
たいへんですよね。デバッグ環境も欲しいところです。linuxの開発ってやったことが無いので、試行錯誤で、いろいろ試しています。