Xamarin と React Native と Flutter の違いを正しく理解しよう

DroidKaigi2018 でもセッションがあった Flutter がβ版になりました。

これでまた、にわかにクロスプラットフォーム開発ツール(以下 "X-Plat Tool" と略)が盛り上がってる気がします。
Flutter が出たからと言って、Xamarin や React Native など、先行する様々な X-Plat Tools が死ぬわけでもなく、ただ選択肢が増えて嬉しいやら戸惑うやら、ということです。

ここでは、Flutter と、先行する React Native、Xamarin を(独断を交えて)比較して、それらの違いを見てみたいと思います。

共通化できる(とされる)プラットフォーム

X-Plat Tool がどのプラットフォームまでカバーするかを比べてみます。ツールそのものに加え、フレームワークや言語自体も含めた広範な考えです。

Platform Xamarin/.NET ReactNative/JavaScript Flutter/Dart
iOS :thumbsup: :thumbsup: :thumbsup:
Android :thumbsup: :thumbsup: :thumbsup:
デスクトップ(Windows) :thumbsup:
デスクトップ(Mac) :thumbsup:
Web(フロントエンド) :thumbsup: :thumbsup:
Web(バックエンド) :thumbsup: :thumbsup: :thumbsup:

概ね、デスクトップアプリに対応するか、Webアプリに対応するかで選択肢が大きく変わります。

開発者に提供される API

X-Plat Tool が開発者にどんな「API セット」を提供するかを比べてみましょう。
ここでは2つに分類してみます。

A. 開発者は、X-Plat Tool の 独自API を利用する

この方式の X-Plat Tool は、それ専用のAPIセットを開発者に提供します。
例えば Flutter では Stack というレイアウトクラスを提供しますが、これは Android の LinearLayout に近いものと考えられます。
あるいは JSX や XAML などの DSL(Domain Specific Language) を使用する場合もあります。React Native では画面のデザインは JSX(return で HTML っぽいタグを返すアレ) を使用します。

  • :no_good: 新たに API を学習する(=プラットフォーム固有のAPI知識が活かせない)必要がある
  • :no_good: プラットフォーム固有の機能を使用するには Kotlin や Swift などネイティブの開発言語をツールを使わなければならない(= APIの相互運用性が低い )
  • :ok_woman: 複数のプラットフォームでコードを共通化できる(イマサラナニヲイッテルンダ)
  • :no_good: "共通API" と言いながら iOS でしか(Android でしか)動作しないかも知れない1

B. 開発者は、プラットフォーム固有の (薄いラッパー)API を利用する

こちらの方式は、プラットフォーム固有の API を、X-Plat Tool の言語でラップして提供します。Xamarin(Xamarin.Android)では、Android SDK の API が、ほとんどそのまま C# から呼び出せます。例えば Android SDK の android.location.LocationManager は、 Xamarin では Android.Locations.LocationManager として利用できます。

  • :no_good: それ自体はコードの共通化にならない(言語の標準APIやフレームワークでしか共通化できない)
  • :ok_woman: プラットフォーム固有のAPIが X-Plat Tool の言語からダイレクトに呼び出せる(= APIの相互運用性が高い )
  • :ok_woman: (上記であることから)開発やデバッグが一つの環境でシームレスに行える

できあがったアプリケーションのユーザーインターフェース

アプリのUIは、エンドユーザーの反応に最も影響するため、特に注意が必要です。
こちらも2つに分類しています。

あ. ネイティブのUIパーツを利用する

この方式では、X-Plat Tool での UI定義は プラットフォーム固有の UIパーツ にマップされます。例えば React Native での <Text> タグは、Android では TextView 、iOS では UITextField が使用されます。

  • :no_good: 複数のプラットフォームのUIパーツ群で、共通で存在する機能しか提供できない
  • :ok_woman: エンドユーザーにネイティブの「忠実な」UIを提供できる
  • :ok_woman: プラットフォーム固有OSSライブラリが比較的利用しやすい(基本的にはブリッジしてあげれば良い = UIパーツの相互運用性が高い)

