Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
インサイドXamarin(7)

インサイドXamarin(7)

Xamarin.Androidの仕組みと、ソフトウェア構成

2016年10月21日 改訂 (初版:2014/3/19)

いよいよXamarin.Androidを取り上げる(全4回)。今回は、その基本的な仕組みやソフトウェア構成を説明。

榎本 温(@atsushieno
  • このエントリーをはてなブックマークに追加

 前回まではXamarin.iOSについて説明した。今回からは、4回にわたり、Xamarin.Androidを取り上げる。

Xamarin.Androidの基本的な仕組み

 今回はXamarin.Androidについて解説する。Xamarin.Androidの目的は、もちろんGoogle PlayにリリースできるAndroidアプリケーションを、C#やF#でmonoに基づいて開発できることにある。Xamarin.Androidのアプリケーションではmonoランタイムが動作し、Android上ではJITが問題なく使えるため、dynamic型も含めて、利用できるC# 6.0までの言語機能に制約はない。

 典型的なAndroidアプリケーションは、Android SDKを使用して、Java言語で書かれている。Androidアプリケーションの開発には、Javaを基本とするAndroid SDKと、C言語およびC++言語を基本とするAndroid NDKが使用できる。

 Xamarin.iOSがプラットフォームの規定する標準的な手法でアプリケーションパッケージ(.ipaファイル)を作成するのと同様に、Xamarin.Androidも、Android SDKが規定する標準的な手順でアプリケーションパッケージ(.apkファイル)を作成する。Xamarin.Androidアプリケーションでは、monoと、DalvikまたはART(いずれもAndroid独自のJavaランタイム)の2つが並行して動作する。C#のコードをJavaバイトコードに変換するものではない(そのアプローチでは多くの制限を抱えることになる)。逆に、Javaのフレームワークを呼び出す部分までCILコードに置き換えるものでもない(これは単に実現不可能だ)。

 (Xamarin.Androidの説明をする上ではDalvikとARTに本質的な違いは無いので、以降の連載でも「Androidのバイトコード仮想マシン」を含意する語句として「Dalvik」と記述する)。

 Android NDKでは、CおよびC++で完結するアプリケーションを作れるし、monoランタイムのビルドにAndroid SDKは必要ない。しかし、Android NDKが提供するAPIの基礎はJavaで実装されたアプリケーションフレームワークであって、そこから抜け出せるわけではない。Xamarin.Androidの目的は、Androidの標準的なAPIを自然な形で提供してアプリケーションを作成できることであって、monoを動かせればそれで終わりというわけではないので、Xamarin.Androidは、Android NDKのみを用いる100% CとC#の世界ではなく、Android SDKの提供するJavaのAPIをC#で呼び出せる、Javaと混在する世界を選んだ。

Androidフレームワークに基づくXamarin.Androidアプリケーションの仕組み

Xamarin.Androidのソフトウェア構成要素

 Xamarin.Androidのソフトウェアパッケージ構成は、Xamarin.iOSの構成と同様だ。iOS同様、Androidについても、パッケージのアップデートや個別ダウンロードの単位となっている。

(1)Xamarin.Android

 このパッケージの中には、「mono」(ランタイム、C#コンパイラ、Androidプロファイルのライブラリ)、APIバインディングである「Mono.Android.dll」、その他のモバイル・ライブラリ、ビルドおよびパッケージングのためのツールチェーンが含まれている。Xamarin.AndroidアプリケーションもiOS同様、主にプラットフォームのAPIであるMono.Android.dllを使用して作成することになる。

 Xamarin.Androidアプリケーションのビルドには、さまざまなツールがかんでいて(例えばAndroidリソースからのC#/F#リソースの生成、aapt(Android Asset Packaging Tool)ツールによるバイナリリソースの生成、Javaスタブコードの生成、javac(=Javaコンパイラー)によるコンパイル、.apkファイルの生成、パッケージ署名など)、ここで詳細に説明するのは困難だ。通常はIDEでF5キー一発で片付く問題だし、コンソールでもMSBuild.exe(Macならxbuild)が現実的だ。

 Xamarin.Androidも、2016年のマイクロソフトによる買収に伴い、Xamarin.Androidのアプリケーションの実行に必要な部分はオープンソース化され、xamarin-androidというリポジトリで公開されている。

(2)Xamarin Studio Androidアドイン

 このアドインも、iOSアドインと同様、プロジェクトテンプレートの提供から実行・デバッグまでの基本的な機能を提供する。さらに、このアドインはAndroid UIデザイナーを提供している。このUIデザイナーのUIプレビューは、Android Studioで使用されているものと同じものであり、Android開発の経験者が大きな違和感なく画面をデザインできるようになっている。

 Androidアプリケーションの実行とデバッグについては、次々回はで詳述する。

【コラム】Android UIデザイナーの仕組み

 AndroidのUIプレビュー機能は、AOSP(Android Open Source Project)に含まれている「layoutlib」を使用しているはずだ(正確には、このリポジトリには、レイアウトデザイナーのコードを自動生成するツールが含まれている)。EclipseやAndroid Studioはこれらを組み込んで利用している。UIプレビュー機能のみで、UIの編集機能は各自が実装している。これはXamarin Studioも同様だ(Xamarinではjavaプロセスを別途立ち上げる必要があるが)。

 UIデザイナーのもう1つの大きな特徴は、「Visual Studioとコードを共有している」という点だ。このUIデザイナーは、ほぼ同一のコードが、Visual Studioのアドインでも使われているのである。これは、Xamarinが開発している「Xwt」というクロスプラットフォームのGUIツールキットによって実現している。Xwtは、WindowsのWPFバックエンド、macOS/Mac OS XのMonoMacバックエンド、Linux上のGtk#バックエンド、を主に使用して、クロスプラットフォームを実現している。当然ながら、特定のプラットフォームでしか使用できない機能は削られる最大公約数アプローチであるため、プラットフォーム固有のAPIよりは機能の幅が狭い。またそもそも実装が足りない部分もある。しかしIDEアドインのUIを構築するにはこれで十分だ。

 MonoDevelopには、Gtk#を対象にしたGUIデザイナーがあり、これはMono用に設計されている。Xamarin独自の設計機能は、そのコードと経験を生かして(Xwtで)作られているといえる。

(3)Visual Studio Androidアドイン

 Xamarin.AndroidのVisual Studioアドインは、Xamarin.iOS対応のために存在するコードに比べると、比較的軽量といえる。開発にMacが必須であったために、長らくMacのみを念頭において開発されていたXamarin.iOSとは異なり、最初からクロスプラットフォームで動作できるはずであったXamarin.Androidでは、当初からVisual Studioをサポートする計画があった。Visual Studioでビルドする必要がある以上、ビルドシステムはXamarin StudioでもMSBuildで統一している。その方が楽だからだ。前述の通り、UIデザイナーも最初からクロスプラットフォームで開発されていた。Xwtで実装されたものはそれまで存在しなかったが、Xwt自体はUIデザイナー開発以前からあったので、最初から最適解として採用された。

 Visual Studio上での操作に固有の問題がある場合は(特にWindows上にはXamarin Studioもインストールできるので、その挙動を確認することもできる)、このパッケージを古いものに差し替えることができるかもしれない(iOSの場合と異なり、MSBuildのツールはXamarin.Android本体にある、という点は留意されたい)。

(4)サンプルコード

 これは配布パッケージには含まれないが、Xamarin.AndroidのサンプルはGitHubのリポジトリに多数存在しているので、この中を参照されたい。分かりやすい例では、Android SDKに含まれる「ApiDemos」の一部を移植した「ApiDemo」というプロジェクトが含まれている。

 次回は、Xamarin.Androidの主要なクラスライブラリを紹介し、次々回はXamarin.Androidアプリの作成、ビルド、実行とデバッグについて説明する。

※以下では、本稿の前後を合わせて5回分(第5回~第9回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

インサイドXamarin(7)
5. Xamarin.iOSの仕組みとアプリケーションの構成

いよいよXamarin.iOSを取り上げる。その仕組みや、Xamarin.iOSアプリの作成/ビルド/実行とデバッグなどについて解説。

インサイドXamarin(7)
6. Xamarin.iOSで使用するライブラリ

Xamarin.iOS解説の後編。iOSの.NET APIである「monotouch.dll」や、Xamarin.iOS向けの追加ライブラリなどについて説明。

インサイドXamarin(7)
7. 【現在、表示中】≫ Xamarin.Androidの仕組みと、ソフトウェア構成

いよいよXamarin.Androidを取り上げる(全4回)。今回は、その基本的な仕組みやソフトウェア構成を説明。

インサイドXamarin(7)
8. Xamarin.Androidで使用するライブラリ

Androidの.NET APIに相当する「Mono.Android.dll」の特徴と注意事項、さらにAndroidサポートパッケージやGoogle Play Servicesについて説明する。

インサイドXamarin(7)
9. Xamarin.Androidアプリの開発

Xamarin.Androidアプリの作成/ビルド/実行とデバッグに関する重要ポイントついて解説する。

サイトからのお知らせ

Twitterでつぶやこう!