トップページ 組込みソフト Linux搭載ボード Android OSのビルド

Android OSのビルド
 Androidの開発はソースファイルからAndroid OSをビルドするという面倒なことが必要です。Linuxならsudo suで管理者になって必要なことができます。ところがAndroidでは一般ユーザーの権限しかないので、管理者権限でアクセスするような処理ができません。そこであらかじめ一般ユーザーでもやりたいことができるように、たとえばファイルの権限をあらかじめユーザー権限でもできるようにしておくことが必要になります。

Ubuntu12.04 64ビット
をVirtual Boxで使うことにしました。本当は、ハードディスクのパーティションをWindow/Ubuntu 12.04 64ビットで環境を構築してありますが、やはりWindowsとUbuntuでコピペができるのは便利なのと、Virtual Boxで動作が遅くなることがないようなのでもう一度Android用にUbuntuをインストールしました。

ビルドの方法は、この本を参考にしました。

しかし、間違いが多すぎます。
極めつけはこれ!

書いてあるとおりにやるとダメです。
LANG=C
をつけないとダメ。
Ubuntuを英語でやってくれ。とはどこにも書いてありません。また、記事の途中でLANG=Cがあるので、Ubuntuは日本語と思ってしまいます。(わざわざ英語にする人はあまりいないでしょう!)

この本の元ねたは
TI-Android-JB-4.2.2-DevKit-4.1.1 DeveloperGuide
のように思います。(あとでわかったことです。)英語で記述されています。
この本の最大の欠点!
l(エル)と1(壱)の違いがほとんどわかりません。l(エル)と1(壱)の違いを明確にするのはこの業界では常識ですよね。また、元ねたのURLを書いておけばそこからコピペすればOKで済むところを...
.本をよーーーく見てキーボードで打ち込みしました。そして失敗も...
正誤表も少しはあるようですが、ぜんぜん足りないです。著者や編集者がちゃんと記事をチェックしてば、こんなに余計な時間を費やさないですみました。オラは本のチェック要員じゃないぞ!
というわけで再度同じことやるのにこの本を元にしたら、また同じ記事の間違いで時間を浪費することを避けるため、備忘録的にメモしておきます。
JDKのインストール
jdk-6u45-linux-x64.bin
をダウンロードします。
ホームディレクトリ(sunaga)直下に置きます。
sunaga@android:~/share$ cp jdk-6u45-linux-x64.bin ~/
sunaga@android:~/share$ cd ~/
sunaga@android:~$ ls
examples.desktop ダウンロード ドキュメント ミュージック
jdk-6u45-linux-x64.bin テンプレート ビデオ 公開
ホームディレクトリにコピーできました。
jdk-6u45-linux-x64.binに実行権限を与え解凍します。
sunaga@android:~$ chmod a+x jdk-6u45-linux-x64.bin
sunaga@android:~$ ./jdk-6u45-linux-x64.bin
sunaga@android:~$ ls
examples.desktop share デスクトップ ピクチャ
jdk-6u45-linux-x64.bin ダウンロード ドキュメント ミュージック
jdk1.6.0_45 テンプレート ビデオ 公開
jdk1.6.0_45のフォルダに解凍されています。
Virtual BoxでBeagle Bone BlackのAndroid組込み専用に作成したUbuntuなのでTIの解説にしたがって/usr/lib/jvm にコピーして設定をします。
sunaga@android:~$ sudo mkdir -p /usr/lib/jvm

sunaga@android:~$ sudo mv jdk1.6.0_45 /usr/lib/jvm/

sunaga@android:~$ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.6.0_45/bin/java" 1

sunaga@android:~$ sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.6.0_45/bin/javac" 1

sunaga@android:~$ sudo update-alternatives --config java

sunaga@android:~$ sudo update-alternatives --config javac
これでJAVAの設定が終わりです。
確認します。
sunaga@android:~$ java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
ビルドに必要なソフトウェア
Ubuntuのバージョンによって違います。気をつけてください。
Ubuntu12.04 64bitのソフトを取得します。
sunaga@android:~$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 minicom tftpd uboot-mkimage expect libgl1-mesa-dri
以下のパッケージには満たせない依存関係があります:
libgl1-mesa-glx:i386 : 依存: libglapi-mesa:i386 (= 8.0.4-0ubuntu0.7)
推奨: libgl1-mesa-dri:i386 (>= 7.2)
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
ibgl1-mesa-glx:i386

