XamarinでAndroidオープンソースライブラリ徹底活用

はてなダイアリーに書くのがたいへんひさしぶりな気がしますが(あ、はてだじゃなかった)、Xamarin Advent Calendar 8日目のエントリーになります。8日目にして初めて登場です。いやわたし別件で毎日書きたくて走らせているネタがあるので他所までは手が出せず…

さて、ここ1ヶ月ばかりMicrosoftとXamarinの提携があって、XamarinまわりのセッションをC#/.NET界隈のいろんなところで聴けるようになったみたいで、わたしとしては自分でその手のものをやる必要が無くなって、ますます身軽になったキモチでいっぱいでございます。

まあ戯言はそのくらいにして、今日はライトな話を書こうと思います。まあわたしはAndroid担当なので、Androidまわりの話です。実のところテキスト量はパないのですが、技術的に掘り下げた話はほとんど無いので、気軽に読めると思います。

最近「Androidオープンソースライブラリ徹底活用」という書籍が発行されました。 素晴らしい。何が素晴らしいって全部オープンソースのライブラリが対象なんですねコレ。

Androidオープンソースライブラリ徹底活用

Androidオープンソースライブラリ徹底活用

 

AndroidSDKJavaですが、Java向けのライブラリが直ちに再利用できるかというと、必ずしもそういうことはなくて、むしろAndroidフレームワークに特化したものを使うことが多いでしょう。この本も主にそういったライブラリを紹介することを主眼に置かれているものだと思います*1

さてXamarin.AndroidC#の世界なので、この種のJavaで書かれたAndroidライブラリがJavaベースのAndroidアプリを作るようにそのまま使えるわけではありません。んが、Xamarin.Androidには既存のJavaライブラリをそのまま取り込んで使える「Javaバインディングライブラリ」の機能があります。これを使うと、Mono.Android.dllというAndroidフレームワークに対応する.NETのライブラリがAndroidフレームワークにシームレスにアクセスできるのと同じように、既存のJavaライブラリを「あたかも.NETのAPIであるかのように」使用することができるわけです。

便利ですね。便利ですが、簡単に出来るとは限りません。使うのはそれなりに簡単ですが、巷にあふれるXMLスキーマからxsd.exeで簡単にXMLシリアライズできるクラスを生成できないのと同様、JavaライブラリからのC#へのマッピングは、ある程度の知識が要求されます。いやJavaC#の違いに起因する癖を知ってしまえば出来ることが多いですが…

ともあれ、今回はその詳細の説明はしません(それは機会があればまた書きます)。この新刊では、50以上もあるオープンソース ライブラリの使い方を説明されているようです。その多くは割とポピュラーなもので(まあそうでなければ書籍化も難しいでしょう)、実のところXamarinおよびユーザーコミュニティでも、それらのライブラリを使えるようにしている人たちがそれなりにいます。

というわけで、今回はこの本で紹介されているライブラリに相当するJavaバインディングライブラリ、があるもの、をずらっと並べていきたいと思います!

(アリモノだけを並べます。今バインディングが無いものはN/Aと書いておきます。)

Chapter 01  UI関連ライブラリ

01-01   android-support-v4

http://components.xamarin.com/view/xamandroidsupportv4-18
これは、android-support-v4パッケージのrev.18に対応するものです。supportパッケージのrevisionはチマチマと上がっていって、バージョン間の互換性はそこはかとなく失われていくので、どうやらrevisionごとにパッケージしていく方針にしたようです。(わたしは実のところそれは気に入らず、Android SDKのライフサイクルを理解していないやり方だ、と主張しているのですが。)

01-02   ActionBarSherlock

https://github.com/xamarin/monodroid-samples/tree/master/ActionBarSherlock

ABSのバインディングはもちろんあります。

01-03   Android-PullToRefresh

https://github.com/xamarin/monodroid-samples/tree/master/ActionBarPullToRefresh
Android-PullToRefreshライブラリはメンテナンスされていないので、代わりにActionBar-PullToRefresh https://github.com/chrisbanes/ActionBar-PullToRefresh を使った方が良いのではないかと思います(がもしかしたらこっちを推奨できない理由が何かあるのかも)。そのActionBarPullToRefreshのバインディングはこちらにあります。

