BeagleBone BlackにAndroidをインストールする

# BeagleBone BlackにAndroidをインストールする

　この記事は、[Androidアドベント・カレンダー](http://qiita.com/advent-calendar/2013/android)の12月２日分の記事です。


## BeagleBone Blackとは

　BeagleBone Blackは、5000円以下で購入できる名刺サイズのボードです。
　beagleboad.orgによって、オープンハードウエアとして開発されており、日本でも簡単に入手できます。
　SoCにARM Cortex-A8 1GHzのTI AM335xを採用していて、DRAMも512MB搭載されています。
　手のひらに乗るような、とても小さなボードですが、Androidだけでなく、UbuntuやDebianなどのLinux環境も動作させることもできます。出荷状態では、Linuxディストリビューションとして、Angstromがインストールされています。
　世間では、RasPiが人気ですが、価格は数百円差で、動画の再生をする場合を除いては、トータルなパフォーマンスはBeagleBone Blackのほうに分があります。

　BeagleBone Blackについての詳細な情報は、以下のサイトを見てみてください。

* [beagleboard.orgのBeagleBone Blackページ](http://beagleboard.org/Products/BeagleBone%20Black)
* [BeagleBone BlackでAndroidの下回りを学ぼう (公開版)](http://www.slideshare.net/kinneko/beaglebone-blackandroid)
* [BeagleBone Black Breakers](https://github.com/kinneko/BBBB/wiki)

　日経Linuxなどの記事で常連の米田さんによる書籍も出ています。

* [「BeagleBone-Blackで遊ぼう」](http://www.amazon.co.jp/dp/4899773935)


## Androidのインストール

　BeagleBone Blackに、Androidをインストールしてみましょう。

　作業環境はUbuntu 12.04を使っています。

　一番シンプルな方法は、SoC製造元のTIで配布しているバイナリを、SDカードに焼いて起動することです。
　TIでは、BeagleBone Blackを対象に、AM335xについてのサポートページの中で、自社製のボードと同様のサポート情報を提供しています。
　TIのサポートページは、日本語のページもありますが、情報が少ないので英語ページを見ます。

* [TIの日本語ページ](http://www.tij.co.jp/tool/jp/androidsdk-sitara)
* [TIの英語ページ Android Development Kit for Sitara Microprocessors](http://www.ti.com/tool/androidsdk-sitara)


### ビルド済みイメージファイルの取得

　英語のページから、以下のDev Kitのページを開きます。現在の最新版は、Android  4.2.2です。

* [ANDROIDEVKIT-JB-AM335X: Android Jelly Bean 4.2.2 - Dev Kit for AM335x](http://downloads.ti.com/sitara_android/esd/TI_Android_DevKit/TI_Android_JB_4_2_2_DevKit_4_1_1/index_FDS.html)

　ページの下のほうに、"Pre-built Images"の項目があり、そこに[BeagleBone Blackのリンク](http://downloads.ti.com/sitara_android/esd/TI_Android_DevKit/TI_Android_JB_4_2_2_DevKit_4_1_1/exports/TI_Android_JB_4.2.2_DevKit_4.1.1_beagleboneblack.tar.gz)がありますので、そこをクリックしてダウンロードします。ここでは、wgetコマンドを使ってダウンロードしました。

```
~$ mkdir bbb
~$ cd bbb
~/bbb$ wget http://downloads.ti.com/sitara_android/esd/TI_Android_DevKit/TI_Android_JB_4_2_2_DevKit_4_1_1/exports/TI_Android_JB_4.2.2_DevKit_4.1.1_beagleboneblack.tar.gz
```

　ダウンロードしたアーカイブを展開します。展開してできたbeagleboneblackを見てみましょう。

```
~/bbb$ tar zxf ../TI_Android_JB_4.2.2_DevKit_4.1.1_beagleboneblack.tar.gz
~/bbb$ cd beagleboneblack/
~/bbb/beagleboneblack$ ls
Boot_Images  Filesystem  Media_Clips  README.txt  START_HERE  mkmmc-android.sh
```

　ディレクトリが４つと、README、実行用のシェルスクリプトファイルが入っています。それぞれの内容を見てみましょう。

　Boot_Imagesディレクトリには、４つのファイルが入っています。

```
~/bbb/temp/beagleboneblack$ cd Boot_Images/
~/bbb/temp/beagleboneblack/Boot_Images$ ls
MLO  u-boot.img  uEnv.txt  uImage
```

　MLOは、初期起動プログラムです。MLOは、第二弾のブートローダーであるu-boot.imgをロードして起動します。uEnv.txtは、u-boot用の設定ファイルです。uImageは、u-bootから起動するLinux kernelで、u-bootから起動できるようにヘッダが付けられたものです。


　Filesystemディレクトリには、rootfs.tar.bz2が１つだけ入っていました。これは、Androidのrootファイルシステムのアーカイブです。

```
~/bbb/temp/beagleboneblack/Boot_Images$ cd ../Filesystem/
~/bbb/temp/beagleboneblack/Filesystem$ ls
rootfs.tar.bz2
```

　Media_Clipsディレクトリには、画像、音声、動画などのサンプルファイルが入っています。

```
~/bbb/temp/beagleboneblack/Filesystem$ cd ../Media_Clips/
~/bbb/temp/beagleboneblack/Media_Clips$ ls
Audio  Images  Video
```

　START_HEREディレクトリには、UserGuideのHTMLファイルが入っています。

```
~/bbb/temp/beagleboneblack/Media_Clips$ cd ../START_HERE/
~/bbb/temp/beagleboneblack/START_HERE$ ls
Setup.htm  Setup_files
```

　README.txtには、SDカードや、内蔵eMMCへのAndroidの書き込み方法が書かれてます。基本的には、mkmmc-android.shスクリプトで行います。

> README for preparing SD/MMC/Micro-SD CARD for booting Android
> 
> Pre-Requesites
> --------------
> 1) Need to have an SD/MMC/Micro-SD card with atleast 2GB of size.
> 2) The script needs to be invoked from ubuntu linux machine 8.04 or above.
> 3) User needs to have sudo privileges.
> (略)


### ビルド済みイメージファイルをSDカードに書き込む

　インストール用のmicroSDカードを用意します。容量は2GB以上のものが必要です。ここでは8GBのものを用意しました。

　microSDカードは、USBカードリーダーに差し込んで、PCに差し込みます。dmesgコマンドの出力を見ると、認識したデバイス名がわかります。この場合、sdcとして認識しています。

```
[ 7255.526629] scsi 2:0:0:0: Direct-Access     Generic  STORAGE DEVICE   9404 PQ: 0 ANSI: 0
[ 7255.529122] sd 2:0:0:0: Attached scsi generic sg2 type 0
[ 7255.638698] sd 2:0:0:0: [sdc] 15278080 512-byte logical blocks: (7.82 GB/7.28 GiB)
[ 7255.640317] sd 2:0:0:0: [sdc] Write Protect is off
[ 7255.640328] sd 2:0:0:0: [sdc] Mode Sense: 03 00 00 00
[ 7255.641933] sd 2:0:0:0: [sdc] No Caching mode page present
[ 7255.641944] sd 2:0:0:0: [sdc] Assuming drive cache: write through
[ 7255.647113] sd 2:0:0:0: [sdc] No Caching mode page present
[ 7255.647123] sd 2:0:0:0: [sdc] Assuming drive cache: write through
[ 7255.649898]  sdc: sdc1
[ 7255.654226] sd 2:0:0:0: [sdc] No Caching mode page present
[ 7255.654237] sd 2:0:0:0: [sdc] Assuming drive cache: write through
[ 7255.654243] sd 2:0:0:0: [sdc] Attached SCSI removable disk
```

　インストールスクリプトは、日本語シェル環境ではうまく動作しないので、まずは設定を変更しておきます。sdcへの書き込みを行います。

```
~/bbb/temp/beagleboneblack$ export LANG=C
~/bbb/temp/beagleboneblack$ sudo ./mkmmc-android.sh /dev/sdc
```

　sudoのパスワード確認の後、sdcで間違いないか確認が出ます。間違いなければ、yとリターンを入れます。書き込みにはやや時間がかかります。

```
Assuming Default Locations for Prebuilt Images
All data on /dev/sdc now will be destroyed! Continue? [y/n]
y
[Unmounting all existing partitions on the device ]
umount: /dev/sdc: not mounted
umount: /dev/sdc1: not mounted
[Partitioning /dev/sdc...]
Disk /dev/sdc doesn't contain a valid partition table
DISK SIZE - 7822376960 bytes
CYLINDERS - 951
[Making filesystems...]
[Copying files...]
[Copying START_HERE folder to boot partition]
[Done]
```

　Doneが表示されたら作業は終わりです。


### Android起動用SDカードの内容

　作成したSDカードの中身を見てみましょう。

```
$ sudo fdisk -l /dev/sdc

Disk /dev/sdc: 7822 MB, 7822376960 bytes
255 heads, 63 sectors/track, 951 cylinders, total 15278080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1   *          63      144584       72261    c  W95 FAT32 (LBA)
/dev/sdc2          144585     3951989     1903702+  83  Linux
/dev/sdc3         3951990     7759394     1903702+  83  Linux
/dev/sdc4         7759395    15277814     3759210    c  W95 FAT32 (LBA)
```

　中は４つのパーティションに分かれています。

* sdc1: 起動用のパーティション
* sdc2: rootfs: Androidのシステム
* sdc3: usrdata Android用の内蔵データ領域
* sdc4: data AndroidのSDカード相当の外部データ領域

　sdc1の内容は、起動ファイル以外にも、START_HEREディレクトリがコピーされていました。u-bootの設定ファイルの中も見ておきます。

```
$ sudo mount /dev/sdc1 /media
$ ls /media/
MLO  START_HERE  u-boot.img  uEnv.txt  uImage
$ cat /media/uEnv.txt
bootargs=console=ttyO0,115200n8 androidboot.console=ttyO0 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait init=/init ip=off
bootcmd=mmc rescan ; fatload mmc 0 81000000 uImage ; bootm 81000000
uenvcmd=boot
$ sudo umount /media/
```

　sdc2の内容は、rootfs.tar.bz2が展開されたものです。

```
$ sudo mount /dev/sdc2 /media
$ ls /media/
data             init.am335xevm.rc      init.usb.rc  system
default.prop     init.am335xevm.usb.rc  lost+found   ueventd.am335xevm.rc
dev              init.goldfish.rc       proc         ueventd.goldfish.rc
fstab.am335xevm  init.rc                sbin         ueventd.rc
init             init.trace.rc          sys
$ sudo umount /media/
```

　sdc3の内容は、からっぽです。

```
$ sudo mount /dev/sdc3 /media
$ ls /media/
lost+found
$ sudo umount /media
```

　sdc4の内容は、Media_Clipsディレクトリの内容がコピーされていました。

```
$ sudo mount /dev/sdc4 /media
$ ls /media/
Audio  Images  Video
$ sudo umount /media
```


## BeagleBone BlackでAndroidを起動する

　BeagleBone Blackに、作成したmicroSDカードを挿入し、microHDMI-HDMIアダプタを接続し、HDMIモニタに接続します。今回はUSB給電するため、付属のminiUSBから給電接続します。

　ANDROIDロゴが表示されて、Androidが起動します...

　ロゴループして起動しないじゃん... orz

　と、思ったら、初回起動にえらく時間がかかっただけでした。気長に待ってください。

![boot](https://lh3.googleusercontent.com/-yDNHDBLfSI0/UpyKkvrSh1I/AAAAAAAAHME/eiL8wf5Qjlg/boot.png)

　起動してしまえば、あとは普通にAndroidです。マウスやキーボードをつないで使ってみてください。