Xamarin.Android プロジェクトの移行

.NET Android アプリの .NET 8 プロジェクトは、次の例のようになります。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0-android</TargetFramework>
    <OutputType>Exe</OutputType>
  </PropertyGroup>
</Project>

ライブラリ プロジェクトの場合は、$(OutputType) プロパティを完全に省略するか、プロパティ値として Library を指定します。

.NET 構成ファイル

.NET Android プロジェクトでは、Foo.dll.configFoo.exe.config などの構成ファイルはサポートされていません。 <dllmap> 構成要素は .NET Core ではサポートされておらず、System.Configuration.ConfigurationManager などの互換性パッケージの他の要素タイプは Android プロジェクトではサポートされていません。

MSBuild プロパティの変更

$(AndroidSupportedAbis) プロパティは使用しないでください。

<PropertyGroup>
  <!-- Used in Xamarin.Android projects -->
  <AndroidSupportedAbis>armeabi-v7a;arm64-v8a;x86;x86_64</AndroidSupportedAbis>
</PropertyGroup>

代わりに、$(AndroidSupportedAbis) プロパティを .NET ランタイム識別子に置き換える必要があります。

<PropertyGroup>
  <!-- Used in .NET Android projects -->
  <RuntimeIdentifiers>android-arm;android-arm64;android-x86;android-x64</RuntimeIdentifiers>
</PropertyGroup>

ランタイム識別子の詳細については、「.NET の RID カタログ」を参照してください。

次の表に、.NET Android で変更されたその他の MSBuild プロパティを示します。

プロパティ Comments
$(AndroidUseIntermediateDesignerFile) 既定では True です。
$(AndroidBoundExceptionType) 既定では System です。 このプロパティは、Xamarin.Android との互換性を犠牲にして、.NET セマンティクスに合わせてさまざまなメソッドからスローされる例外の種類を変更します。 詳細については、「新しくラップされた Java 例外の一部で、関連する BCL 型とは異なる BCL 例外を使用する方法」を参照してください。
$(AndroidClassParser) 既定では class-parse です。 jar2xml はサポートされていません。
$(AndroidDexTool) 既定では d8 です。 dx はサポートされていません。
$(AndroidCodegenTarget) 既定では XAJavaInterop1 です。 XamarinAndroid はサポートされていません。
$(AndroidManifest) Properties\AssemblyInfo.cs は SDK スタイルのプロジェクトでは使用されなくなったため、プロジェクトのルートでは既定で AndroidManifest.xml になります。 Properties\AndroidManifest.xml も検出され、存在する場合は移行を容易にするために使用されます。
$(DebugType) 既定では portable です。 fullpdbonly はサポートされません。
$(MonoSymbolArchive) mono-symbolicate はサポートされていないため、False になります。

さらに、Java バインディングが @(InputJar)@(EmbeddedJar)、または @(LibraryProjectZip) で有効になっている場合、$(AllowUnsafeBlocks) プロパティは既定で True になります。

Note

Android アプリからの Android Wear プロジェクトの参照はサポートされていません。

AndroidManifest.xml への変更

Xamarin.Android、Java、Kotlin Android プロジェクトでは、<uses-sdk/> 要素はアプリがサポートする Android の最小バージョンと、アプリがコンパイルされるターゲット Android バージョンを示します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="1.0"
    package="com.companyname.myapp">
  <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />
  <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" />
</manifest>

<uses-sdk/> 要素の詳細については、「Android ドキュメント」を参照してください。

.NET 8 Android アプリには、これらの値を設定するための MSBuild プロパティがあります。 MSBuild プロパティの使用には、他にも利点があります。 ほとんどの場合、<uses-sdk/> 要素はプロジェクトの .csproj ファイルの値を優先して削除する必要があります。

<Project>
  <PropertyGroup>
    <TargetFramework>net8.0-android</TargetFramework>
    <SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>
  </PropertyGroup>
</Project>

