Raspberry Pi3によるAndroid Things入門

昨年の暮にGoogleがIoT向けに[Android Things](https://developer.android.com/things/index.html)を発表して、[Developer Preview](https://developer.android.com/things/preview/index.html) 1をリリースしました。
[Announcing updates to Google’s Internet of Things platform: Android Things and Weave](https://android-developers.googleblog.com/2016/12/announcing-googles-new-internet-of-things-platform-with-weave-and-android-things.html)

現在、[Brillo](https://developers.google.com/brillo/)のリンクをたどるとAndroid Thingsに行き着くことからわかるとおり、Android ThingsはBrilloがフィードバックして、装いを新たに生まれ変わったものです。Android StudioやSDKなどの開発環境や、Google PlayやGoogle Cloud Platformなどのサービスといった、既存の環境を利用して開発できるのが強みです。

遅ればせながら、Raspberry Pi3にインストールしてAndroid Thingsを試してみたので、まとめておきます。

## 概要

Android Thingsサイト([Apache 2.0 license](http://www.apache.org/licenses/LICENSE-2.0))の[Overview](https://developer.android.com/things/sdk/index.html)の咀嚼と補足です。プラットフォームアーキテクチャ図を転載します。

![Android Things Platform Archtecture](https://developer.android.com/things/images/platform-architecture.png)

- Android Thingsは、性質上１つのアプリを実行できればいいように簡素化されています。
- 標準的なシステムアプリやプロバイダーなどもありません。
- Android Thingsでは、コアなAndroid Frameworkに、周辺機器やドライバを制御するためのThings Support Libraryを追加しています。
- Things Support Libraryは、センサーや装置などとGPIO/PWM/I2C/SPI/UARTを介して通信するための[Peripheral I/O API](https://developer.android.com/things/sdk/pio/index.html)と、アプリがハードウエアイベントを発行し、そのほかのアプリが標準のAndroid APIを使用してそれらを処理できるようにAndroidフレームワークの既存のServiceを拡張した[User Driver API](https://developer.android.com/things/sdk/drivers/index.html)からなります。

具体的なクラスについては、[Release Notes](https://developer.android.com/things/preview/releases.html)からJavadocをダウンロードして確認できます。

- Android Thingsでは、ヘッドレスな機器の開発もありますので、ディスプレイはオプショナルです。
- しかし、GUIもサポートしていて、ディスプレイ付きの構成であれば、通常のAndroidアプリと同じようにUI toolkitを利用可能です。
- これも構成によりますが、キーイベントやモーションイベントなどを受け取れるとは限りません。

> あえて書くのもなんですが、Raspberry Pi3はディスプレイ表示や、キーイベントやマウスイベントを受け取ることができます。

- Android Thingsは、エントリポイントとして、DEFAULTカテゴリとITO_LAUNCHERカテゴリを持つ"ホームアクティビティ"が１つだけ存在することを期待しています。

```
    <activity android:name=".HomeActivity">
        <!-- Launch activity as default from Android Studio -->
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>

        <!-- Launch activity automatically on boot -->
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.IOT_LAUNCHER"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
```

> アクティビティ名がHomeActivityである必要はありません。

コメントにあるとおり、少なくとも現状Android Studioから実行するためには、通常のLAUNCHERカテゴリの記述もないと"Default Activity not found"で起動できませんが、`adb install `や`./gradlew installDebug`でインストールして、OFF->ONしたり、アクティビティ起動する分には不要です。

```
$ adb install YourApp.apk
（電源OFF->ON）
```

```
$ ./gradlew installDebug
$ adb shell am start com.your.package.of.app/.YourActivity
```

複数のアプリがインストールされた（＝Android Studioで複数アプリを実行した）状態でOFF->ONすると、Raspberry Pi3は"Complete action using"と起動するアプリを選択するダイアログが開き、キーボードやマウスで選択して起動可能です。ログには、最初に見つけたアプリを起動すると出ていますので、ヘッドレスな環境では恐らくそのように実装されるのだと思います。

```
01-07 08:28:46.992   644   644 W IoTLauncher: Multiple applications with launcher intent found. Launching first found
```

どちらにしても、`adb uninstall`後のOFF->ONで解消されます。

```
$ adb uninstall com.your.package.of.app
（電源OFF->ON）
```

- Google APIs for Androidのサブセットをサポートしています。概して、ユーザ入力や認証を伴うAPIは利用できません。

- 実行時の承認要求は、組込機器が必ずしもUIを備えているとは限らないため、サポートしていません。

- システムワイドなステータスバーとブラインド表示がないため、ノティフィケーションはサポートしていません。

## Raspberry Pi3インストール手順
といっても、[ここ](https://developer.android.com/things/preview/download.html)からイメージをダウンロードして、Raspbianなどのimageと同じようにSDカードに書いて[インストール](https://www.raspberrypi.org/documentation/installation/installing-images/)するだけです。

あとは、ディスプレイをHDMIにさして、LANケーブルをつなぎ、電源を入れます。起動し終わりますと、ディスプレイにIPアドレスが表示されていますので、adbで接続します。

```
$ adb connect <ip-address>
connected to <ip-address>:5555
```

マルチキャストDNSに対応していれば、IPアドレスの代わりに、Android.localでもつながります。

```
$ adb connect Android.local
```

以降、WiFiで接続したい場合は、設定しておきます。

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

IPアドレスは新たに割り当てられます。

## サンプル実行

「[Android Things 用の空のプロジェクトの作り方](http://qiita.com/KazuyukiEguchi/items/7f90d03b5768fb646afd)」が参考になります。

一応、いくつか補足しますと、

- Developer PreviewのAPIバージョンが24であるため、minSDKは24（、もしくはそれ以下）を設定しています。

- 氏の目的が「最小のプロジェクト」で動作を理解することにあるためにあえてそうされているだけであり、ディスプレイ付きのRaspberry Pi3では、LayoutやAppCompatを指定したりして表示することは可能です。

サイトにも[サンプル](https://developer.android.com/things/sdk/samples.html)がいくつか用意されており、[GitHub](https://github.com/androidthings)からソースを落として試せます。いくつかパーツもポチりましたので、届いたらまた試してみて報告できたらと思います。