.NET for Android ビルド プロセスは、Resource.designer.cs
のの調整、@(AndroidAsset)
、@(AndroidResource)
、その他のビルド アクションのサポートAndroid 呼び出し可能ラッパー の生成 Android デバイスでの実行のための.apk
の生成など、すべてを接着する役割を担います。
アプリケーション パッケージ
大まかに言えば、.NET for Android ビルド システムで生成できる Android アプリケーション パッケージ (.apk
ファイル) には、次の 2 種類があります。
リリース ビルドは、実行に追加パッケージを必要としない、完全な自己完結型です。 アプリ ストアに提供されるのはこれらのパッケージです。
デバッグ ビルドではありません。
これらのパッケージの種類は、パッケージを生成する MSBuild Configuration
に一致します。
高速デプロイ
"高速展開" は、Android アプリケーション パッケージのサイズをさらに縮小することで機能します。 これは、アプリのアセンブリをパッケージから除外し、代わりにアプリケーションの内部 files
ディレクトリ (通常は /data/data/com.some.package
にあります) にアプリのアセンブリを直接展開することによって行われます。 内部 files
ディレクトリはグローバルに書き込み可能なフォルダーではないため、run-as
ツールを使用してすべてのコマンドを実行し、そのディレクトリにファイルをコピーします。
このプロセスにより、ビルド、展開、デバッグのサイクルが高速化されます。変更がアセンブリ "のみ" の場合、パッケージは再インストールされず、 更新されたアセンブリだけがターゲット デバイスに再同期されるからです。
警告
高速展開は、多くの場合に Android 5.0 より古いデバイスなど、run-as
をブロックするデバイスで失敗することがわかっています。
高速展開は、既定で有効になっており、$(EmbedAssembliesIntoApk)
プロパティを True
に設定することで、デバッグ ビルドで無効にすることができます。
この機能と高速展開の強化モードを組み合わせて使用することで、展開をさらに高速化することができます。
これにより両方のアセンブリ、ネイティブ ライブラリ、typemap、および dex が files
ディレクトリに展開されます。 ただし、これを有効にする必要があるのは、ネイティブ ライブラリ、バインド、または Java コードを変更する場合だけです。
MSBuild プロジェクト
.NET for Android ビルド プロセスは、MSBuild に基づいています。MSBuild は、Visual Studio for Mac および Visual Studio で使用されるプロジェクト ファイル形式でもあります。 通常、ユーザーは、MSBuild ファイルを手動で編集する必要はありません – IDE によって完全に機能するプロジェクトが作成され、変更があれば更新され、必要に応じて自動的にビルド ターゲットが呼び出されます。
上級ユーザーが IDE の GUI でサポートされていないことを行えるように、ビルド プロセスは、プロジェクト ファイルを直接編集することでカスタマイズできるようになっています。 このページでは、Android 固有の機能とカスタマイズ用の .NET についてのみ説明します。通常の MSBuild 項目、プロパティ、およびターゲットでは、さらに多くのことが可能です。
プロジェクトのバインド
次の MSBuild プロパティは、バインド プロジェクトで使用されます。
Resource.designer.cs
の生成
次の MSBuild プロパティは、Resource.designer.cs
ファイルの生成を制御するために使用されます。
$(AndroidAapt2CompileExtraArgs)
$(AndroidAapt2LinkExtraArgs)
$(AndroidExplicitCrunch)
$(AndroidR8IgnoreWarnings)
$(AndroidResgenExtraArgs)
$(AndroidResgenFile)
$(AndroidUseAapt2)
$(MonoAndroidResourcePrefix)
署名プロパティ
署名プロパティは、アプリケーション パッケージを Android デバイスにインストールできるように、パッケージに署名する方法を制御します。 ビルドのイテレーションを高速化するために、.NET for Android タスクはビルド プロセス中にパッケージに署名しません。これは、署名が非常に遅いためです。 代わりに、インストール前またはエクスポート中に、IDE または Install ビルド ターゲットによって署名されます (必要な場合)。 SignAndroidPackage ターゲットを呼び出すと、出力ディレクトリに -Signed.apk
のサフィックスを持つパッケージが生成されます。
既定では、必要に応じて署名ターゲットによって新しいデバッグ署名キーが生成されます。 たとえば、ビルド サーバーなどで特定のキーを使用する場合は、次の MSBuild プロパティが使用されます。
$(AndroidDebugKeyAlgorithm)
$(AndroidDebugKeyValidity)
$(AndroidDebugStoreType)
$(AndroidKeyStore)
$(AndroidSigningKeyAlias)
$(AndroidSigningKeyPass)
$(AndroidSigningKeyStore)
$(AndroidSigningStorePass)
$(JarsignerTimestampAuthorityCertificateAlias)
$(JarsignerTimestampAuthorityUrl)
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>
拡張ポイントを構築する
.NET for Android ビルド システムでは、ビルド プロセスにフックするユーザー向けのパブリック拡張ポイントがいくつか公開されています。 これらの拡張ポイントのいずれかを使用するには、PropertyGroup
の適切な MSBuild プロパティにカスタム ターゲットを追加する必要があります。 次に例を示します。
<PropertyGroup>
<AfterGenerateAndroidManifest>
$(AfterGenerateAndroidManifest);
YourTarget;
</AfterGenerateAndroidManifest>
</PropertyGroup>
拡張ポイントには、次のものが含まれます。
- `$(AfterGenerateAndroidManifest)
- '$(AndroidPrepareForBuildDependsOn)
- `$(BeforeGenerateAndroidManifest)
$(BeforeBuildAndroidAssetPacks)
ビルド プロセスの延長に関する注意点: 正しく記述されていないと、ビルドの拡張機能がビルドのパフォーマンスに影響を与える可能性があります (特に、拡張機能がすべてのビルドで実行される場合)。 このような拡張機能を実装する前に、MSBuild のドキュメントを読むことを強くお勧めします。
ターゲット定義
ビルド プロセスの .NET for 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" />
このファイルは、他の言語に簡単に適合させることができます。