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 속성을 보여줍니다.

속성 설명
$(AndroidUseIntermediateDesignerFile) 기본적으로 True입니다.
$(AndroidBoundExceptionType) 기본적으로 System입니다. 이 속성은 Xamarin.Android와의 호환성을 위해 .NET 의미 체계에 맞게 다양한 메서드에서 throw된 예외 유형을 변경합니다. 자세한 내용은 관련 BCL 형식과 다른 BCL 예외를 사용하는 새 래핑된 Java 예외 중 일부를 참조 하세요.
$(AndroidClassParser) 기본적으로 class-parse입니다. jar2xml는 지원되지 않습니다.
$(AndroidDexTool) 기본적으로 d8입니다. dx는 지원되지 않습니다.
$(AndroidCodegenTarget) 기본적으로 XAJavaInterop1입니다. XamarinAndroid는 지원되지 않습니다.
$(AndroidManifest) AndroidManifest.xml SDK 스타일 프로젝트에서 더 이상 사용되지 않으므로 Properties\AssemblyInfo.cs 기본값은 프로젝트의 루트에 있습니다. Properties\AndroidManifest.xml 또한 마이그레이션을 용이하게 하기 위해 검색되어 있는 경우 사용됩니다.
$(DebugType) 기본적으로 portable입니다. fullpdbonly 는 지원되지 않습니다.
$(MonoSymbolArchive) Falsemono-symbolicate 는 지원되지 않으므로

또한 Java 바인딩을 사용 하도록 설정 @(InputJar)하는 경우 , @(EmbeddedJar)또는 @(LibraryProjectZip), 속성이 $(AllowUnsafeBlocks) 기본값으로 합니다 True.

참고 항목

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 버전을 추적합니다.

TargetFrameworkandroid:targetSdkVersion에 매핑됩니다. 빌드 시 이 값은 자동으로 요소에 <uses-sdk/> 포함됩니다. 이러한 방식으로 사용하면 TargetFramework Android API 34 net8.0-android34.0에 대해 일치하는 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 API를 선언하거나 런타임에 API를 IsAndroidVersionAtLeast 사용할 수 있습니다.

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

기본 파일 포함

기본 .NET Android 관련 파일 globbing 동작은 에 정의되어 있습니다 AutoImport.props. 이 동작은 Android 항목에 대해 설정하여 사용하지 않도록 설정할 $(EnableDefaultAndroidItems)false수 있습니다. 또는 모든 기본 항목 포함 동작은 다음으로 설정하여 사용하지 않도록 설정할 $(EnableDefaultItems)false수 있습니다. 자세한 내용은 Workload props 파일을 참조 하세요.

런타임 동작

.NET 5 이상에서는 다른 플랫폼의 String.IndexOf() 메서드에 대한 동작 변경 내용이 있습니다. 자세한 내용은 .NET 세계화 및 ICU를 참조하세요.

링커

.NET 5+에는 링커에 대한 새 설정이 있습니다.

  • <PublishTrimmed>true</PublishTrimmed>
  • <TrimMode>link</TrimMode>- 멤버 수준 트리밍을 사용하도록 설정합니다.

자세한 내용은 트리밍 옵션을 참조 하세요.

기본적으로 Debug .NET Android 프로젝트에서 빌드는 링커를 사용하지 않으며 빌드 집합 PublishTrimmed=trueReleaseTrimMode=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 마이그레이션해야 합니다.

Ahead-of-Time 컴파일

$(RunAOTCompilation) 는 AoT(Ahead-of-Time) 컴파일을 사용하도록 설정하는 새로운 MSBuild 속성입니다. Blazor WASM사용되는 것과 동일한 속성입니다. 또한 이 속성은 $(AotAssemblies) Xamarin.Android 프로젝트에서 .NET Android 프로젝트로 마이그레이션하는 데 도움이 되도록 AOT를 사용하도록 설정합니다.

.NET 7에서 더 이상 사용되지 않으므로 새 $(RunAOTCompilation) 속성 $(AotAssemblies) 으로 마이그레이션해야 합니다.

릴리스 빌드는 기본적으로 다음 AOT 속성 값으로 설정됩니다.

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

이 동작은 속성이 $(AndroidEnableProfiledAot) 설정되지 않은 경우 $(RunAOTCompilation) 동작이며 시작 시간 및 앱 크기에 대한 최적의 설정을 선택합니다.

AOT를 사용하지 않도록 설정하려면 다음과 같은 속성을 명시적으로 설정 $(RunAOTCompilation)$(AndroidEnableProfiledAot) 해야 합니다 false.

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

지원되는 인코딩

Xamarin.Android 앱에서 특정 국제 코드 세트를 사용하는 경우 링커에 지원 리소스를 포함할 수 있도록 MSBuild 속성을 사용하여 Mandroidl18n 프로젝트 파일에서 명시적으로 지정해야 합니다. 이 빌드 속성에 대한 자세한 내용은 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

다음 예제에서는 다른 유형의 .NET Android 프로젝트를 만드는 데 사용하는 dotnet new 방법을 보여 줍니다.

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 경우 실행 가능한 앱을 생성합니다. 즉, 빌드 프로세스 중에 또는 .aab 파일을 만들고 .apk 빌드 중에 실행되도록 .NET SDK에서 MSBuild 작업의 순서를 다시 지정합니다. 따라서 .NET Android는 빌드 중에 다음을 수행합니다.

  • 실행 aapt 하여 파일의 @(AndroidResource) 문제에 대한 빌드 오류를 생성 Resource.designer.cs 하고 잠재적으로 내보냅니다.
  • C# 코드를 컴파일합니다.
  • 연결을 위해 ILLink MSBuild 대상을 실행합니다.
  • Java 스텁 및 AndroidManifest.xml.
  • 를 통해 javacJava 코드를 컴파일합니다.
  • java 코드를 d8/r8을 .dex 통해 변환합니다.
  • .apk 만들거나 .aab 서명합니다.

dotnet publish 는 Google Play 및 임시와 같은 기타 배포 메커니즘용 앱을 게시하기 위해 예약되어 있습니다. 또한 다른 키로 .apk 서명하거나 .aab 서명합니다.

참고 항목

IDE 내의 동작은 다릅니다. 대상은 Build 파일(있는 경우 $(BuildingInsideVisualStudio)true)을 .apk 생성하지 않습니다. IDE는 배포 대상을 Install 호출하여 파일을 생성합니다 .apk . 이 동작은 Xamarin.Android와 일치합니다.

dotnet run

dotnet run 는 인수를 통해 --project 디바이스 또는 에뮬레이터에서 앱을 시작하는 데 사용할 수 있습니다.

dotnet run --project HelloAndroid.csproj

또는 MSBuild 대상을 Run 사용할 수 있습니다.

dotnet build HelloAndroid.csproj -t:Run

참고 항목