Android Things 上で Xamarin.Android を動かして F# を使う

この記事は、F# Advent Calendar 2016 – Qiita の 17日目です。なんか、曜日を勘違いしていて担当が日曜日だと思っていたんですよね。ほぼ日手帳が月曜日はじまりのカレンダーを使っているものだから、カレンダーの右端は日曜日なのですよね。長年使っていて便利です…という宣伝はさておき、F# の話です。

Android Things が発表された

Android Things が先週 Google から発表されました。

image

もともとあった、Brillo の進化形ということ(私は Brillo 自体をよく知らない)なのですが、前身はさておき、Raspberry Pi 等で Android が動くという環境です。もともと、Android の足回りは Linux な訳ですから、Raspberry Pi のように Linux 互換の OS(Raspbianなど)が動く組み込みボードであれば動く可能性もあったし、いままでも Raspberry Pi 上で Android 4.4 を動かすとか、Orange Pi や NanoPi のような Raspberry Pi 互換機で Android 5.1 が動くというパターンもありました。実は、つい先日  Android 5.1 をソースコードからビルドして NanoPi 2 Fire で動かすまで。 | Moonmile Solutions Blog な形で、Android のソースコードからビルドして NanoPi で Android 5.1 を動かすところまでたどり着いたところです。

もともと、スマートフォンの動作環境として開発された Android ですから、スマートフォンだけにターゲットを絞ると、Android Things が出てきた意味がよくわからないと思うので、少し背景を解説しましょう。

Android Things が現れた背景

スティックコンピュータと Raspberry Pi のような組み込みボード(ここでは OS が動く組み込みボードを対象にします)の違いは、その拡張性にあります。拡張性とはいっても、デスクトップ PC のようにストレージを増やせるとかメモリを増やせるとかということではなくて(そういう点でも、スティックコンピュータは拡張性がありません)、GPIO などを使って機器制御ができるという「拡張性」になります。いわゆるLチカのようにON/OFFでLEDを光らせるだけでなく、液晶ボードの I2C 通信や、各種サーボの PWM 制御によるロボットの動作、各種センサーのデータ収集などに使えます。

かつて、データ制御やロボット制御は、PC に高価な GPIO ボード(確か50万円位したはず)を繋げて制御したときもあるのですが、最近だと、安価な Raspberry Pi などを使う(学習用の組み込みであれば5,000円程度です)ことが可能です。そう、ある意味で「壊れても痛くない」程度の金額になります(まあ、個人でやると痛いけど)。

なので、今だとある程度工夫すれば、PC + 組み込みボードという金額的にも場所的にも費用が掛かるものを、組み込みボードで小型化かつ安価にできるようになってきました。

Raspberry Pi の場合、Linux を乗せて動くので基本はターミナルで動かします。学習用としてはデスクトップPCの代わりとして使えるけど、ディスプレイ無しの安価な制御PCとしてのほうが有効に使えます。というのも、画面まわりが非力で(最近は高機能になりましたが、PC のグラフィックボードよりは非力です)画面のあれこれと、制御のあれこれをやろうとすると、結構 CPU が大変なことになってしまうのです。ここで、「住み分け」として、高価な UI は PC でやって、制御絡みは組み込みボードでやります。やってもよいのですが、単体で動かすとやっぱりなんらかのモニタ的な表示がないと辛いものがあります。電源がついたあとに動いているかどうかすらわからないという状態に陥りますね。

ここで、Raspbian 上で Qt などを使って UI を作ってもよいのですが(実際、そうやって作っている方も多いt思います)、UI を作るとなると Windows や Android のように既にノウハウのあるところの開発者がいたほうがいいですよね。

そういう発想のもとで、UI の性能自体は OS の性能はぐっと落ちるかもしれないけど、アプリケーションは Windows のように作るというのが Windows IoT Core の考え方です。Windows IoT Core は、PC の Windows 10 とはかなり使い方は違っていますが UWP アプリ(ストアアプリ)という点では同じように作ることができます。その代り、PC の Windows 10 にあるようなスタート画面や高機能アプリは一切ありません。

