ものがたり(旧)

atsushieno.hatenablog.com に続く

Mono for Android 4.1 released

前回の4.0リリースから4ヶ月もかかってしまいましたが*1、Mono for Androidの最新版がリリースされました。
http://docs.xamarin.com/android/Releases/Mono_For_Android_4/Mono_for_Android_4.1.0

Alpha版チャネルへの配信になるので、MonoDevelopならアップデートのチェックダイアログで、VSならMono for Androidの設定で、アップグレードのチャネルをAlphaにしないと出てきません。

今回のリリースの変更点は、リリースノートから引っ張ってくるとこんな感じです(バグフィックスを除く):

  • Java binding library project
  • 縮小したデバッグ共有ランタイム
  • VS addinのユーザビリティ改善: デバイス選択ツールバー, non-modal deployment, まとめられたlogcat
  • MonoDevelopのpublisher dialog
  • ICS/Honeycombテンプレート、Fragmentテンプレート
  • APIの改善
    • API Level 15サポート
    • int定数からenumへの移行の完了(のはず)
    • Android compatibility libraryのサポート
    • 任意のJavaコード生成
    • C# 4.0 dynamicのサポート
    • Instrumentationのサポート
    • Java annotationをAttributeに変換/AttributeからJavaコードに反映
    • リソースXMLで.NETの型名が利用可能(以前はJava名のみ)

Javaバインディングが簡単に使えるようになったのは大きいと思います。本来はMono.Android.dllを生成するために使用しているツールでしたが、いろいろ手を加えて外部ライブラリに対応出来るようにしようと始めて最初に出来たのが前回のリリースにあったmaps.jarのバインディング、そして今回のcompatibility libraryのバインディングということになります。ソレとは別にadmob, svg-android, facebook sdkその他いろいろ試してみました(この辺はプレビューブランチのmonodroid-samplesに含まれています)。

facebook sdkは少々事情が特殊で、これはAndroid Library Projectとして配布されているものなので、単なるJarのバインディングではない、リソースの集合も含めたビルド生成物をzipにまとめた上でdllにバンドルするという、トリッキーな仕組みを実装しました。Library projectのビルド出力(binフォルダ以下)をzipにまとめてLibraryProjectZipとしてbinding library projectに追加すると、リソースもまとめて面倒みます。あるいは、ビルド済みandroid library projectのproject.propertiesを追加すると、そこから勝手にファイルを引っ張ってきます(!)。つうかJavaユーザーの人たちも配布がめんどくさいとか言っているようなので、GoogleはLibrary Projectのアウトプットを1つのjarにまとめるようにすべき。

今回のExportAttributeサポートで、APIまわりの制約でJavaでしか出来なかったことがけっこう出来るようになりました。Parcelable.CREATORandroid:onClickとjava.io.SerializableとWebView.addJavascriptInterface()が使えるようになったのは確認しています。他にも特定のJavaコードを要求するような機能があれば、それもサポートできているかもしれません。

ちなみに、Parcelableサポートまわりを確認しているときに、aidlからC#コードを生成するツールも作ったのですが、やっつけでブラッシュアップする時間も無かったので今回のリリースには含まれていません(というか需要があるのか分からないので今後もどうするか…)。

dynamicが使えるようになったのは、人によっては嬉しいかもしれません。ただ、Microsoft.CSharp.dllとMono.CSharp.dllへの参照が増えてコードサイズが増えて、しかも動的型解決は軽いとは言えないので、使いどころには気をつけた方が良いでしょう。最近Microsoftがリリースしたaspnetwebstackに含まれていたSystem.JsonにあったJsonValue.AsDynamic()を使ったサンプルを書いてみましたが(どこかで見たような例!)、ロード完了するまで割と時間がかかります。

そんなわけで、今回のリリースの新機能の多くはわたしがやっつけていたのですが、無事出てきて安心しました。

ちなみに明日のプロ生勉強会でこの辺の話をする予定はほとんどありません(!)。これまでMono for Androidを使っていたという人にしかおいしくないと思うので…UI designerの話などはちょろっとする予定です。時間があったらぜひ遊びに来て下さい。

追記: Android Designer betaとMfA 4.1の関係ですが、designer betaはMonoDevelopのalphaバージョンとして捉えてもらえれば良いと思います。MonoDevelopをアップデートするとdesigner betaは消えてしまいますが、MfA 4.1にアップデートしてもdesignerは動作するはずです。

*1:2月にリリースと言われていた頃にメンバーの休暇が重なり、3月になるとドキュメントチームがMonoTouch 5.2で手一杯という状況に押しやられ…