Android ThingsをRaspberry Pi 3にインストール

# Android Thingsとは？
GoogleのIoT platformとして発表されたもので、
発表時点では

- Intel Edison
- NXP Pico
- Raspberry Pi 3

の3つのハードウェアにインストール可能なOSイメージがGoogleから提供されています。

https://developer.android.com/things/index.html
https://android-developers.googleblog.com/2016/12/announcing-googles-new-internet-of-things-platform-with-weave-and-android-things.html

このページではRaspberry Pi 3にAndroid Thingsをインストールする手順を記載しています
Intel Edisonへの導入は以下の記事をどうぞ。

> Android ThingsをIntel Edison Kit for Arduinoにインストール
> http://qiita.com/aoinakanishi/items/45b950a8e8ec2f0393f5

# ハードウェアの準備

- Raspberry Pi 3
- 電源ケーブル
- HDMIケーブル
- microSD（8G以上）

があれば動くようになります。

# OSイメージのダウンロード
https://developer.android.com/things/preview/download.html
こちらからandroidthings_rpi3_devpreview_1.zipをダウンロードします。

![System Image Downloads](https://qiita-image-store.s3.amazonaws.com/0/129712/e2ad8e0c-9127-af15-3a2b-4520e28a902f.png)

![Terms and Conditions](https://qiita-image-store.s3.amazonaws.com/0/129712/89d8bf15-7b3b-1bf2-be26-7b10493610b2.png)

# zipファイルの解凍
Macでは以下のようなエラーが出て解凍できませんでした。

```
% unzip androidthings_rpi3_devpreview_1.zip
Archive:  androidthings_rpi3_devpreview_1.zip
warning [androidthings_rpi3_devpreview_1.zip]:  76 extra bytes at beginning or within zipfile
  (attempting to process anyway)
error [androidthings_rpi3_devpreview_1.zip]:  reported length of central directory is
  -76 bytes too long (Atari STZip zipfile?  J.H.Holm ZIPSPLIT 1.1
  zipfile?).  Compensating...
   skipping: iot_rpi3.img            need PK compat. v4.5 (can do v2.1)

note:  didn't find end-of-central-dir signature at end of central dir.
  (please check that you have transferred or created the zipfile in the
  appropriate BINARY mode and that you have compiled UnZip properly)
```
どうやら大きなファイルは正しく解凍できないようです。
http://qiita.com/ikai/items/f7f2f31a00cd2279f963

Linux等で作業をするか、リンク先のように

```
tar xvf androidthings_rpi3_devpreview_1.zip
```
とすることで解凍が完了しiot_rpi3.imgというファイルが出力されます。

# microSDにイメージの書き込み
diskutilで現在接続されているディスクのパーティションを確認します

```
% diskutil list
/dev/disk0
   --- 略 ---
/dev/disk1
   --- 略 ---
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.6 GB    disk2
   1:             Windows_FAT_32 NO NAME                 15.6 GB    disk2s1
```

今回使用するmicroSDは16GBのもので/dev/disk2であるという事が確認できましたので、

```
diskutil unmountDisk /dev/disk2
```
としてアンマウントします。

```
% sudo dd bs=1m if=./iot_rpi3.img of=/dev/disk2
4352+0 records in
4352+0 records out
4563402752 bytes transferred in 6783.463400 secs (672725 bytes/sec)
```
でイメージファイルをmicroSDに書き込みます(書き込み完了まで1時間ほどかかりました)

以下のようなダイアログが表示されて書き込み完了です。
![書き込み完了ダイアログ](https://qiita-image-store.s3.amazonaws.com/0/129712/87b38e68-de3d-4dcd-7186-ac188bb452b3.png)

# androidthingsの起動

- LANケーブル
- HDMIケーブル
- 電源ケーブル
- microSD

がRaspberry Pi 3に正しく刺さっている事を確認します。

電源が入ると、昔のテレビのようなホワイトノイズが表示されましたが、暫く経つと以下のような画面に切り替わりました。

![Android Things起動画面](https://qiita-image-store.s3.amazonaws.com/0/129712/10cb0a9a-607c-9150-789a-4145d4450439.jpeg)

二回目以降はホワイトノイズもなく以下のように表示されます
![Loading Android Image](https://qiita-image-store.s3.amazonaws.com/0/129712/c3c5f6e8-2fb4-5909-f94c-9e89ee63fede.jpeg)

![Booting](https://qiita-image-store.s3.amazonaws.com/0/129712/928d7113-8fbe-c0b4-2e2d-3d2d0732da1d.jpeg)

# Android Thingsに接続
OSが起動したら、スクリーン上に表示されたIPアドレスにadbで接続できます。

```
% adb connect 10.***.***.102
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
connected to 10.***.***.102:5555
```

# 起動直後のプロセス一覧
Android Device Monitorを起動すると通常のAndroidデバイスと同様にデバイスの中身が確認できます。
![Android Device Monitor](https://qiita-image-store.s3.amazonaws.com/0/129712/30a2d755-3150-3697-0f1a-fd55c7c988a8.png)

# スクリーンショット
Device Screen Captureでスクリーンショットを撮影したかったのですが、出来ませんでした。
![Device Screen Capture](https://qiita-image-store.s3.amazonaws.com/0/129712/f8f7839e-aa1b-d5c5-1900-1b797e44915e.png)

```
adb shell screencap -p /sdcard/screenshot.png
```
コマンドからも撮影できません。

```
adb shell screenrecord --verbose /sdcard/screenrecord.mp4
```
screenrecordコマンドでは撮影できました↓

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/129712/c39104ba-b06a-ce19-e266-b38a5eca9712.png)

# adb shellでログイン
```
% adb shell
rpi3:/ $ id
uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc) context=u:r:shell:s0
```
一般的なAndroid端末同様に問題なくadb shellできます

# adb rootでルート権限取得
```
% adb root
restarting adbd as root
```
でadbdを再起動し

```
adb connect 10.***.***.102
```
で接続し直すと

```
% adb shell
rpi3:/ # id
uid=0(root) gid=0(root) groups=0(root),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats),3009(readproc) context=u:r:su:s0
```
rootでログインすることが出来ました

# Wifi設定
https://developer.android.com/things/hardware/raspberrypi.html#connecting_wi-fi
ここにあるとおり

```
$ adb shell am startservice \
    -n com.google.wifisetup/.WifiSetupService \
    -a WifiSetupService.Connect \
    -e ssid <Network_SSID> \
    -e passphrase <Network_Passcode>

Starting service: Intent { act=WifiSetupService.Connect cmp=com.google.wifisetup/.WifiSetupService (has extras) }
```
のコマンドを実行するとWifiに接続できます
![Screen Shot 2016-12-30 at 03.04.13.png](https://qiita-image-store.s3.amazonaws.com/0/129712/167224c1-233a-ea65-5d4c-bc6384bad457.png)
次回起動以降は自動で同じアクセスポイントに接続されます

# アプリのインストールと起動
Android Studioを使ってEmpty Activityなプロジェクトを作ります。
ビルドしてRunするだけで通常のAndroidアプリと同様にActivityが起動します。
![Hello Android Things](https://qiita-image-store.s3.amazonaws.com/0/129712/488d1deb-0d75-c011-fad0-a4613cae5ebc.png)
Instant Runも問題なく動きます。軽く触った印象としては通常のアプリ開発と変わらないです。

# アプリの終了（ホーム画面に戻す）

バックボタンイベントを発行

```
adb shell input keyevent KEYCODE_BACK
```

ホームボタンイベントを発行

```
adb shell input keyevent KEYCODE_HOME
```

強制終了

```
adb shell am force-stop <パッケージ名>
```

# デフォルトでインストールされているパッケージ一覧

```
% adb shell pm list package
package:com.android.providers.telephony
package:com.android.providers.calendar
package:com.android.providers.media
package:com.android.externalstorage
package:com.android.htmlviewer
package:com.android.providers.downloads
package:com.google.android.iot.frameworkpackagestubs
package:com.android.defcontainer
package:com.android.pacprocessor
package:com.google.wifisetup
package:com.android.certinstaller
package:android
package:com.android.mtp
package:com.android.backupconfirm
package:com.android.provision
package:com.android.statementservice
package:com.android.providers.settings
package:com.android.sharedstoragebackup
package:com.android.webview
package:com.android.inputdevices
package:android.ext.shared
package:com.android.onetimeinitializer
package:com.android.keychain
package:com.google.android.gms
package:com.google.android.gsf
package:com.google.android.tts
package:android.ext.services
package:com.google.android.things.permissions
package:com.android.packageinstaller
package:com.android.proxyhandler
package:com.android.managedprovisioning
package:com.android.settings
package:com.android.iotlauncher
package:com.android.shell
package:com.android.wallpaperbackup
package:com.android.providers.userdictionary
package:com.android.location.fused
package:com.android.bluetoothmidiservice
package:com.android.bluetooth
package:com.android.providers.contacts
```

デフォルトのホーム画面はcom.android.iotlauncherのようです。