Xamarin.Android 프로젝트 마이그레이션
Android용 .NET 앱에 대한 .NET 8 프로젝트는 다음 예제와 유사합니다.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-android</TargetFramework>
<OutputType>Exe</OutputType>
</PropertyGroup>
</Project>
라이브러리 프로젝트의 경우 속성을 완전히 생략 $(OutputType)
하거나 속성 값으로 지정 Library
합니다.
.NET 구성 파일
Android 프로젝트용 .NET과 같은 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 카탈로그를 참조 하세요.
다음 표에서는 Android용 .NET에서 변경된 다른 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 입니다. full 및 pdbonly 는 지원되지 않습니다. |
$(MonoSymbolArchive) |
False mono-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 버전을 추적합니다.
TargetFramework
는 android: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
}
기본 파일 포함
Android 관련 파일 globbing 동작에 대한 기본 .NET이 정의되어 있습니다 AutoImport.props
. 이 동작은 Android 항목에 대해 설정하여 사용하지 않도록 설정할 $(EnableDefaultAndroidItems)
false
수 있습니다. 또는 모든 기본 항목 포함 동작은 다음으로 설정하여 사용하지 않도록 설정할 $(EnableDefaultItems)
false
수 있습니다. 자세한 내용은 Workload props 파일을 참조 하세요.
런타임 동작
.NET 5 이상에서는 다른 플랫폼의 String.IndexOf()
메서드에 대한 동작 변경 내용이 있습니다. 자세한 내용은 .NET 세계화 및 ICU를 참조하세요.
링커
.NET 8에는 링커에 대한 새 설정이 있습니다.
<PublishTrimmed>true</PublishTrimmed>
<TrimMode>partial</TrimMode>
- 트리밍에 옵트인된 어셈블리를 트리밍합니다.
자세한 내용은 자르기 옵션을 참조하세요.
기본적으로 Debug
Android용 .NET 프로젝트에서 빌드는 링커를 사용하지 않으며 빌드 집합 PublishTrimmed=true
및 Release
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>
전체 트리밍을 수행합니다.
자세한 내용은 자르기 옵션을 참조하세요.
기본적으로 Debug
Android용 .NET 프로젝트에서 빌드는 링커를 사용하지 않으며 빌드 집합 PublishTrimmed=true
및 Release
TrimMode=partial
.
Ahead-of-Time 컴파일
$(RunAOTCompilation)
는 AoT(Ahead-of-Time) 컴파일을 사용하도록 설정하는 새로운 MSBuild 속성입니다. Blazor WASM에 사용되는 것과 동일한 속성입니다. 또한 이 $(AotAssemblies)
속성을 사용하면 Xamarin.Android 프로젝트에서 Android용 .NET 프로젝트로 마이그레이션하는 데 도움이 되도록 AOT를 사용할 수 있습니다. 그러나 이 속성은 .NET 7에서 더 이상 사용되지 않습니다.
릴리스 빌드는 기본적으로 다음 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 속성은 Android 앱용 .NET에서 지원되지 않습니다. 대신 System.TextEncoding.CodePages NuGet 패키지에서 지원을 제공합니다. 자세한 내용은 CodePagesEncodingProvider를 참조하세요.
.NET CLI
Android용 .NET은 .NET 명령줄 인터페이스(.NET CLI)를 사용하여 Android 앱을 만들고, 빌드하고, 게시하고, 실행할 수 있도록 지원합니다.
dotnet new
dotnet new
는 기존 .NET 템플릿의 패턴 및 이름에 따라 명명된 프로젝트 템플릿 및 항목 템플릿을 사용하여 Android 프로젝트 및 항목에 대한 새 .NET을 만드는 데 사용할 수 있습니다.
템플릿 | 짧은 이름 | 언어 | 태그 |
---|---|---|---|
Android 활동 템플릿 | android-activity | C# | Android |
Android Java 라이브러리 바인딩 | android-bindinglib | C# | Android |
Android 레이아웃 템플릿 | android-layout | C# | Android |
Android 클래스 라이브러리 | androidlib | C# | Android |
Android 애플리케이션 | android | C# | Android |
다음 예제에서는 Android 프로젝트용 .NET의 다양한 형식을 만드는 데 사용하는 dotnet new
방법을 보여 줍니다.
dotnet new android --output MyAndroidApp --packageName com.mycompany.myandroidapp
dotnet new androidlib --output MyAndroidLibrary
dotnet new android-bindinglib --output MyJavaBinding
Android용 .NET 프로젝트가 만들어지면 항목 템플릿을 사용하여 프로젝트에 항목을 추가할 수 있습니다.
dotnet new android-activity --name LoginActivity --namespace MyAndroidApp
dotnet new android-layout --name MyLayout --output Resources/layout
dotnet build & publish
Android dotnet build
용 .NET의 경우 실행 가능한 앱을 생성합니다. 즉, 빌드 프로세스 중에 또는 .aab
파일을 만들고 .apk
빌드 중에 실행되도록 .NET SDK에서 MSBuild 작업의 순서를 다시 지정합니다. 따라서 빌드하는 동안 Android용 .NET은 다음을 수행합니다.
- 실행
aapt
하여 파일의@(AndroidResource)
문제에 대한 빌드 오류를 생성Resource.designer.cs
하고 잠재적으로 내보냅니다. - C# 코드를 컴파일합니다.
- 연결을 위해 ILLink MSBuild 대상을 실행합니다.
- Java 스텁 및
AndroidManifest.xml
. - 를 통해
javac
Java 코드를 컴파일합니다. - 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
참고 항목
.NET MAUI