はてなダイアリーに書くのがたいへんひさしぶりな気がしますが(あ、はてだじゃなかった)、Xamarin Advent Calendar 8日目のエントリーになります。8日目にして初めて登場です。いやわたし別件で毎日書きたくて走らせているネタがあるので他所までは手が出せず…
さて、ここ1ヶ月ばかりMicrosoftとXamarinの提携があって、XamarinまわりのセッションをC#/.NET界隈のいろんなところで聴けるようになったみたいで、わたしとしては自分でその手のものをやる必要が無くなって、ますます身軽になったキモチでいっぱいでございます。
まあ戯言はそのくらいにして、今日はライトな話を書こうと思います。まあわたしはAndroid担当なので、Androidまわりの話です。実のところテキスト量はパないのですが、技術的に掘り下げた話はほとんど無いので、気軽に読めると思います。
最近「Androidオープンソースライブラリ徹底活用」という書籍が発行されました。 素晴らしい。何が素晴らしいって全部オープンソースのライブラリが対象なんですねコレ。
AndroidはSDKがJavaですが、Java向けのライブラリが直ちに再利用できるかというと、必ずしもそういうことはなくて、むしろAndroidのフレームワークに特化したものを使うことが多いでしょう。この本も主にそういったライブラリを紹介することを主眼に置かれているものだと思います*1。
さてXamarin.AndroidはC#の世界なので、この種のJavaで書かれたAndroidライブラリがJavaベースのAndroidアプリを作るようにそのまま使えるわけではありません。んが、Xamarin.Androidには既存のJavaライブラリをそのまま取り込んで使える「Javaバインディングライブラリ」の機能があります。これを使うと、Mono.Android.dllというAndroidフレームワークに対応する.NETのライブラリがAndroidフレームワークにシームレスにアクセスできるのと同じように、既存のJavaライブラリを「あたかも.NETのAPIであるかのように」使用することができるわけです。
便利ですね。便利ですが、簡単に出来るとは限りません。使うのはそれなりに簡単ですが、巷にあふれるXMLスキーマからxsd.exeで簡単にXMLシリアライズできるクラスを生成できないのと同様、JavaライブラリからのC#へのマッピングは、ある程度の知識が要求されます。いやJavaとC#の違いに起因する癖を知ってしまえば出来ることが多いですが…
ともあれ、今回はその詳細の説明はしません(それは機会があればまた書きます)。この新刊では、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日目のエントリーは終わりにしたいと思います。