次の方法で共有


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

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

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

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

.NET 構成ファイル

.NET for 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 for Android projects -->
  <RuntimeIdentifiers>android-arm;android-arm64;android-x86;android-x64</RuntimeIdentifiers>
</PropertyGroup>

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

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

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

また、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 プロパティの使用には、他にも利点があります。 ほとんどの場合、プロジェクトの .csproj ファイル内の値を優先して <uses-sdk/> 要素を削除する必要があります。

<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 を使用する利点は、net8.0-android34.0 の Android API 34 に C# バインディングが適用されることです。 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 for Android 関連のファイルのグロビング動作は、AutoImport.props で定義されています。 $(EnableDefaultAndroidItems)false に設定すると、Android 項目に対してこの動作を無効にできます。また、$(EnableDefaultItems)false に設定すると、すべての既定の項目のインクルージョンの動作を無効にできます。 詳細については、「ワークロード props ファイル」をご覧ください。

ランタイムの動作

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

リンカー

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

  • <PublishTrimmed>true</PublishTrimmed>
  • <TrimMode>partial</TrimMode>: トリミングにオプトインしたアセンブリをトリミングします。

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

.NET for Android プロジェクトでは、既定では、Debug ビルドはリンカーを使用せず、Release ビルドは PublishTrimmed=trueTrimMode=partial を設定します。

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

  • <PublishTrimmed>true</PublishTrimmed>
  • <TrimMode>partial</TrimMode>

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

ヒント

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

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

  • <TrimMode>Full</TrimMode>:フル トリミングを実行します。

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

.NET for Android プロジェクトでは、既定では、Debug ビルドはリンカーを使用せず、Release ビルドは PublishTrimmed=trueTrimMode=partial を設定します。

Ahead-Of-Time コンパイル

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

リリース ビルドの既定値は、次の 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 for Android アプリではサポートされていません。 代わりに、System.TextEncoding.CodePages NuGet パッケージによってサポートが提供されます。 詳細については、CodePagesEncodingProviderを参照してください。

.NET CLI

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

dotnet new

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

Template 短い形式の名前 言語 タグ
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 for Android プロジェクトを作成する方法を示しています。

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

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

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

Dotnet Build と発行

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

  • aapt を実行して Resource.designer.cs を生成し、@(AndroidResource) ファイル内の問題のビルド エラーを出力する可能性があります。
  • C# コードをコンパイルします。
  • リンク用の ILLink MSBuild ターゲットを実行します。
  • Java スタブと AndroidManifest.xml を生成します。
  • javac を使用して Java コードをコンパイルします。
  • d8/r8 を使用して java コードを .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

関連項目