い. X-Plat Tool が自力でUIパーツを描画する

こちらの方式は、ネイティブのUIパーツは使わず、X-Plat Tool が持つレンダリングエンジンを使用して自力でUIパーツを描画し、マウスやキーボードのイベントも自力でハンドリングして操作感を提供します。
(インターネット老人会の皆さまには「Adobe の Flash アプリだよ」とでも言えば伝わるかと思います。)

  • :no_good: ネイティブのUIパーツと見た目や操作感が微妙に異なる(かも知れない)
  • :no_good: ネイティブのUIに比べて動作がもっさりする(かも知れない)2
  • :no_good: プラットフォーム固有OSSライブラリが比較的利用しにくい(独自レンダリングエンジンの影響を考慮する必要がある = UIパーツの相互運用性が低い)
  • :ok_woman: 「スタイル」を切り替えるだけで画面の Look and Feel を変更できる
  • :ok_woman: 複数のプラットフォームに「完全に同一のUI」を提供できる3

比較表

結局、言語もIDEも含めていろんな X-Plat Tools の比較表を作ってしまった。。。

  • Xamarin
  • React Native
  • Flutter
  • Titanium Mobile
  • RubyMotion
  • Qt
  • Delphi
  • Adobe AIR
  • NativeScript
  • RoboVM
  • Kotlin X-Plat(予想)
Xamarin ReactNative Flutter Titanium Mobile RubyMotion Qt Delphi Adobe Air Native Script RoboVM Kotlin X-Plat(予想)
(主な)提供者 Microsoft Facebook Google Appcelerator4 Scratchwork Qt Company Embarcadero Technologies5 Adobe Progress Software Xamarinが買収後死亡6 JetBrains
開発言語 C# JavaScript Dart JavaScript Ruby C++ Object Pascal Action Script JavaScript Java Kotlin
(主な)開発環境 Visual Studio As you like Android Studio Titanium Studio As you like As you like RAD Studio Flash Builder As you like Eclipse IntelliJ IDEA
対応Platform(言語含む) iOS, Android, Win, Mac, Web(Back) iOS, Android, Web(Front), Web(Back) iOS, Android, Web(Front), Web(Back) iOS, Android, Web(Front), Web(Back) iOS, Android, Web(Back) iOS, Android, Win, Mac, Web(Back) iOS, Android, Win, Mac iOS, Android, Win, Mac iOS, Android, Web(Front), Web(Back) iOS, Android, Win, Mac, Web(Back) iOS, Android, Win, Mac, Web(Front), Web(Back)
提供される API B.薄いラッパーAPI + A.独自API7 A.独自API A.独自API A.独自API B.薄いラッパーAPI A.独自API A.独自API + B.薄いラッパーAPI8 A.独自API A.独自API + B.薄いラッパーAPI9 B.薄いラッパーAPI B.薄いラッパーAPI
UIの提供方式 あ.ネイティブ あ.ネイティブ い.独自 あ.ネイティブ あ.ネイティブ あ.ネイティブ?10 い.独自 い.独自 あ.ネイティブ あ.ネイティブ あ.ネイティブ

月並みなまとめですが、クロスプラットフォーム開発ツールを選択するには、

  • ターゲットにするプラットフォーム
  • 提供者の規模、サポート、継続性
  • 開発言語や開発ツール vs チームメンバのスキルセット(あるいは習得容易性)

を評価し、さらに開発するアプリの性質に応じて、

  • X-Plat Tool の標準機能で行えない機能がどのくらいあるか?
  • X-Plat Tool の標準機能で行えない機能をどのように補完するか?(共通側で実装するか、ネイティブ側で実装するか、etc)

