Android 4 (Ice Cream Sandwich) をビルドしてみる

Ubuntu 11.10 (64bit) で Android 4.0.1 (Ice Cream Sandwich) を構築してみます。まだ、作業が途中だけどとりあえずメモしておく・・・

VMware Fusion 上の、Ubuntu 11.10 で Memory 2G, CPU 2 core, Disk 80G でビルドしてみました。コンパイル後の Disk使用量を調べると 23G ぐらい。ビルド時間は、以下のファイルのリストから何となく想像を〜(ちゃんと計っていなかったので)

$ du -sk
22940084	.
$ ls -l build/envsetup.sh 
-rw-rw-r-- 1 shin user 28590 2011-11-17 22:40 build/envsetup.sh
$ ls -l out/target/product/generic/*.img
-rw-rw-r-- 1 shin user    162909 2011-11-18 00:43 out/target/product/generic/ramdisk.img
-rw------- 1 shin user 170157504 2011-11-18 01:09 out/target/product/generic/system.img
-rw------- 1 shin user  20482140 2011-11-18 02:23 out/target/product/generic/userdata-qemu.img
-rw------- 1 shin user     80256 2011-11-18 00:46 out/target/product/generic/userdata.img
$ 

* 必要なパッケージのインストール

JDKやコンパイルに必要なパッケージをインストールします。

$ 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 git-core gnupg flex bison gperf build-essential \
> zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \
> x11proto-core-dev libx11-dev lib32readline-gplv2-dev lib32z-dev \
> libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \
> libxml2-utils
$ vi /etc/udev/rules.d/51-android.rules

<username>には、有効なアカウントを指定する。

# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on maguro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"

* ソースのダウンロード

リポジトリーからソースをダウンロードします。ユーザー名等は適切なものを入力する。

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ mkdir ~/android4
$ cd ~/android4
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
...
Your Name  [Shin]: <cr>
Your Email [shin@ubuntu.(none)]: shin@example.com

Your identity is: Shin <shin@example.com>
is this correct [y/n]? y

Enable color display in this user account (y/n)? y
...
$ repo sync
$ gpg --import
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.2.2 (GNU/Linux)

mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7
8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD
u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z
wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq
/HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5
jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4
MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9
b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv
aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k
cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX
gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI
2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl
QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up
hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk
C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX
LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+
OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M
pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s
KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb
N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA
vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo
G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ
hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l
EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM=
=Wi5D
-----END PGP PUBLIC KEY BLOCK-----

コントロールD(^D)でキーの登録を完了する。ほかに、git の設定とかちゃんとするとよいのかも、でも、ビルドしてみるだけなので省略。

* ビルド

Ubuntu 11.10 でビルドする場合、コンパイルエラーになる。そこで、以下のソースを修正します。

◎ build/core/combo/HOST_linux-x86.mk 【56行目】
-HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
+HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

◎ external/gtest/include/gtest/internal/gtest-param-util.h 【40行目】
 #include <vector>
+#include <cstddef>
 #include <gtest/internal/gtest-port.h>

◎ external/oprofile/libpp/format_output.h 【94行目】
 -               mutable counts_t & counts;
 +               counts_t & counts;

◎ frameworks/compile/slang/Android.mk 【22行目】
-local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter -Werror
+local_cflags_for_slang := -Wno-sign-promo -Wall -Wno-unused-parameter

◎ external/llvm/lib/Support/Mutex.cpp 【16行目】
 #include "llvm/Config/config.h"
 #include "llvm/Support/Mutex.h"
+#undef ENABLE_THREADS
+#undef HAVE_PTHREAD_H

◎ external/llvm/lib/Support/Signals.cpp 【28行目】
 }

+#undef HAVE_DLFCN_H
+
 // Include the platform-specific parts of this class.
 #ifdef LLVM_ON_UNIX
 #include "Unix/Signals.inc"

◎ external/llvm/lib/Support/Threading.cpp 【19行目】
 #include "llvm/Support/Mutex.h"
 #include "llvm/Config/config.h"
 #include <cassert>
+#undef LLVM_MULTITHREADED

 using namespace llvm;

ビルドに必要な環境をロードして、ビルドタイプを指定する(今回は full-eng)。CPUコアの数によって、同時にいくつのスレッドで困憊するか指定する(今回は 2スレッド)。

$ source build/envsetup.sh
$ lunch full-eng
$ make -j2

* テスト

とりあえず、ビルドが完了したのでエミュレータを起動してみる。

$ emulator

エミュレータ起動画面

アプリ画面

端末情報画面

デバイスにロードしてテスト。。。

$ adb reboot bootloader
$ fastboot flashall -w

* 参照

http://source.android.com/source/initializing.html
http://source.android.com/source/downloading.html
http://source.android.com/source/building.html