この例では、net8.0-androidnet8.0-android34.0 の短縮形です。 .NET の将来のバージョンでは、.NET リリース時に利用可能な最新の Android バージョンに追随します。

TargetFrameworkandroid:targetSdkVersion にマップされます。 ビルド時に、この値は自動的に <uses-sdk/> 要素に含まれます。 この方法で使用 TargetFramework する利点は、Android API 34 for net8.0-android34.0. Android は .NET リリース サイクルとは無関係にリリースされるため、次の Android リリースでバインドを使用できる場合に柔軟に net8.0-android35.0 オプトインできます。

同様に、SupportedOSPlatformVersionandroid:minSdkVersion にマッピングされます。 ビルド時に、この値は自動的に <uses-sdk/> 要素に含まれます。 Android API は SupportedOSPlatformAttribute で修飾されているため、アプリを実行できる一部の Android バージョンでのみ利用可能な API を呼び出すとビルド警告が表示されます。

error CA1416: This call site is reachable on 'Android' 21.0 and later. `ConnectivityManager.ActiveNetwork` is only supported on: 'Android' 23.0 and later.

この API を安全に使用するには、プロジェクトでより高い SupportedOSPlatformVersion を宣言するか、実行時に IsAndroidVersionAtLeast API を使用します。

if (OperatingSystem.IsAndroidVersionAtLeast(23))
{
    // Use the API here
}

既定のファイル インクルード

既定の .NET Android 関連ファイルのグロブ動作は、AutoImport.props で定義されています。 Android の項目に対してこの動作を無効にするには、$(EnableDefaultAndroidItems)false に設定します。また、すべての既定の項目を包含する動作は、$(EnableDefaultItems)false に設定して無効にできます。 詳細については、「ワークロード props ファイル」を参照してください。

ランタイムの動作

String.IndexOf() メソッドの動作はさまざまなプラットフォーム上の .NET 5 以降で変更されています。 詳細については、「.NET グローバリゼーションと ICU」を参照してください。

リンカー

.NET 5 以降には、リンカーの新しい設定があります。

  • <PublishTrimmed>true</PublishTrimmed>
  • <TrimMode>link</TrimMode> は、要素レベルのトリミングを有効にします。

詳細については、「トリミングのオプション」を参照してください。

.NET Android プロジェクトでは、Debug ビルドは既定でリンカーを使用せず、Release ビルドは PublishTrimmed=trueTrimMode=link を設定します。 TrimMode=copyused は .NET SDK の既定値ですが、モバイル アプリには適していません。 ただし、必要に応じて TrimMode=copyused をオプトインすることもできます。

従来の AndroidLinkMode 設定が使用されている場合、SdkOnlyFull の両方が既定で同等のリンカー設定になります。

  • <PublishTrimmed>true</PublishTrimmed>
  • <TrimMode>link</TrimMode>

AndroidLinkMode=SdkOnly を使用すると、%(Trimmable) とマークされた BCL アセンブリと SDK アセンブリのみが要素レベルでリンクされます。 AndroidLinkMode=Full は、すべての .NET アセンブリに %(TrimMode)=link を設定します。

ヒント

AndroidLinkMode 設定は最終的に非推奨になるため、新しいリンカー設定に移行する必要があります。

先取りコンパイル

$(RunAOTCompilation) は、先取り (AOT) コンパイルを有効にするための新しい MSBuild プロパティです。 これは、Blazor WASM で使用されるのと同じプロパティです。 $(AotAssemblies) プロパティでは、Xamarin.Android プロジェクトから .NET Android プロジェクトへの移行に役立つ AOT も有効になります。

ヒント

.NET 7 から非推奨であるため$(AotAssemblies)、新しい$(RunAOTCompilation)プロパティに移行する必要があります。

リリース ビルドの既定値は、次の AOT プロパティ値です。

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
  <RunAOTCompilation>true</RunAOTCompilation>
  <AndroidEnableProfiledAot>true</AndroidEnableProfiledAot>