を検討することになると思います。
(もちろん X-Plat Tool を「採用しない」という選択肢も含めて。
あるいは Cordova のようなWebViewベースのX-Plat開発ツールもあれば、Unityのようなゲームエンジン系のX-Plat開発ツールも場合によっては候補になり得ます。)

例えば Flutter は美麗なアプリを迅速に開発できる、と謳われていますが、個人的には Webアプリプラットフォームの kintone をイメージさせます(対して Xamarin や React Native は Salesforce のような「なんでもできる」感があります)。標準で提供されるUIで要件を満たせるアプリは Flutter で十分だけど、それを超える要件なら他のツールを検討したいな、と感じます。

Kotlin Multi platform にはとても期待しています。うまく進化して流行ってくれれば、(現状での)モダンな言語で、プラットフォーム全方位な開発が実現できるんじゃないかなあ、と。

単純な比較表には現れない得意・不得意点もあるはずなので、日頃からアンテナ高く、できればたくさんつまみ食いしておきたいですね。

参考


  1. Titanium Mobile はこれが多かったという印象が深く心に刻まれています。。。 

  2. Flutter や DelphiXE(の FireMonkey) では GPU を利用した高速なレンダリングが可能になっているとのことです。 

  3. https://twitter.com/najeira/status/968774727022948352 を見て、同じ理由で昔 Flash AIR を使ったのを思い出しました。 

  4. Appcelerator は Axway に買収され、現在は小会社となっています。 

  5. Embarcadero Technologies は IDERA に買収され、現在は小会社となっています。 

  6. https://github.com/robovm にリポジトリはある模様。 

  7. Xamarin.Android, Xamarin.iOS などは 「B」、Xamarin.Forms というフレームワークは 「A」 に該当します。 

  8. Delphiならここまでできる︕ iOS / Androidネイティブアプリ構築術 参照。 

  9. NativeScript Documentation Chapter 6—Accessing Native APIs 参照。  

  10. エイリアンウィジェット と呼ばれるネイティブに依存しないViewも存在する模様。 

155contribution

Delphi の提供者は Embarcadero Technologies, Inc. で IDERA は Embarcadero の親会社です。
Delphi の名称は Delphi で XE, Tokyo などはバージョン番号です!

6718contribution

ありがとうございます、修正しました!
Titanium の提供企業の似たような状況だったので、併せて直してます。

2005contribution

お疲れ様でしたー。

「A.独自API」だけだと知らない人がウッ:confounded:となってしまいますが、大抵の場合どこかの言語やPFの文化圏を再現したものになっていることが多いと思うので、どこの文化に準拠しているのか添えると、そこ出身の人は親しみが持てそうだなあと思いました。

僕が把握している範囲だとこんな感じです

ツール 文化圏
Xamarin .NET
React Native JavaScript(ES2017)
Titanium Mobile JavaScript(ES2017)
Flutter Dart
Adobe AIR Flash/ActionScript 3.0
155contribution

Delphi には ControlType というプロパティがあり、これの値を native にするとネイティブコントロールが描画されます。ただ、現在の所 iOS, Windows のみサポートされていて、次のバージョン(Delphi 10.3)で Android のネイティブコントロールが実装される予定です。
ちなみに、Web(Back) と Linux にも対応しています(が、僕自身は Web の機能を使っていないので詳しくないです)
http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/WebBroker_%E3%81%AB%E3%82%88%E3%82%8B_Web_%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC_%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90

675contribution

たまにはRemObjects Elementsも思い出してあげてください

http://www.elementscompiler.com/elements/default.aspx

397contribution

Flutterの開発環境はAndroid Studioで良いんでしょうか? iOSの人はXcode使う? (正直どこまでiOS開発者に受け容れられるのか未知数)

あとKotlin/NativeもXcodeになるのかなーっていう印象が(何となく)あります。Xamarinと違って独自のUIデザイナーをもっていないので(IDEAに載る気もあまりしない…)

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.