Android4.0のソースからターゲット"Galaxy Nexus"を生成

今週火曜日、2011年11月15日に公開されたAndroid4.0(ICS: Ice Cream Sandwich)のソースをダウンロードし、ターゲット"Galaxy Nexus(maguro)"をコンパイル、生成してみました。
残念ながら動かす実機(Galaxy Nexus または Pandaボード)がないので、Galaxy Nexusのインストールイメージを生成するところまでを試してみました。

以下、android-building@googlegroups.com(https://groups.google.com/group/android-building)へのAndroid4.0公開の投稿です。

https://groups.google.com/group/android-building/msg/c0e01b4619a1455a?pl...



差出人: Jean-Baptiste Queru
日付: Mon, 14 Nov 2011 13:59:26 -0800
ローカル: 2011 年11月15日(火) 午前6:59
件名: ICS is coming to AOSP

Hi! We just released a bit of code we thought this group might be interested in.
Over at our Android Open-Source Project git servers, the source code for Android version 4.0 (Ice Cream Sandwich) is now available.
...................
This is actually the source code for version 4.0.1 of Android, which is the specific version that will ship on the Galaxy Nexus, the first Android 4.0 device. In the source tree, you will find a device build target named "full_maguro" that you can use to build a system image for Galaxy Nexus. Build configurations for other devices will come later.
...................



       ↑
    先日 私が購入したNexus S (crespo)をターゲットデバイスとするソースコードのバージョンのリリースが待ち遠しい。
    (Nexus Sが4.0にアップデートできるということであればですが)

= 現在、Android4.0.1がサポートしている製品について =

以下、Fedora15(64ビット版)で行なったダウンロード、コンパイルの手順です。

[ダウンロード]

$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > repo
$ chmod 755 repo
$ ./repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
$ ./repo sync

$ ls -F
Makefile  bionic/    build/  dalvik/       device/  external/    hardware/  ndk/       prebuilt/  sdk/
abi/      bootable/  cts/    development/  docs/    frameworks/  libcore/   packages/  repo*      system/

ダウンロードしたソースのサイズは全体で約10GBでした。
(8月の時点のmasterのソースは約6GB)

参考:(repo init の実行後)
$ ls .repo/manifests.git/refs/remotes/origin/
android-1.6_r1    android-2.0_r1      android-2.2.2_r1  android-2.3.3_r1.1  android-4.0.1_r1
android-1.6_r1.1  android-2.1_r1      android-2.2_r1    android-2.3.4_r0.9  froyo
android-1.6_r1.2  android-2.1_r2      android-2.2_r1.1  android-2.3.4_r1    gingerbread
android-1.6_r1.3  android-2.1_r2.1p   android-2.2_r1.2  android-2.3.5_r1    gingerbread-release
android-1.6_r1.4  android-2.1_r2.1p2  android-2.2_r1.3  android-2.3.6_r0.9  ics-mr0
android-1.6_r1.5  android-2.1_r2.1s   android-2.3.1_r1  android-2.3.6_r1    master
android-1.6_r2    android-2.2.1_r1    android-2.3.2_r1  android-2.3.7_r1
android-2.0.1_r1  android-2.2.1_r2    android-2.3.3_r1  android-2.3_r1

[コンパイル]

$ . build/envsetup.sh
including device/samsung/maguro/vendorsetup.sh
including device/samsung/tuna/vendorsetup.sh
including device/ti/panda/vendorsetup.sh
including sdk/bash_completion/adb.bash
[rotake@ssayaka android4.0.1]$ lunch

You're building on Linux

Lunch menu... pick a combo:
     1. full-eng
     2. full_x86-eng
     3. vbox_x86-eng
     4. full_maguro-userdebug
     5. full_tuna-userdebug
     6. full_panda-eng

Which would you like? [full-eng] 4

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.1
TARGET_PRODUCT=full_maguro
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ITL41D
============================================

$ make -j4
(この後、色々とエラーが出て、対処しました。→ [コンパイル時のエラーへの対処] を参照。
エラーのほとんどはホストの開発環境によるもののようです。エラーなくスムーズにコンパイルできる開発環境が他にあるのかも知れません。)

$ ls -F
Makefile  bionic/    build/  dalvik/       device/  external/    hardware/  ndk/  packages/  repo*  system/
abi/      bootable/  cts/    development/  docs/    frameworks/  libcore/   out/  prebuilt/  sdk/   v8.log
$ du -s .
22890880	.
$ du -s out
13010112	out

生成されたバイナリはoutディレクトリ以下に置かれます。outディレクトリ以下のサイズは約13GBでした。( Ctsはエラーを解決できず、バイナリはなし )
ダウンロード直後の約10GBにこの分が増えて、ソースディレクトリ以下は全体で約23GBになりました。

以下、最終結果です。
$ ls -l out/target/product/maguro
合計 307828
-rw-rw-r--.  1 rotake rotake        93 11月 17 18:27 android-info.txt
-rw-r--r--.  1 rotake rotake   4151296 11月 17 18:27 boot.img
-rw-rw-r--.  1 rotake rotake     15524 11月 17 18:48 clean_steps.mk
drwxrwxr-x.  2 rotake rotake      4096 11月 16 22:31 data
drwxrwxr-x.  2 rotake rotake      4096 11月 17 07:17 fake_packages
-rw-rw-r--.  1 rotake rotake     41094 11月 17 18:27 installed-files.txt
-rw-rw-r--.  1 rotake rotake   3825312 11月 17 01:54 kernel
drwxrwxr-x. 14 rotake rotake      4096 11月 17 14:41 obj
-rw-rw-r--.  1 rotake rotake       565 11月 17 18:48 previous_build_config.mk
-rw-rw-r--.  1 rotake rotake    660660 11月 17 18:28 ramdisk-recovery.img
-rw-rw-r--.  1 rotake rotake    322402 11月 17 18:27 ramdisk.img
drwxrwxr-x.  3 rotake rotake      4096 11月 17 18:28 recovery
-rw-r--r--.  1 rotake rotake   4489216 11月 17 18:28 recovery.img
drwxrwxr-x.  9 rotake rotake      4096 11月 17 07:17 root
drwxrwxr-x.  5 rotake rotake      4096 11月 17 18:20 symbols
drwxrwxr-x. 13 rotake rotake      4096 11月 17 09:21 system
-rw-r--r--.  1 rotake rotake 160467136 11月 17 18:28 system.img
-rw-r--r--.  1 rotake rotake 140856312 11月 17 18:27 userdata.img

[コンパイル時のエラーへの対処]

  • ルートファイルシステムに1GB以上の空き領域を確保 Android4.0.1のソースはルートファイルシステムとは別のファイルシステムに置いてコンパイルしたのですが、ルートファイルシステムにも約1GBくらいの領域が必要でした。 (どこに何ができたかわからない。/varの下あたりでしょうか) この空き領域を確保しておかないと、ルートファイルシステムが100%になって、/tmpの下にコンパイル時のテンポラリファイルを作ることができず、エラーとなってしまいます。
  • ホストの開発環境に関する複数のパッケージの追加インストール 私が使っていた環境では足りないパッケージがあり、"yum install パッケージ名"で以下の3つのパッケージを追加でインストールしました。  gperf, glibc-devel.i686, zlib-devel.i686
  • シンボリックリンクの作成 エラー: /usr/bin/ld: cannot find -ltinfo collect2: ld はステータス 1 で終了しました 以下のコマンドでシンボリックリンクを作成 # cd /lib # ln -s libtinfo.so.5 libtinfo.so
  • makeコマンドのバージョン変更 build/core/main.mkでmakeのバージョンが3.81であるかどうかをチェックし、そうでない場合は終了してしまいます。  41行目: ifeq (0,$(shell expr $$(echo $(MAKE_VERSION) | sed "s/[^0-9\.].*//") = 3.81)) ホストのFeddora15のmakeのバージョンが3.82-4だったので、バージョン3.81のパッケージをダウンロードしてインストールしました。  # rpm -ivh --force make-3.81-15.fc11.x86_64.rpm もしかするとmain.mkを書き換えて3.82のままで実行してもうまく行くかも知れないのですが。
  • OpenJDKのチェックを外す build/core/main.mkでJDKのバージョンが1.6.xであるかどうかをチェックし、そうでない場合は終了します。 またOpenJDKの場合は、なぜかそのバージョンにかかわらず、変数java_versionの値をnullにしているので終了してしまいます。 (OpenJDKの使用はダメということなのでしょうか?)  116行目: java_version := $(shell java -version 2>&1 | head -n 1 | grep '^java .*[ "]1\.6[\. "$$]')  117行目: ifneq ($(shell java -version 2>&1 | grep -i openjdk),)  118行目: java_version :=  119行目: endif  120行目: ifeq ($(strip $(java_version)),) 私の場合はFedora15上で、以下の通りOpenJDK1.6.0_22を使っているので、とりあえず、117行目-119行目の先頭に#を付けてコメントにして試してみました。 (ま、私の場合は実験なので)  $ java -version  java version "1.6.0_22"  OpenJDK Runtime Environment (IcedTea6 1.10.4) (fedora-60.1.10.4.fc15-x86_64)  OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)
  • ソースコードを1箇所変更 エラー: frameworks/compile/slang/slang_rs_export_foreach.cpp:247:23: エラー: 変数 ‘ParamName’ が設定されましたが使用されていません [-Werror=unused-but-set-variable] cc1plus: すべての警告はエラーとして取り扱われます 単に、frameworks/compile/slang/slang_rs_export_foreach.cpp の247行目をコメントにしました。 247行目: // llvm::StringRef ParamName = PVD->getName();
  • gtestのAndroid.mkの変更 エラー:
    external/gtest/src/../include/gtest/internal/gtest-param-util.h:122:11: エラー: ‘ptrdiff_t’ does not name a type
    122行目: typedef ptrdiff_t difference_type; difference_typeを定義するヘッダファイルが見つからないのが原因と思われたので、8月にダウンロードしたmasterのソースを参考に、 gtest/src/Android.mkを次のように変更したところ、エラーは解消しました。 37行目: libgtest_host_includes := \ 38行目: $(LOCAL_PATH)/.. \ 39行目: $(LOCAL_PATH)/../include     ↓ 37行目: libgtest_host_includes := \ 38行目: bionic \ 39行目: external/stlport/stlport \ 40行目: $(LOCAL_PATH)/.. \ 41行目: $(LOCAL_PATH)/../include
  • ctsのAndroid.mkの変更 エラー: target Java: CtsVerifier (out/target/common/obj/APPS/CtsVerifier_intermediates/classes) cts/apps/CtsVerifier/src/com/android/cts/verifier/PassFailButtons.java:191: android.app.Activity の onCreateDialog(int,android.os.Bundle) はcom.android.cts.verifier.PassFailButtons.PassFailActivity の onCreateDialog(int,android.os.Bundle) を実装できません。スーパークラスでの定義より弱いアクセス特権 (public) を割り当てようとしました。 private static ^ エラー 1 個 解決が大変そうな感じがあったので、とりあえずctsは取り外してコンパイルを続けることにしました。 cts/Android.mkの全行の先頭に#を付けてコメントにしました。

試しに、ターゲットをGalaxy Nexusとして生成した上記のインストールイメージを、Nexus Sに対してfastbootでflashしてみました。
デバイスのチェックでFailしました。

 Galaxy Nexus のインストールイメージを試した時 (参考) 本来の Nexus S のインストールイメージの時
$ cd < ソースのルート >/out/host/linux-x86/bin $ ./adb reboot bootloader (あらかじめ、次のコマンドでbootloaderのロックを外しておきます。) (# ./fastboot oem unlock ) # ANDROID_PRODUCT_OUT=<ソースのルート>/out/target/product/maguro # export ANDROID_PRODUCT_OUT # ./fastboot devices 313574A56D7B00EC fastboot # ./fastboot -w flashall -------------------------------------------- Bootloader Version...: I9020XXKA3 Baseband Version.....: I9020XXKF1 Serial Number........: 313574A56D7B00EC -------------------------------------------- checking product... FAILED Device product is 'herring'. Update requires 'tuna'. finished. total time: 0.004s $ cd < ソースのルート >/out/host/linux-x86/bin $ ./adb reboot bootloader (あらかじめ、次のコマンドでbootloaderのロックを外しておきます。) ($ ./fastboot oem unlock ) $ ANDROID_PRODUCT_OUT=<ソースのルート>/out/target/product/crespo $ export ANDROID_PRODUCT_OUT $ ./fastboot devices 313574A56D7B00EC fastboot $ ./fastboot -w flashall -------------------------------------------- Bootloader Version...: I9020XXKA3 Baseband Version.....: I9020XXKF1 Serial Number........: 313574A56D7B00EC -------------------------------------------- checking product... OKAY [ 0.001s] checking version-bootloader... OKAY [ 0.001s] checking version-baseband... OKAY [ 0.001s] sending 'boot' (2940 KB)... OKAY [ 0.393s] writing 'boot'... OKAY [ 0.434s] sending 'recovery' (3184 KB)... OKAY [ 0.426s] writing 'recovery'... OKAY [ 0.467s] sending 'system' (96770 KB)... OKAY [ 12.890s] writing 'system'... OKAY [ 13.411s] erasing 'userdata'... OKAY [ 0.223s] erasing 'cache'... OKAY [ 1.677s] rebooting... finished. total time: 29.927s