</PropertyGroup>

これは、$(RunAOTCompilation) プロパティと $(AndroidEnableProfiledAot) プロパティが設定されていない場合の動作であり、起動時間とアプリ サイズに最適な設定を選択します。

AOT を無効にするには、$(RunAOTCompilation) プロパティと $(AndroidEnableProfiledAot) プロパティを false に明示的に設定する必要があります。

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
  <RunAOTCompilation>false</RunAOTCompilation>
  <AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>
</PropertyGroup>

サポートされているエンコード

Xamarin.Android アプリで特定の国際コードセットを使用する場合は、リンカーにサポート リソースを含めることができるように、Mandroidl18n MSBuild プロパティを使用してプロジェクト ファイルで明示的に指定する必要があります。 このビルド プロパティの詳細については、「MAndroidl18n」を参照してください。

ただし、Mandroidl18n MSBuild プロパティは .NET Android アプリではサポートされていません。 代わりに、System.TextEncoding.CodePages NuGet パッケージによってサポートが提供されます。 詳細については、CodePagesEncodingProviderを参照してください。

.NET CLI

.NET Android では、.NET コマンドライン インターフェイス (.NET CLI) を使用して Android アプリを作成、ビルド、発行、および実行できます。

dotnet new

dotnet new を使用すると、既存の .NET テンプレートのパターンと名前付けに従って名前が付けられたプロジェクト テンプレートと項目テンプレートを使用して、新しい .NET Android のプロジェクトと項目を作成することができます。

[テンプレート] 短い形式の名前 言語 タグ
Android アクティビティ テンプレート android-activity C# Android
Android Java ライブラリ バインド android-bindinglib C# Android
Android レイアウト テンプレート android-layout C# Android
Android クラス ライブラリ androidlib C# Android
Android アプリケーション Android C# Android

次の例では、dotnet new を使用して、さまざまな種類の .NET Android プロジェクトを作成する方法を示します。

dotnet new android            --output MyAndroidApp     --packageName com.mycompany.myandroidapp
dotnet new androidlib         --output MyAndroidLibrary
dotnet new android-bindinglib --output MyJavaBinding

.NET Android プロジェクトが作成されたら、項目テンプレートを使用してプロジェクトに項目を追加できます。

dotnet new android-activity --name LoginActivity --namespace MyAndroidApp
dotnet new android-layout   --name MyLayout      --output Resources/layout

dotnet build & publish

.NET Android の場合、dotnet build は実行可能なアプリを生成します。 つまり、ビルド プロセス中に .apk または .aab のファイルを作成し、ビルド中に実行されるように MSBuild タスクを .NET SDK から並べ替えます。 そのため、.NET Android はビルド中に次の処理を行います。

  • aapt を実行して Resource.designer.cs を生成し、@(AndroidResource) ファイル内の問題のビルド エラーを出力する可能性があります。
  • C# コードをコンパイルします。
  • リンク用の ILLink MSBuild ターゲットを実行します。
  • Java スタブと AndroidManifest.xml を生成します。
  • javac を使用して Java コードをコンパイルします。
  • java コードを d8/r8 経由で .dex に変換します。
  • .apk または .aab を作成し、署名します。

dotnet publish は、Google Play やその他の配布メカニズム (アドホックなど) 用のアプリを公開するために予約されています。 また、異なるキーを使用して、.apk または .aab に署名します。

Note

IDE 内での動作は異なります。 $(BuildingInsideVisualStudio)true の場合、Build ターゲットは .apk ファイルを生成しません。 IDE によってデプロイ用に Install ターゲットが呼び出され、.apk ファイルが生成されます。 この動作は Xamarin.Android と一致します。

dotnet run

dotnet run は、--project 引数を使用してデバイスまたはエミュレーターでアプリを起動するために使用できます。

dotnet run --project HelloAndroid.csproj

または、Run MSBuild ターゲットを使用することもできます。

dotnet build HelloAndroid.csproj -t:Run

関連項目