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.config
や Foo.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 です。 full と pdbonly はサポートされません。 |
$(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-android
は net8.0-android34.0
の短縮形です。 .NET の将来のバージョンでは、.NET リリース時に利用可能な最新の Android バージョンが追跡されます。
TargetFramework
は android:targetSdkVersion
にマップされます。 ビルド時に、この値は自動的に <uses-sdk/>
要素に含まれます。 この方法で TargetFramework
を使用する利点は、net8.0-android34.0
の Android API 34 に C# バインディングが適用されることです。 Android は .NET リリース サイクルとは無関係にリリースされるため、次の Android リリースでバインディングを使用できる場合に柔軟に net8.0-android35.0
にオプトインできます。
同様に、SupportedOSPlatformVersion
は android: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=true
と TrimMode=partial
を設定します。
従来の AndroidLinkMode
設定が使用されている場合、SdkOnly
と Full
の両方が既定で同等のリンカー設定になります。
<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=true
と TrimMode=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
関連項目
.NET MAUI