同じ発想は、Android の組み込みボードの世界にもあって(購入すると3万円位かかります)、組み込みボードに Android を乗せて UI の部分は Android のものを使うというものがあります。先の Orange Pi や Raspberry Pi に乗せた Android は、スマートフォンに乗せているものと同じなので、非力な組み込みボードの CPU ではひどく重いものです。CPU を早くするとボード自体が高価になるし、Android の使い勝手をよくしようと思うとスマートフォンと同じ程度のスペックが組み込みボードに要求されてしまいます。この点で、かなり「詰んだ」状態にはなっていました。

そこで、Android Things の再登場です。

  • 通常の Android よりも低スペックで動作する。
  • Android UI を通常通りに使える。

この両方を満たすために、Windows IoT Core と同じ方法を Google は取りました。いわゆるスマートフォンを起動したときのホーム画面等が一切ありません。その分、ストレージや CPU への負担が軽くなっています。

更に云うと、実質(と思われる)Android SDK v7 で動くようになっています。スマートフォン用の API がどこまで削られてか分かりませんが、少なくとも Xamarin.Forms でビルドしたアプリを Android Things に乗せても平気なぐらい「API が削られていない」ことがわかります。

https://pbs.twimg.com/media/CzzlwS-VEAEDa0A.jpg

つまり、Android Things は

  • ほぼ API が削られていない(と思われる)Android SDK v7 が動く
  • GPIO 等を動かす、com.google.android.things.* が jar で提供されている

という組み合わせになります。jar ファイルは androidthings-0.1-devpreview.jar のようです。Windows IoT Core でもそうですが、この別口のライブラリをプロジェクトに追加することで、組み込みボードの制御ができます。ちなみに Linux 系は /sys/class/gpio のファイルを開くだけなのでスクリプトでも結構簡単にできるんですよね。Android Things が何を使っているかわかりませんが(あとでコードを見るつもり)、似た感じだと思います。

ちなみに Android Things では adb shell の中身が充実しています。

https://pbs.twimg.com/media/CzruhYaUcAARHgt.jpg

perl や python のようなスクリプト系の言語がないのは残念なのですが(いずれ入れられると思う)、posix 互換だそうなので、それなりにコマンドと API が揃っています。

 

Android Things と Xamarin.Android の関係

.NET 界隈では Xamarin が流行っている訳ですから、(私的には)Android とはいえ Java でやるよりも C#/.NET でやろうという訳です。そうなると、Xamarin.Android を使って Android Things のアプリを作れるといいですよね。

というわけで、xamarin/xamarin-forms-samples: Sample apps built using the Xamarin.Forms framework から、Xamarin.Forms のサンプルをいくつかダウンロードして動かしてみると、動きます。きちんと mono の環境が入って、C# でプログラミングをすることができます。

GPIO がらみは com.google.android.things.* をラップしないといけないのですが、

jonpryor/SimpleAndroidThingsBinding
https://github.com/jonpryor/SimpleAndroidThingsBinding 

な形で、XML を使ってマッピングができるそうなので、これも後で試していきます。こうなると、Android Studio を使わなくても、Xamarin.Android/Forms の開発スタイルで、Android Things で機器制御のプログラムが組めるということになります。

Raspberry Pi 3 で動かしたところ、オンボードの WiFi を認識して繋げることができました。Bluetooth はまだ試していないのでがつながるでしょう。あと、カメラとかの定番も試していきます。各種のサンプルは https://github.com/androidthings で提供されています。

アプリケーションは、Google Play がないので、adb installl でインストールします。Xamarin.Forms の場合は署名がなくてインストールできなかったのですが、リリースビルドをして署名をすれば入るでしょう。

mono が動くということは F# も動きますね

mono が動くことが確認できれば、もれなく F# が動きますよね :)

非常に簡単だけどボタンクリックのサンプルだけを動かしてみました。

えっ? F# 成分はこれだけですか…いや、まあ、これだけです。ちゃんとしたものはそのうちに。

image

日曜日に、年末恒例の矢野顕子「さとがえるコンサート」に行ってきたのでその写真でも。青色 LED がまぶしすぎて目がチカチカしますよ。輝度をもう少し下げたほうがいいかもしれません。手ぶれしているし。

では、皆さまのよきクリスマスを祈りつつ。

カテゴリー: Android パーマリンク