libgl1-mesa-dri:i386
で書き換えます。
sunaga@android:~$sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dri:i386 libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 minicom tftpd uboot-mkimage expect libgl1-mesa-dri
sunaga@android:~$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
ソースコードの取得
Repoコマンドをするためディレクトリを作成して、パスを通します。
sunaga@android:~$ mkdir ~/bin
.export PATH=~/bin:$PATH
ダウンロードします。
TIのページにある方法でやってみました。
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ mkdir $HOME/rowboat-android
$ cd $HOME/rowboat-android
$ repo init -u git://gitorious.org/rowboat/manifest.git -m TI-Android-JB-4.2.2-DevKit-4.1.1.xml
$ repo sync
ダメでした。
Interface (インターフェース) 増刊 Linuxガジェット BeagleBoneBlackでI/O 2014年 03月号
に記載されている方法でやってみるとOKです。
sunaga@android:~$ chmod a+x ~/bin/repo
sunaga@android:~$ mkdir $HOME/src-android
sunaga@android:~$ cd $HOME/src-android
sunaga@android:~/src-android$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
sunaga@android:~/src-android$ repo init -u git://gitorious.org/rowboat/manifest.git -m rowboat-jb-am335x.xml
sunaga@android:~/src-android$ repo sync
$HOME/src-android
上記ディレクトリにソースファイルが取得できました。
ビルド
ツールチェインにパスを通します。
sunaga@android:~/src-android$ export PATH=$HOME/src-android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH
ブートローダのビルド
sunaga@android:~/src-android$ cd ~/src-android/u-boot

sunaga@android:~/src-android/u-boot$ make CROSS_COMPILE=arm-eabi- distclean

sunaga@android:~/src-android/u-boot$make CROSS_COMPILE=arm-eabi- am335x_evm_config

sunaga@android:~/src-android/u-boot$ make CROSS_COMPILE=arm-eabi-
カーネルのビルド
sunaga@android:~/src-android/u-boot$ cd ~/src-android/kernel

sunaga@android:~/src-android/kernel$ make ARCH=arm CROSS_COMPILE=arm-eabi- distclean

sunaga@android:~/src-android/kernel$ make ARCH=arm CROSS_COMPILE=arm-eabi- am335x_evm_android_defconfig

sunaga@android:~/src-android/kernel$ make ARCH=arm CROSS_COMPILE=arm-eabi- uImage
ユーザランドのビルド
これは2時間くらいはかかります。
sunaga@android:~/src-android/kernel$ cd ~/src-android
sunaga@android:~/src-android$ make TARGET_PRODUCT=beagleboneblack droid
JDKのバージョンが違うと怒られたら、次のコマンドで
sunaga@android:~/src-android$ sudo update-alternatives --config java
sunaga@android:~/src-android$ sudo update-alternatives --config javac
Java 1.6を選んで、再度チャレンジ!
SGXのビルド
sunaga@android:~$ cd ~/src-android/hardware/ti/sgx

sunaga@android:~$ make TARGET_PRODUCT=beagleboneblack OMAPES=4.x ANDROID_ROOT_DIR=$HOME/src-android

sunaga@android:~$ make TARGET_PRODUCT=beagleboneblack OMAPES=4.x ANDROID_ROOT_DIR=$HOME/src-android install
ユーザランドのパッケージ化
sunaga@android:~/src-android$ cd $HOME/src-android

sunaga@android:~/src-android$ make TARGET_PRODUCT=beagleboneblack fs_tarball
SDカードに書き込む
Virtual Boxを使っているときの注意:
SDカードに書き込むとき

USBカードリーダーにチェックをいれてください。
SDカードに外すとき、
USBカードリーダーにチェックを外してください。
sunaga@android:~$ mkdir $HOME/image-folder

sunaga@android:~$ cp /home/sunaga/src-android/kernel/arch/arm/boot/uImage $HOME/image-folder

sunaga@android:~$ cp /home/sunaga/src-android/u-boot/MLO $HOME/image-folder

sunaga@android:~/image-folder$ cp /home/sunaga/src-android/u-boot/u-boot.img $HOME/image-folder

sunaga@android:~$ cp /home/sunaga/src-android/external/ti_android_utilities/am335x/u-boot-env/uEnv_beagleboneblack.txt $HOME/image-folder

sunaga@android:~$ cp /home/sunaga/src-android/out/target/product/beagleboneblack/rootfs.tar.bz2 $HOME/image-folder

sunaga@android:~$ cp /home/sunaga/src-android/external/ti_android_utilities/am335x/mk-mmc/mkmmc-android.sh

$HOME/image-folder

sunaga@android:~/image-folder$ LANG=C

sunaga@android:~/image-folder$ sudo ./mkmmc-android.sh /dev/sde MLO u-boot.img uImage uEnv_beagleboneblack.txt rootfs.tar.bz2