窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

.NET Conf 2018 Tokyo で Xamarinのネイティブバインディングのことを発表した

10月13日に開催された.NET Conf 2018 Tokyo, Japanで、Xamarinで各プラットフォームのライブラリを使うためのバインディングについて登壇してきました。 参加記と共に今回使用した資料の補足(ただのメモ書き)を残していこうかなと思います。

もう2週間も経つからいろいろと記憶が怪しい…

参加記

登壇側として参加したわけですが、最初っからこのイベントを知っていたか、と聞かれるとNoでした。

こんな感じで突如お誘いいただけて、それから色々ありまして参加となりました(省略)。

当日ですが、自分の登壇以外はずっとRoom C+Dで話を聞いていました。 自分が追ってるXamarin関係以外の話題をキャッチアップできたり、全く知らなかったAzure Pipelinesを知ることが出来て非常に学びが多かった。

自分の発表に関しては、緊張した、緊張して早口で混乱した。 それ以外の感想が実際ないです…もうちょっと練習しなきゃ…という懺悔は次の節で。

資料とちょっとした補足

www.slideshare.net

まずはじめに懺悔

iOSの説明がスッカスカになってしまって申し訳ございませんでした。 実はiOSの部分当日の朝からさてどうしようかなぁって始まったんです

また最初に今回の発表の内容をどの層に向けにしようか、どのレベル感にしようかという、対象を定めきれていなくて、中途半端になってしまったなぁという後悔があったりします。 私の所属する会社は発表前にこんな感じでいいかな、伝わるかな、みたいのをすり合わせたりする 素振り というものを行っているのですが、それを十分に活用しておけばなぁと思いました(事前に人に見せることは自分の気持的にも必要なことなので、締切ギリギリまで資料を作り続ける、ということにならないように早め早めに動きましょう)。

弊社の素振りについての参考記事

techlog.voyagegroup.com

次回何らかの発表の機会があったときにはこういう後悔をしないようにしたいですね。

以下補足と自分で思い出す用の参考リンク。

Android

  • jar の Build Action は2つ覚えればいいという理由

remove-node で削除してしまえば結局同じじゃないですか、という割と雑な理由だったりします。 EmbeddedReferenceJarに関しては確かにJarの依存関係をそのまま示せてシングルパッケージに閉じ込められる、ということで使い道はあります。 それぐらいかなぁと言うことしか思いつかないので、であればInputJarとEmbeddedJarで頑張る、でいいよねということで、2つ覚えればいいというような記述にしました。 ですが、

  • 他のライブラリからまず呼ばれることが無いライブラリである(例:自社SDKバインディング対象からしか呼ばれることがない)
  • 作成したライブラリを公開する予定がなくて、作っているアプリケーションぐらいでしか使わない

という条件を満たした場合、EmbeddedReferenceJarの方が楽なのかもしれません。

(前雑にEmbeddedReferenceJarとかを使って複数のバインディングライブラリを使ったらGsonのバージョン云々でハマったことがあり、それからBindingのタイミングで依存解決するのは大変かもしれないと思ってやめた経緯があります。 .NETに乗っかってるし、NuGetで示そうか、みたいな気持ちもあります。)

  • aarは一個

https://bugzilla.xamarin.com/show_bug.cgi?id=44573

こんな仕様があったりします。

https://docs.microsoft.com/ja-jp/xamarin/android/platform/binding-java-library/troubleshooting-bindings

  • スライドにはない補足情報

今回の発表資料にはEnumやAdditions.csに関してのことを載せませんでした。 というのも割とプロジェクト特有のものが多かったりで、実際使わないことが多いんじゃないかなぁと判断したためです(JINSMEMEのSDKラップの時は多用しましたが)。

今回JINSMEMEのSDKのラップでは

JINSMEME.Xamarin/Additoins.cs at master · yamachu/JINSMEME.Xamarin · GitHub

こんな感じで使っています。 本来であればEnumFields.xmlを編集し、Enumマッピングを行うべきなのですが、今回のライブラリではEnumを戻り値とするメソッドのバインディングに失敗していてEnumをそのままバインディングすることが出来ませんでした。 解決手段はだいたい見つけたので今度試してここの説明を書き換えたいです。

ざっくりとした方法としては

  • EnumFields.xmlEnumマッピングを記述
  • EnumMethods.xmlEnumを用いるメソッドを記述 せずに
  • Enumを用いるメソッドをremove-nodeし
  • Additions.csにEnumを用いるメソッドを正しい呼び出し方法で実装

すれば可能でしょう(完全に自分用メモ)。

iOS

  • staticライブラリかdynamicライブラリを知らなければいけない理由

dynamicライブラリなのに、staticライブラリとしてビルドした場合、バインディングライブラリをビルドするタイミングでは気づかずにランタイムで死にします。 厄介なところとしては、起動してそのライブラリを読み込もうとした段階でアプリが落ちるので、非常にログが取りづらく原因が特定しづらいです。 Xcodeとかのデバイスログ眺めるとかで対処気づくことも出来るのかもしれませんが(未確認です)。

staticかdynamicかは file コマンドで簡単にわかるので、まずこのファイルなんだろう、ってなったらfileコマンドを叩きましょう。

  • linkwith.csとか手書きしてるけど、いるの?

あのファイルが正しく書かれていない、または存在しない場合、アプリケーションにリンクさせる段階で死にます。

Undefined symbols for architecture arm64:
      "_OBJC_CLASS_$_MEMERealTimeData", referenced from:
          objc-class-ref in registrar.o
      "_OBJC_CLASS_$_MEMELib", referenced from:
          objc-class-ref in registrar.o
         (maybe you meant: _OBJC_CLASS_$_MEMELibDelegate)
      "_OBJC_CLASS_$_MEMEData", referenced from:
          objc-class-ref in registrar.o
    ld: symbol(s) not found for architecture arm64
    clang : error : linker command failed with exit code 1 (use -v to see invocation)
    
    MTOUCH : error MT5211: Native linking failed, undefined Objective-C class: MEMERealTimeData. The symbol '_OBJC_CLASS_$_MEMERealTimeData' could not be found in any of the libraries or frameworks linked with your application.
    MTOUCH : error MT5211: Native linking failed, undefined Objective-C class: MEMELib. The symbol '_OBJC_CLASS_$_MEMELib' could not be found in any of the libraries or frameworks linked with your application.
    MTOUCH : error MT5211: Native linking failed, undefined Objective-C class: MEMEData. The symbol '_OBJC_CLASS_$_MEMEData' could not be found in any of the libraries or frameworks linked with your application.
    MTOUCH : error MT5202: Native linking failed. Please review the build log.

iOSバインディングのエラーログ

わりと大切なことなのに資料に載せていなくて申し訳ございません… 手作業で追加しているけれども、frameworkファイルを追加したら.aの時のようにlinkwith.cs作ってくれないのかしら…

最後に

とりあえず資料のアップともう少しこの辺は補足として…ということは書けた気がするので今回はこのへんで… 発表もそうだけど記事書くのもちゃんと練習しないとと思った。