01-04   SlidingMenu

https://github.com/xamarin/monodroid-samples/tree/master/SlidingMenu
このバインディングもこちらにあります。monodroid-samplesにはわれわれがportしたサンプルがさり気なくいろいろあります。

01-05   SwipeListView
N/A
01-06   MultiChoiceAdapter
N/A
01-07   StickyListHeaders

https://github.com/jamesmontemagno/XamDroid.StickyListHeaders
        コミュニティによるバインディングがあります。

    01-08   android page curl
N/A
01-09   ViewPagerIndicator

https://github.com/xamarin/monodroid-samples/tree/master/ViewPagerIndicatorBinding
Xamarinのサンプルとしてあります。

01-10   NewQuickAction
N/A
01-11   Android ViewBadger
N/A
01-12   Android ProgressFragment
N/A
01-13   HoloEverywhere
N/A
01-14   HoloColorPicker
N/A
01-15   aFileChooser
N/A
01-16   Android Validator
N/A
01-17   PhotoView
N/A
01-18   ImageLayout
N/A
01-19   StyledDialogs
N/A

Chapter 02  画像処理ライブラリ

02-01   GPUImage for Android
N/A
02-02   ZXing

http://components.xamarin.com/view/zxing.net.mobile/
ZXingのライブラリは、かなり初期の時点でXamarinのコンポーネントストアに登録されていたものです。

02-03   svg-android

https://github.com/xamarin/monodroid-samples/tree/master/SvgAndroid

実はバインディング ライブラリのサンプル第1号として使いました。

02-04   android gifview
N/A

Chapter 03  ネットワーク関連ライブラリ

03-01   Asynchronous Http Client for Android
N/A ... System.Net.HttpClientを使えればいいものでしょうかね?
03-02   Volley
N/A ... (同上)
03-03   Universal Image Loader for Android
http://forums.xamarin.com/discussion/1156/adding-android-universal-image-loader-libraryバインディング プロジェクトに必要なファイルの内容があります
03-04   Scribe
N/A ... Xamarin.Authを使えば良いと思います。

Chapter 04  データ処理ライブラリ

04-01   JsonPullParser
N/A
04-02   Gson
N/A ... .NETなのでさすがにバインドする意味がないように思います。protobuf, msgpackなど.NET互換のシリアライザを使うのが吉でしょう。(それだけじゃない? 使ったことがないのでわかりません)
04-03   dom4j
N/A ... Linq to XMLなどがあるので、それを使えば良いでしょう。
04-04   jsoup
N/A ... SgmlReaderなどを使えばXMLライブラリで操作できるでしょう。

Chapter 05  データベースライブラリ

05-01   greenDAO
N/A ... 1年前のスレッドですが「XamarinでORM何がいい?」 http://forums.xamarin.com/discussion/421/orm-selection
05-02   ActiveAndroid
N/A ... (同上)
05-03   SQLCipher for Android

https://components.xamarin.com/view/sqlcipher-for-xamarin/
これもかなり初期からコンポーネントストアに存在していました。

Chapter 06  設定系ライブラリ

06-01   UnifiedPreference
N/A
06-02   DateTimePicker
N/A

Chapter 07  地図ライブラリ

07-01   Polaris2
N/A

Chapter 08  ログライブラリ

08-01   android-logging-log4j
N/A ...「log4netはXamarinで使える?」 http://forums.xamarin.com/discussion/3070/log4net-usage
08-02   ACRA
N/A ... 実は昔自分で試しに作ったことがあるんですが(動いたような気がする)、ソースがどこかに消えてしまいました…

Chapter 09  テストライブラリ

09-01   Robotium

公開していませんが昔作ったのでMetadata.xmlの内容だけ置いておきます。

<metadata>
  <attr path="/api/package[@name='com.jayway.android.robotium.solo']" name="managedName">Com.Jayway.Android.Robotium.SoloNS</attr>
  <remove-node path="/api/package[@name='com.jayway.android.robotium.solo']/class[@name='Solo']/method[@name='finalize']" />
