xamarin によるクロスプラットフォームモバイルアプリ開発(2014.06)
TRANSCRIPT
Xamarin による クロスプラットフォーム モバイルアプリ開発
2014.6.19 コスモルート社内勉強会
Xamarin とはなんぞや?
• 「ざまりん」と読みます
• .NET Framework のオープンソース実装である「Mono」を作ってる人たちが作った企業の名前
• 及び、同社が提供するSDKやツールなどをひっくるめた総称
2
ひとことで言えば
.NET(C#)で、Android/iOS/Mac/Window アプリを開発できるSDK
3
もうちょっと詳しく1• Xamarin.iOS(旧MonoTouch)Xamarin.Android(旧MonoDroid)Xamarin.Mac(MonoMac)
• 各プラットフォーム(PF)のMono実装+各PFのAPIの”薄い”ラッパー
• いずれもOSSではなく、有償のプロダクト(MonoMacはOSS、ただしGPL/LGPL)
4
もうちょっと詳しく2• Xamarin Studio(MonoDevelop+Addin)
• Win/Mac/Linux で動作するOSSな統合開発環境(IDE)
• モバイル開発以外でも使われる(ってか、そっちが主)
• Visual Studio アドイン
• iOS/Android開発を実現するためのアドイン
• Xamarin BUSINESSエディション以上が必要
5
価格体系
「/年/PF/開発者」である事に注意!(更新せずに使い続けてもOK) 学割あります(BUSINESS版が $99!!)
ref https://store.xamarin.com/
6
日本でも
ref フェンリル株式会社 | スマートフォンアプリ開発 実績 NHK 紅白
8
Microsoftと提携!
• Portable Class Library が Xamarin.iOS, Xamarin.Android にも対応
• Xamarin 3リリースキャンペーン中(エクセルソフトによる。~6/30)
ref http://xamarin.com/msdn
9
Win+Visual Studio で作る?
• iOS 開発の為に Mac が必要
• リモート接続してビルド&デバッグ
• インストールや日本語入力が不安定との噂も
↓ Mac + Xamarin Studio での開発が
現在もベストプラクティス(個人の見解です)10
Xamarin とは(もう一度)
各PFのMono実装+
各PFのAPIの”薄い”ラッパー
11
Xamarin.Android の実行モデル
VM(Dalvik)
Linux カーネル
コアライブラリ群
アプリケーションフレームワーク(Java)
アプリケーション(Java)
Monoランタイム
Linux カーネル
コアライブラリ群
JavaSE6 アプリケーションフレームワーク(.NET) .NET4.5 BCL
アプリケーション(C#)
Android(標準) Xamarin.Android
どちらも中間言語を ランタイムがJITコンパイルして実行
12
Xamarin.iOS の実行モデル
ARM
ARMマシン語
アプリケーション(Objective-C)
iOS(標準)
コアライブラリ群
CocoaTouch
LLVMコンパイラ
実機
ARM
ARMマシン語
アプリケーション(C#)
コアライブラリ群
CocoaTouch
Mono AOTコンパイラ
実機
CocoaTouch(.NET) .NET4.5 BCL
Xamarin.iOS
13
利点と欠点• Xamarin.Android
• ◎:Microsoftと仲が良い<GoogleはOracleと仲悪い(Javaで敗訴)>
• △:Monoランタイムをアプリに含めるためサイズが増加
• Xamarin.iOS
• ◎:ガベージコレクション、静的型付け
• △:事前コンパイル(AOT)の為、使えない機能(リフレクション等)がある
14
「薄いラッパ」である事の利点
• PFのバージョンアップに追従しやすい
• 厚いラッパ(=共通API)では、複数PFで整合性を取らないといけないので時間がかかる
• PF固有の開発経験が活かせる
• 潰しが利く(=PF固有の開発に戻りやすい)
• 使い方が変わってしまう厚いラッパでは、戻るのは難しい
15
DEMOXamarin.Android と iOS で HelloWorld
16
クロスプラット フォームで開発するには
17
どこが共通化できるの?1
共通化できるところ
• 基本データ型、計算処理
• 通信処理
• ファイルI/O
• 非同期処理
• 画面(Xamarin.Forms)
共通化できないところ(PF固有の機能)
• センサー系(GPS、加速度等)
• カメラやアドレス帳
• アプリ間連携
18
どこが共通化できるの?2
CocoaTouch
CocoaTouch (.NET)
Xamarin.iOS
Monoランタイム
Androidコアライブラリ群
アプリケーションフレームワーク(.NET) .NET4.5 BCL
アプリ(C#)
Xamarin.AndroidiOSコアライブラリ群
.NET4.5 BCL
アプリ(C#) _ここは共通化できる
PCL(Portable Class Library)
19
画面の共通化• Xamarin.Forms
• 単一の画面定義で複数PFで動作(ネイティブ)
• XAMLまたはコードでUIを定義(エディタはまだ)
• PF固有
• iOSなら.storyboard - ViewController
• Androidなら.axml - Activity
• 両者の相互運用も可能
DEMOXamarin.Forms
21
そして PCL へ• PF間で共有できる「ポータブル」なクラスライブラリ
• 実際には、対応PFセット毎にプロファイルが定義されている
• Xamarin.Android/iOS も対応
WPF/Win8/Android/iOS に1ソース (というか1バイナリ)で対応できる
22
既存資産の活用1• Xamarin.Android Java Binding
• Java ライブラリ(.jar)を利用可
• .NET API は .jar から自動生成+カスタマイズ
• Xamarin.iOS Obj-C Binding
• Obj-C の Static Library(.a)を利用可
• .NET API を自分で定義する必要あり
• 補助ツール - Objective Sharpie
• Java Binding より結構大変23
既存資産の活用2• 既存の.NET資産もある程度使える(PCLでなくても)
• .NET Mobility Scanner でどの程度利用できるか調べる事ができる
• http://scan.xamarin.com/
24
既存資産の活用3• Xamarin Components
• Xamarinで利用できるライブラリのマーケット
• Nuget
• .NET 向けのパッケージマネージャ
• 画面に依存しないライブラリなら使えるかも
• CodePlex, Githubなど
• ライブラリが対応してなかったらコードを入手してXamarin用にビルドという手も
25
他のクロスプラット フォーム開発ツールとの比較
Titanium / PhoneGap / Adobe AIR / Delphi XE
26
Xamarin(おさらい)言語 C#(.NET)
実行形式 Android:JIT iOS:AOT
共通化可能 UIと基本ライブラリ相当機能 (計算処理、通信処理、非同期処理など)
共通化不可能 PF固有の機能(センサーなど)
PF固有機能 呼び出し PF毎のAPIを呼び出し可能
27
Titanium Mobile
言語 JavaScript
実行形式 インタプリタ
共通化可能コアロジック、GPS など
共通APIが用意されている機能、 Label, EditBoxなど簡素なUI
共通化不可能 PF固有のUIパーツ(CoverFlowView等) コアロジックでもPF依存が多いとの噂
PF固有機能 呼び出し Module を作成
28
PhoneGap/Sencha Touch
言語 HTML5+CSS+JavaScript
実行形式 WebView上で動作するWebアプリ
共通化可能 Webアプリなので一見は共通。 共通APIが用意される一般的な機能
共通化不可能 ブラウザ依存は少なくない 共通APIが無い機能
PF固有機能 呼び出し Plugin を作成
29
Adobe AIR for モバイル
言語 ActionScript
実行形式 Android:JIT iOS:AOT
共通化可能 UI含め API が用意されていれば可能。 ただしUIは独自レンダリング
共通化不可能 基本的には無いが、 その分機能が最小公倍数である
PF固有機能 呼び出し Native Extensions を作成
30
Delphi XE言語 Delphi
実行形式 Android:AOT iOS:AOT
共通化可能UI含め API が用意されていれば可能。
UIは独自レンダリングだが Pixel Perfect でPFのスタイルを忠実に再現。
共通化不可能 PF毎のAPIもあり、 それを使った場合は共通化不可能
PF固有機能 呼び出し PF毎のAPIを呼び出し可能
31
Others• Qt Mobile
• C++ で書けるなら最強じゃね?(書けるなら)
• RoboVM、RubyMotion
• 言語が違うだけで仕組みはXamarinに似てる
• Unity, Corona
• ゲーム向けっぽい32
しかし Xamarin 最大の利点は
33
C#34
C# is Cool!!![Objective-C]!
01 [button1 addTarget:self action:@selector(onClick:)!
02 forControlEvents:UIControlEventTouchDown];!
…!
03 -(void)onClick:(UIButton*)button{!
04 NSLog(@“Hello”);!
05 }!
![Java]!
01 button1.setOnClickListener(new OnClickListener() {!
02 @Override!
03 public void onClick(View view) {!
04 Log.d(TAG, “Hello”);!
05 }!
06 });!
![C#]!
01 button1.Click += (s, e) => Debug.WriteLine(“Hello”);
5 Lines
6 Lines
1 Line
ref https://xamarin.com/csharp35
LINQ to Objects01.0~9 の数値を!
02.偶数だけにして!
03.大きい順に並び替えて!
04.10倍にして!
05.出力する!
![C#]!
01 new int[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }!
02 .Where(x => x % 2 == 0)!
03 .OrderByDescending(x => x)!
04 .Select(x => x * 10)!
05 .ToList().ForEach(x => Debug.WriteLine(x));!
![Output]!
> 80 60 40 20 0
36
async/await
[Java]!01 int doHeavyWork() {!02 return /* working... */;!03 }!!04 private void onClick(View v) {!05 new AsyncTask<Void, Void, Integer>() { !06 @Override!07 protected Integer doInBackground(Void... params) {!08 return doHeavyWork();!09 }! !10 protected void onPostExecute(Integer result) {!11 label1.Text = "count = " + result;!12 };!13 }.execute((Void)null);!14 }
[C#]!01 Task<int> DoHeavyWork() {!02 return Task.Run<int>(() => {!03 return /* working... */;!04 });!05 }!!06 async void onClick(object s, EventArgs e) {!07 var result = await DoHeavyWork();!08 label1.Text = "count = " + result;!09 }!
ワーカースレッドで時間のかかる処理をして、終わったらメインスレッドで結果を表示
37
Swift でたよ?
38
• 「Obj-C嫌だからXamarin」だけだった人はSwiftで十分
• 新しい言語だけあってC#より優れていそうな所もある
• クロスPFや.NET資産の利用ならやっぱりXamari
• SwiftとObj-Cは相互運用可能なので、Swift→Xamarinも可能(なはず)
まとめ
39
まとめ• Mac + Xamarin Studio + Xamarin.Android + Xamarin.iOS で クロスPF 開発
• Win は、VS + Xamarin Addin で
• PCL でコアロジックをクロスPFでバイナリ共有
• C# >>>>>>> Java, Objective-C
40
Links• Xamarin Developer Center - http://docs.xamarin.com/
• Xamarin日本語情報(XLSoft) - http://www.xlsoft.com/jp/products/xamarin/
• Qiita - http://qiita.com/tags/xamarin
• はてなグループ - http://hatenablog.com/g/12921228815715432734
• Facebookグループ - https://www.facebook.com/groups/778386365523431/
• インサイドXamarin(Build Insider) - http://www.buildinsider.net/mobile/insidexamarin
• Xamarin逆引きTips - http://www.buildinsider.net/mobile/xamarintips
• StackOverflow - http://stackoverflow.com/questions/tagged/monodroid+or+monotouch+or+xamarin?sort=active
41
Xamarin Advent Calendar 2013
ref http://qiita.com/advent-calendar/2013/xamarin42
What's Next?• Xamarin Test Cloud
• X-Platform MVVM Frameworks
• MvvmCross / QuickCross / ReactiveUI / etc
• Using Locations and Maps
• 第1回 Japan Xamarin User Group Conference (June 5 Tokyo)
• Xamarin Evolve 2014 (Oct 6-10)43
ありがとうございました
@amay077