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.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 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 です。 full と pdbonly はサポートされません。 |
$(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-android
は net8.0-android34.0
の短縮形です。 .NET の将来のバージョンでは、.NET リリース時に利用可能な最新の Android バージョンに追随します。
TargetFramework
は android:targetSdkVersion
にマップされます。 ビルド時に、この値は自動的に <uses-sdk/>
要素に含まれます。 この方法で使用 TargetFramework
する利点は、Android API 34 for net8.0-android34.0
. 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 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=true
と TrimMode=link
を設定します。 TrimMode=copyused
は .NET SDK の既定値ですが、モバイル アプリには適していません。 ただし、必要に応じて TrimMode=copyused
をオプトインすることもできます。
従来の AndroidLinkMode
設定が使用されている場合、SdkOnly
と Full
の両方が既定で同等のリンカー設定になります。
<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
関連項目
.NET MAUI
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示