Xamarin.Android の開発とその先にあるもの

Android Advent Calendar 2016 の8日目になります。初めての人は初めまして、初めてでない人は、ずっと下のほうまで読み飛ばしてしまって大丈夫です。

Xamarin とは何か?

C# 界隈では鬱陶しいほど流行っている…のか流行っていないのかわかりませんが、Java のほうでもぼちぼちと Xamarin な人が入ってきたりしていると思いますが、端的に言えば、Android を C# で書こうというのが、Xamarin.Android です。ついでに言えば、iPhone/iPad のアプリを Objective-C や Swift じゃなくて C# で書こうというのが Xamarin.iOS で、Mac 上のアプリを C# で書こうってのが Xamarin.Mac です。あちこちで C# が出てきますが、実は F# で書くことができたりしますが、まあ、そんなマニアックなことをしなくても C# で .NET Framework を使ってアプリを書くことができます。

ここは Android 界隈に話を絞ると…

正直な話、Java で Android アプリを作るのは、Objective-C で iPhone アプリを作るよりも辛くはないと思うんですよね。スマートフォンのアプリを作る場合、それぞれのスマートフォンの仕様に従うので、Android の場合は Java が最適だとか、iOS の場合は…だとかは普通な話です。なので、いままで Java/Scala/Kotlin で Android をアプリを既に効率よく書けるのであれば、それはそれで十分だと思うのです。

Xamarin の場合は、Android/iOS そして XAML という XML形式で View を書いて(Android の axml と似たようなものです)Xamarin.Forms として共通化して書けるというメリットもあるのですが、まあそれも、Android だけを対象にするならば、特に Java から C# へ移行するというメリットはありません。

Xamarin.Android の欠点は?

どうせだから、欠点から先に並べておきましょう。

最新の Android の対応に 2,3か月かかる

iOS の場合は、事前にデベロッパーサイトに新しいバージョンの iOS が公開されます。メジャーバージョンアップのときには半年前に公開されることもあるので、そこで公開されるベータ版を使って iOS アプリのテストができます。Xamarin.iOS が iOS 内部のライブラリをポーティングしてテストする期間をそこに持つことができます。

しかし、Android の場合は事前公開がありません。Google からバージョンアップが表明されて、少しずつ各メーカーが対処するいう具合です。ここに Xamarin.Android の対応も巻き込まれるので、最新の発表から 2,3か月ほど遅れてしまいます。ここは、Java ネイティブで書いていたほうが即対応をすることが可能です。

Java の各ライブラリを個別にポーティングする必要がある

当たり前のことですが、Android の各種ライブラリは Javaで(*.jarで)提供されることが多いでしょう。あなたが使っている便利なライブラリや、あなたが作った効率的なライブラリを Xamarin.Android で使えるようにするには、C# で呼び出せるようにする必要があります。幸いにして、Xamarin.Android のコードのように属性を使って Java のライブラリを呼び出すようにできるのですが、Java から直接使うよりも手間が掛かることは確実です。

Java 特有のノウハウが使えない

Java も C# もオブジェクト指向言語ではありますが、それぞれのプログラム言語特有のノウハウがあります。私の場合、本格的に Android のプログラムを組んだことがありませんが(C# でならばあるんですが)Android の数々のコントロールは Java に対して組みやすいようにできていると思います。ListView へのアクセスとか、モデルオブジェクトの扱いとか、リスナーの扱いが Java っぽいですよね。そのあたりは、抽象的なデザインパターではなく「実装依存」にならざる得ないところがあります。そのあたりのノウハウを Xamarin.Android の世界に持って来ると Java –> C# なコンバートで混乱しますし、逆も同様です。そこは適材適所というところでしょう。

それを踏まえて Xamarin.Android を見ると

いくつかの欠点を踏まえて、Xamarin.Android + C# の組み合わせを見ると、「適所」な部分がみえてくるので、導入するときのポイントを示しましょう。

こなれた UI を使う場合

最新の Android ではなくて、4.4 のようなちょっと前の UI を使うときには、Xamarin.Android を使ってもよいでしょう。Android のアドベントカレンダーなので、C# な方はいない…とは思いますが、まあ、標準的な UI で社内アプリを作るようなときに C# –> Java で変換するよりも C# で書けるパターンを選ぶのもよいでしょう。勿論、社内ツールならば、引き継ぎなども考えて「誰かに任せられる言語」を選ぶことが大切です。社内で使われているプログラム言語が、Java なのか C# なのかという判断でよいと思います。

C#/.NET のノウハウを使う

例えば、MVVM パターンのような C#/.NET に端を発する技術やノウハウを使うときは Xamarin.Android を使って使うとよいでしょう。単に試してみるためでもいいと思います。私の場合、言語の出身上(?)、Java よりも C# のクラスライブラリのほうが知っているので、Xamarin.Android のほうが楽に開発ができます。ある程度、ライブラリなり試験が済んでしまえば、コード自体を Java と C# の相互変換してもよいし、クラスライブラリのまま呼び出してもよいでしょう。ちょっと、Java から C# を呼び出す方法は知らないのですが、先に示したように C# から Java の呼び出しは、Xamarin.Androidでロボホンを動かす(Java Binding Library利用) – Qiita が参考になると思います。

 

さて、ここまで来て話が飛びますが、ワタクシが Android をさして開発しないのに、Xamarin.Android であれこれやっている、理由のひとつがこれです。

左から、Raspberry Pi, Orange Pi, NanoPi です。いわゆる、組み込みボードと呼ばれるものなのですが、通常 Linux を入れて動かしますが、実は Android を入れて動かすこともできます。

NanoPi には、Android 5.1 を入れることができて、こんな風に HDMI を通して液晶ディスプレイに表示させることができます。

導入する Android の種類(主に中国産のAndroidになるので)にもよるのですが、NanoPi に入れられるものは Google Play も入っているので、ネットからアプリを入れることができます。

ここでは、有線LANで繋げていますが、無線LAN(WiFiドングルが必要)を付けることも可能なはずです(また試してはいない)。

ピンの部分は普通に GPIO なので、Lチカしたり、サーボモーターを動かしたり、各種センサーからデータを拾ったりもできますよね。

Android というと、スマートフォンの Android が筆頭にあがりますが、実はこのような組み込みボードの世界でも Android が使われているところがあります。中身は Linux なので、それなりに Raspberry Pi のようなアクセスが可能なのと、UI は Android のものが使えるのが利点です。まあ、そこで .NET な私としては Xamarin.Android のほうが使い勝手がいいというところなのです。

去年も Raspberry Pi に Android を入れて GPIO を弄ろうとしたのですが、なんかいまいち遅くてなんともならなかったのですが、NanoPi ぐらいならばなんとかなりそうです。幸いにして、Android のレポジトリからビルドする方法も NanoPi では用意されているので、コードから直接弄れそうな感じでもあります。

NanoPi の購入や解説は下記で

FriendlyARM-NanoPi 2 Fire
http://nanopi.io/nanopi2-fire.html

NanoPi 2 Fire – FriendlyARM WiKi
http://wiki.friendlyarm.com/wiki/index.php/NanoPi_2_Fire#Compile_Android

というわけで Xamarin.Android のその先へのお話でした。よいクリスマスを。

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