Google Brillo をビルドして DragonBoard にインストールする


DragonBoardにBrilloを入れよう！

マイコンボードにしては箱がカッチョいい．Adobeみたいだ．
[![https://gyazo.com/eba989162ed47942cea96af5fb3da851](https://i.gyazo.com/eba989162ed47942cea96af5fb3da851.png)](https://gyazo.com/eba989162ed47942cea96af5fb3da851)

謎のマークがついていてうさんくさい．
[![https://gyazo.com/5e67efafe3c7cf0a9a6b3350acad0a80](https://i.gyazo.com/5e67efafe3c7cf0a9a6b3350acad0a80.png)](https://gyazo.com/5e67efafe3c7cf0a9a6b3350acad0a80)



# 1. 概要
GoogleのIoT向けOSである[Brillo](https://developers.google.com/brillo/)をボードにインストールする方法について説明する．ボードはBrilloが公式でサポートしているDragonBoardを使う．Brilloとはなんぞやという話については，[UbiquityでのBrilloセッション](https://ubiquity.withgoogle.com)を見てもらうと早いとおもう．DalvikVMとかを持たない，軽量なAndroidくらいのイメージ．アプリ相当のものはHALを使ってデーモンとして書いていくんだと思う．
  
ここではあくまでBrilloをビルドしてボードにインストールするところまでを行う．そのため，Wi-Fi，Bluetooth，GPIO等の外部インタフェースや，weaveを利用したやりとりなどはここでは説明しない．

# 2. 利用環境
## 2.1 DragonBoardの準備
- 本体：[チップワンストップ](http://sp.chip1stop.com/dragonboard410c/?cid=c1stop_bn_dragonboard410c)か，[スイッチサイエンス](https://www.switch-science.com/catalog/2577/)で買うことができる．
- 電源：12V2Aが推奨されていた．amazonで適当に検索して買う．ぼくは[これ](http://www.amazon.co.jp/dp/B00AJDAPM6)を使ってる．
- DCプラグの変換ケーブル：DragonBoardでは一般的なPL03Bではなく，少し細いEIAJ3が利用されているのでこれを買う．これも[スイッチサイエンス](https://www.switch-science.com/catalog/2546/)で取り扱いがある．
- デバッグ用のUSB-Microケーブル

## 2.2 クロスビルド用環境
- Ubuntu 15.10 
    - VMでいいんだけど，最初のビルド終えた時点で60GBくらいになるし，すぐ100GB近くなるので，外付けSSDとかを用意しとくといいと思う．

# 3. インストール手順
## 3.1 依存ライブラリの準備
クロスビルド環境や，ボードへイメージをインストールする際に利用するライブラリを導入する．Ubuntu 15.10ではほとんどがapt経由で導入可能なのでとても楽ちん．
Brillo-m9のビルドにはJDK7を用いる．

```以下，Ubuntuで実施
$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk
$ sudo apt-get install git-core gnupg flex bison gperf build-essential   zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386   lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache   libgl1-mesa-dev libxml2-utils xsltproc unzip
$ sudo apt-get install android-tools-adb android-tools-fastboot
$ wget -S -O - http://source.android.com/source/51-android.rules | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules

// gitアカウントの設定
$ git config --global user.user "user"
$ git config --global user.email "user@mail.com"

// repoコマンドの導入
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ echo $PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
```

## 3.2 Brilloのソースもってくる
Brilloのソースをさきほど導入したrepoコマンドを使って持ってくる．AOSPのビルドやったことある人ならわかると思うけどめっちゃ時間かかるので，別のことして待ってましょ．

```Ubuntuで実施
// 作業用ディレクトリ作成
$ mkdir build_brillo
$ cd build_brillo
// ここでは，2016年2月26日での最新版であるm9-releaseブランチからソースをもってくることとする．
$ repo init -u https://android.googlesource.com/brillo/manifest -b brillo-m9-release
$ repo sync -j<ジョブ数>
```

## 3.3 ボードごとの依存ファイルもってくる
実機にインストールする際には，各ボードごとのハードウェア等に起因する依存ファイルが必要になる．
これはbrunchコマンドで持ってくることができる．  
brunchは，Brillo向けに追加されたコマンドで，イメージを作成・管理するために必要ないろいろな作業が行えるコマンド．くわしいことはhelpやソースを参照．

```Ubuntuで実施
// 対応済みボードのリストが確認できる
$ ./tools/bdk/brunch/brunch bsp list
// ここではdragonboard用のものを導入する
$ ./tools/bdk/brunch/brunch bsp install dragonboard
```

# 3.4 ビルド
3.3でも述べたように，Brilloのイメージを管理するための *brunch* というコマンドが追加されている．なのでビルド方法は従来通りの方法と，brunchを利用した方法の２つがある．
あるのだが，brunchを利用したビルドは36時間経っても終わらなかったので諦めてしまった……
というわけでぼくは従来どおりの方法でビルドしている．

### 3.4.1 従来どおりの方法
初回ビルドは，ジョブ数4で3時間くらいだった．

```Ubuntuで実施
$ source build/envsetup.sh 
// lunchでは，dragonboard-engを選択．
$ lunch
// ビルドの際にninjaを使うので環境変数へ設定しておく
$ export USE_NINJA=true
$ make -j<ジョブ数>
```

## 3.4.2 brunchコマンドを使った方法
brunchを使ったビルド方法はおそらく以下の方法．ビルドがまったく終わる気配がないのでこれでいいのか自信がない…
けど，この方法だとプロダクトごとに管理するのが楽ちんそう．ぜひ使えるようになりたい．
brunch build ではジョブ数指定するオプションが見当たらなかったんだけど，なんかもうそういう問題じゃない感じがする．特にエラーが出てなくて，CPUの使用率も100%近くのまま変化してないのがまたよくわからない．

```Ubuntuで実施
$ cd tools/bdk/brunch
$ ./brunch product create my_brillo dragonboard
$ cd my_brillo
$ ../brunch product envsetup
$ ../brunch product build -b eng
```

# 4. ボードへインストールする
ボードのUSB-Microポートを使ってUbuntuにボードを接続する．ボードをfastboot状態にしてからインストールスクリプト（protivsion-device）を実行するとインストールプロセスが実行される．ぼくの環境だとデフォルトのままだとディレクトリの指定がおかしく，インストール作業が途中で終了してしまったので，そこだけ修正した．具体的には， **$OS** と， **$VENDOR** がおかしかった．

```Ubuntuで実施
// デバイスの確認
$ sudo adb devices
// ボードをfastboot状態にする
$ sudo adb reboot-bootloader
// fastboot状態のデバイス一覧から確認
$ sudo fastboot devices
// インストールスクリプトの実行
$ sudo ./device/qcom/dragonboard/provision-device
// fastbootをぬけて再起動する
$ sudo fastboot reboot
```


# 5. 確認
インストールが完了したら，ADBで接続して確認する．

```Ubuntuで実施
$ sudo adb devices
$ sudo adb shell
```

なんかこう，Brilloホントにはいってるのかよくわからないんだけど，weavedとかが動いてたりするので，お〜〜〜なるほど〜〜〜〜ってなる．

```adb_shellで実施
$ ps | grep weave
```

なんかこう，Brilloホントにはいってるのかよくわからないんだけど，weavedとかが動いてたりするので，お〜〜〜なるほど〜〜〜〜ってなる．
あとconfigファイルちょっといじるか〜〜〜と思ってもviすら入ってない．Immutable Infrastructure みたいな言葉がよぎるけど，デバッグ時とかめんどくさくないですか……

# 今後
大きく２つの方向で探ってきたい
1. Brilloから他のインタフェースを制御する．
2. Weaveを使って他のデバイス，サーバと連携する．

ひとまず次回以降は，以下について書く予定．
- DragonBoard上のLEDを使ったLチカ
- GPIOを使ったIN/OUT制御

[![img](http://img.youtube.com/vi/S9V5e2yphVg/0.jpg)](http://www.youtube.com/watch?v=AT8g4JoFUvg)
[![img](http://img.youtube.com/vi/AT8g4JoFUvg/0.jpg)]
(http://www.youtube.com/watch?v=S9V5e2yphVg)