Androidは自分でエミュレーターからコンパイルしよう

こんにちは。WEBチームの[twitter:@k2w4t4h]です。

「(中略)皆さん、Androidは最悪ソースから追えるようになっておいてください。」

という業務連絡が回ってきました。

Androidチーム忙しそうだもんねー。他からヘルプが欲しいご様子。
未発表の機種にエミュレーターをできるだけ近づけるとか、何かと自分でコンパイルできると便利なのかな。

ガラパゴスのアルバイトは、

ぐらいはみんな個人的によくやっているですが、さすがに全員がAndroidをソースからビルドしたことがあるわけでもないですし、アルバイトの新人などはいきなり言われると少し驚くような気もするので、社内メモを兼ねてUbuntu11.04上でAndroid 2.3をコンパイルする方法をブログにしておきます。

はじめに

現状のAndroidソースコードは、

  • (Linuxの場合)64bitでないとコンパイルできない。
  • しかし、利用しているライブラリは全部32bit
  • java仮想マシンも64bit上で32bitのファイルを動かすタイプが必要

という中途半端な仕様である、ということを頭の片隅に置いておいていただけると、わかりやすいかと思います。

Ubuntu11.04のデスクトップ版のAMD64版をクリーンインストールした状態を前提に話を進めます。

ライブラリのインストール

SynapticのSetting→Repository→Other SoftwareでCanonical Partnersのコードも受け入れられるようにします。
Synapticでそのままやるなら、一旦リロードします。

以下のパッケージを入れます

git-core
flex
bison
gperf
curl
zlib1g-dev
gcc-multilib
g++-multilib
lib32ncurses5-dev
x11proto-core-dev
libx11-dev
lib32readline5-dev
lib32z1-dev
sun-java6-jdk
ia32-sun-java6-bin

Androidソースコードの取得

Repoというgitのツールをセットアップします。

mkdir ~/bin
export PATH=~/bin:$PATH
cd ~/bin
curl http://android.git.kernel.org/repo > ~/bin/repo
chmod a+x ~/bin/repo

コードを取得します。

mkdir ~/mydroid
cd ~/mydroid
repo init -u git://android.git.kernel.org/platform/manifest.git
repo sync

かなり時間がかかります。

コンパイル

えいやっ!

cd ~/mydroid
make

メモリがたくさんあるなら、makeに-j8ぐらいのオプションをつけてあげると早く終わるかもしれません。
参考までに、手元のVMware上のメモリ8GB割り当てた仮想マシンでは15分ほどで終わりました。

起動してみよう

さっそく起動してみましょう。やたらとたくさんオプションがいります。

cd ~/mydroid/out/host/linux-x86/bin
./emulator -sysdir ~/mydroid/out/target/product/generic -kernel ~/mydroid/prebuilt/android-arm/kernel/kernel-qemu -data ~/mydroid/out/target/product/generic/userdata.img -noaudio -skindir ~/mydroid/development/emulator/skins -skin HVGA

しかし、オプションを見ればわかるように、この方法だと、Androidカーネルはバイナリ配布されているものを利用しています。

カーネルも別途取得してコンパイルできるんですが、長くなりましたので、このくらいで失礼させていただきます。