</metadata>
09-02   FEST Android
N/A ... XamarinはJUnitを提供しない(NUnitLiteを提供している)ので、これをバインドする意味は無いでしょう。
09-03   Mockito
N/A ... XamarinはJUnitを提供しない(NUnitLiteを提供している)ので、これをバインドする意味は無いでしょう。NUnitにはNUnit.Mocksがあります。
09-04   Robolectric
N/A ... Robolectricは開発ホスト側ライブラリなので、Androidバインディングにはなりません。

Chapter 10  デバッグライブラリ

10-01   smali
Xamarin.Androidアプリにはdexファイルが含まれるので、それを解析することは出来ます。解析すれば、大半のJavaコードはJNI経由でmonoのAPIを呼び出しているだけであることが分かるでしょう。.NET部分の.dllはXamarin Studio (MonoDevelop)のdisassemblerで普通に解読できます。
10-02   dex2jar
これもXamarinアプリに含まれるdexに対して使えます。

Chapter 11  アニメーションライブラリ

11-01   NineOldAndroids
https://github.com/xamarin/monodroid-samples/tree/master/NineOldAndroids
11-02   ListViewAnimations
N/A

Chapter 12  グラフ描画ライブラリ

12-01   HoloGraphLibrary
N/A

Chapter 13  コード最適化ライブラリ

13-01   AndroidAnnotations
Android Annotationsは半ばEclipseのbuilderフックであり、MonoDevelopで使えるわけでもなく、バインディングを作る意味はほぼ無いでしょう。そもそもAndroid Annotationsで得られるメリットの大半は、XamarinではAttributeで実現しているものであり(ActivityAttributeを付けたら勝手にAndroidManifest.xmlに追加されるなど)、特にこのライブラリを使用する意味はないと思います。
13-02   Android Query
N/A
13-03   RoboGuice
N/A ... 実はこれ、長いことわたしがバインディング プロジェクトまわりの仕事をしていた時に、ターゲットにしていたもののひとつだったのですが、当時は「.NETのライブラリにあるものはバインドしない」方針のもと、Java.Util系のコレクション類が大量にMono.Android.dllから削られていて、存在しないクラスに対してバインドすることは出来ないので失敗、みたいなことになっていました。最近は試していないのでもしかしたらうまく出来るかもしれません。(やって意味があるのかはわかりませんが。)
13-04   Butter Knife
N/A ... 初めて知りましたがイイですねコレ。ちょっとこういうのをサポートする仕組みを導入したいかも。

Chapter 14  通知ライブラリ

14-01   Crouton
N/A

Chapter 15  Web APIライブラリ

15-01   Twitter4j
N/A ... Twitterを操作する.NET APIはきっとあるでしょう。Windows Phoneで動くコードなら動くはず。
15-02   Evernote SDK for Android
https://github.com/evernote/evernote-sdk-csharp があって、Windows Phone 7で動くようなので、きっとXamarinでも動くでしょう。
15-03   flickrj-android
https://flickrnet.codeplex.com/ が使えることでしょう。

…ふう。大量にあるので、だんだん途中から説明が手抜きになっていくのが見て取れますが()、ともあれXamarinに移行してもそれなりにライブラリが使いまわせそうだ、ということが説明できたかと思います。

↑でN/Aになっているものは、一部は原理的に無理なもの(RobolectricとかAndroid Annotationsとか)や困難なもの(大量のAPIマッピング補正作業を必要とするもの)もありますが、大半は「誰も試していない」になると思います。なので、簡単に追加できるかもしれませんし、難しいかもしれません。いずれにしろ、この種のJavaバインディングのライブラリは、それなりに増えていくことでしょう*2

最近では、component storeの他に、NuGetパッケージとして発表するというルートもあるので、その方面でライブラリを探すことも可能だろうと思います。NuGetなら審査もありませんし、気軽な発表はやりやすいですね。

さて、そんなわけでそろそろ8日目のエントリーは終わりにしたいと思います。

*1:まだ現物を見ていないので想像で…

*2:作業する人が少なくなればバージョンアップに伴って減るかもしれませんがw