ビルド プロセス

Xamarin.Android ビルド プロセスは、Resource.designer.cs の生成@(AndroidAsset)@(AndroidResource)、およびその他のビルド アクションのサポート、Android 呼び出し可能なラッパーの生成、Android デバイスでの実行に向けた .apk の生成の、すべてを結び付ける役割を担っています。

アプリケーション パッケージ

Xamarin.Android ビルド システムが生成できる Android アプリケーション パッケージ (.apk ファイル) には、大まかに次の 2 種類があります。

  • リリース ビルドは、実行に追加パッケージを必要としない、完全な自己完結型です。 アプリ ストアに提供されるのはこれらのパッケージです。

  • デバッグ ビルドではありません。

これらのパッケージの種類は、パッケージを生成する MSBuild Configuration に一致します。

共有ランタイム

Xamarin Android 11.2 より前のバージョンでは、"共有ランタイム" は、基本クラス ライブラリ (mscorlib.dll など) を提供する追加の Android パッケージと Android バインド ライブラリ (Mono.Android.dll など) のペアでした。 デバッグ ビルドは共有ランタイムに依存して、基本クラス ライブラリとバインド アセンブリを Android アプリケーション パッケージ内に含める代わりに、デバッグ パッケージをより小さくできるようにします。

共有ランタイムは、$(AndroidUseSharedRuntime) プロパティを False に設定します。

共有ランタイムのサポートは、Xamarin. Android 11.2 で削除されました。

高速展開

"高速展開" は、Android アプリケーション パッケージのサイズをさらに縮小することで機能します。 これは、アプリのアセンブリをパッケージから除外し、代わりにアプリケーションの内部 files ディレクトリ (通常は /data/data/com.some.package にあります) にアプリのアセンブリを直接展開することによって行われます。 内部 files ディレクトリはグローバルに書き込み可能なフォルダーではないため、run-as ツールを使用してすべてのコマンドを実行し、そのディレクトリにファイルをコピーします。

このプロセスにより、ビルド、展開、デバッグのサイクルが高速化されます。変更がアセンブリ "のみ" の場合、パッケージは再インストールされず、 更新されたアセンブリだけがターゲット デバイスに再同期されるからです。

警告

高速展開は、多くの場合に Android 5.0 より古いデバイスなど、run-as をブロックするデバイスで失敗することがわかっています。

高速展開は、既定で有効になっており、$(EmbedAssembliesIntoApk) プロパティを True に設定することで、デバッグ ビルドで無効にすることができます。

この機能と高速展開の強化モードを組み合わせて使用することで、展開をさらに高速化することができます。 これにより両方のアセンブリ、ネイティブ ライブラリ、typemap、および dex が files ディレクトリに展開されます。 ただし、これを有効にする必要があるのは、ネイティブ ライブラリ、バインド、または Java コードを変更する場合だけです。

MSBuild プロジェクト

Xamarin.Android ビルド プロセスは、Visual Studio for Mac と Visual Studio で使用されるプロジェクト ファイル形式でもある MSBuild に基づいています。 通常、ユーザーは、MSBuild ファイルを手動で編集する必要はありません – IDE によって完全に機能するプロジェクトが作成され、変更があれば更新され、必要に応じて自動的にビルド ターゲットが呼び出されます。

上級ユーザーが IDE の GUI でサポートされていないことを行えるように、ビルド プロセスは、プロジェクト ファイルを直接編集することでカスタマイズできるようになっています。 このページでは、Xamarin.Android 固有の機能とカスタマイズのみを文書化しています - 通常の MSBuild 項目、プロパティおよびターゲットを使用して、さらに多くのことができます。

プロジェクトのバインド

次の MSBuild プロパティは、バインド プロジェクトで使用されます。

Resource.designer.cs の生成

次の MSBuild プロパティは、Resource.designer.cs ファイルの生成を制御するために使用されます。

署名プロパティ

署名プロパティは、アプリケーション パッケージを Android デバイスにインストールできるように、パッケージに署名する方法を制御します。 ビルド イテレーションを高速化するため、Xamarin.Android タスクではビルド プロセス中のパッケージへの署名は行われません。署名を行うと非常に遅くなるからです。 代わりに、インストール前またはエクスポート中に、IDE または Install ビルド ターゲットによって署名されます (必要な場合)。 SignAndroidPackage ターゲットを呼び出すと、出力ディレクトリに -Signed.apk のサフィックスを持つパッケージが生成されます。

既定では、必要に応じて署名ターゲットによって新しいデバッグ署名キーが生成されます。 たとえば、ビルド サーバーなどで特定のキーを使用する場合は、次の MSBuild プロパティが使用されます。

keytool オプションのマッピング

次の keytool の呼び出しについて考えてみましょう。

$ keytool -genkey -v -keystore filename.keystore -alias keystore.alias -keyalg RSA -keysize 2048 -validity 10000
Enter keystore password: keystore.filename password
Re-enter new password: keystore.filename password
...
Is CN=... correct?
  [no]:  yes

Generating 2,048 bit RSA key pair and self-signed certificate (SHA1withRSA) with a validity of 10,000 days
        for: ...
Enter key password for keystore.alias
        (RETURN if same as keystore password): keystore.alias password
[Storing filename.keystore]

上記で生成されたキーストアを使用するには、プロパティ グループを使用します。

<PropertyGroup>
    <AndroidKeyStore>True</AndroidKeyStore>
    <AndroidSigningKeyStore>filename.keystore</AndroidSigningKeyStore>
    <AndroidSigningStorePass>keystore.filename password</AndroidSigningStorePass>
    <AndroidSigningKeyAlias>keystore.alias</AndroidSigningKeyAlias>
    <AndroidSigningKeyPass>keystore.alias password</AndroidSigningKeyPass>
</PropertyGroup>

拡張ポイントをビルドする

Xamarin Android のビルド システムでは、ビルド プロセスに接続するユーザー向けに、いくつかのパブリック拡張ポイントが公開されています。 これらの拡張ポイントのいずれかを使用するには、PropertyGroup の適切な MSBuild プロパティにカスタム ターゲットを追加する必要があります。 次に例を示します。

<PropertyGroup>
   <AfterGenerateAndroidManifest>
      $(AfterGenerateAndroidManifest);
      YourTarget;
   </AfterGenerateAndroidManifest>
</PropertyGroup>

拡張ポイントには、次のものが含まれます。

ビルド プロセスの延長に関する注意点: 正しく記述されていないと、ビルドの拡張機能がビルドのパフォーマンスに影響を与える可能性があります (特に、拡張機能がすべてのビルドで実行される場合)。 このような拡張機能を実装する前に、MSBuild のドキュメントを読むことを強くお勧めします。

ターゲットの定義

ビルド プロセスの Xamarin.Android に固有の部分は、$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets で定義されますが、アセンブリをビルドするためには、Microsoft.CSharp.targets などの通常の言語固有ターゲットも必要です。

次のビルド プロパティは、ターゲットの言語をインポートする前に設定する必要があります。

<PropertyGroup>
  <TargetFrameworkIdentifier>MonoDroid</TargetFrameworkIdentifier>
  <MonoDroidVersion>v1.0</MonoDroidVersion>
  <TargetFrameworkVersion>v2.2</TargetFrameworkVersion>
</PropertyGroup>

Xamarin.Android.CSharp.targets をインポートすることで、C# 用にこれらすべてのターゲットとプロパティを含めることができます。

<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />

このファイルは、他の言語に簡単に適合させることができます。