릴리스용 애플리케이션 준비Preparing an Application for Release

애플리케이션을 코딩하고 테스트한 후에 배포할 패키지를 준비해야 합니다.After an application has been coded and tested, it is necessary to prepare a package for distribution. 이 패키지를 준비하는 첫 번째 작업은 릴리스할 애플리케이션을 빌드하는 것입니다. 여기에는 주로 일부 애플리케이션 특성을 설정하는 작업이 포함됩니다.The first task in preparing this package is to build the application for release, which mainly entails setting some application attributes.

다음 단계를 통해 릴리스용 앱을 빌드합니다.Use the following steps to build the app for release:

  • 애플리케이션 아이콘 지정 – 각각의 Xamarin.Android 애플리케이션에는 지정된 애플리케이션 아이콘이 있어야 합니다.Specify the Application Icon – Each Xamarin.Android application should have an application icon specified. 기술적으로 필요하지는 않지만 Google Play와 같은 일부 마켓에서 필요합니다.Although not technically necessary, some markets, such as Google Play, require it.

  • 애플리케이션 버전 지정 – 이 단계에서는 버전 정보를 초기화하거나 업데이트합니다.Version the Application – This step involves initializing or updating the versioning information. 이것은 향후 애플리케이션 업데이트와, 사용자가 설치한 애플리케이션 버전을 인지하도록 하기 위해 중요합니다.This is important for future application updates and to ensure that the users are aware of which version of the application they have installed.

  • APK 축소 – 관리 코드에서 Xamarin.Android 링커나 Java 바이트코드에서 ProGuard를 사용하여 최종 APK의 크기를 상당히 줄일 수 있습니다.Shrink the APK – The size of the final APK can be substantially reduced by using the Xamarin.Android linker on the managed code and ProGuard on the Java bytecode.

  • 애플리케이션 보호 – 디버깅을 사용하지 못하게 하고, 관리 코드를 난독 처리하고, 디버그 방지 및 변조 방지를 추가하며 네이티브 컴파일을 사용하여 사용자나 공격자가 애플리케이션을 디버그, 변조 또는 리버스 엔지니어링하지 못하게 합니다.Protect the Application – Prevent users or attackers from debugging, tampering, or reverse engineering the application by disabling debugging, obfuscating the managed code, adding anti-debug and anti-tamper, and using native compilation.

  • 패키지 속성 설정 – 패키지 속성은 Android 애플리케이션 패키지(APK)의 생성을 제어합니다.Set Packaging Properties – Packaging properties control the creation of the Android application package (APK). 이 단계에서는 APK를 최적화하고 그 자산을 보호하며 필요에 맞게 패키지를 모듈화합니다.This step optimizes the APK, protects its assets, and modularizes the packaging as needed.

  • 컴파일 – 이 단계에서는 코드와 자산을 컴파일하여 릴리스 모드에서 빌드되는지 확인합니다.Compile – This step compiles the code and assets to verify that it builds in Release mode.

  • 게시를 위한 보관 – 이 단계에서는 앱을 빌드하여 서명 및 게시를 위해 보관합니다.Archive for Publishing – This step builds the app and places it in an archive for signing and publishing.

이러한 각 단계는 아래에서 자세히 설명합니다.Each of these steps is described below in more detail.

애플리케이션 아이콘 지정Specify the Application Icon

각각의 Xamarin.Android 애플리케이션마다 애플리케이션 아이콘을 지정하는 것이 좋습니다.It is strongly recommended that each Xamarin.Android application specify an application icon. 일부 애플리케이션 마켓플레이스에서는 아이콘 없이 Android 애플리케이션을 게시하지 못합니다.Some application marketplaces will not allow an Android application to be published without one. Application 특성의 Icon 속성은 Xamarin.Android 프로젝트의 애플리케이션 아이콘을 지정하는 데 사용됩니다.The Icon property of the Application attribute is used to specify the application icon for a Xamarin.Android project.

Visual Studio 2017 이상에서는 다음 스크린샷과 같이 프로젝트 속성Android 매니페스트 섹션을 통해 애플리케이션 아이콘을 지정합니다.In Visual Studio 2017 and later, specify the application icon through the Android Manifest section of project Properties, as shown in the following screenshot:

애플리케이션 아이콘 설정Set the application icon

이러한 예제에서 @drawable/iconResources/drawable/icon.png( .png 확장명이 리소스 이름에 포함되지 않음)에 있는 아이콘 파일을 참조합니다.In these examples, @drawable/icon refers to an icon file that is located at Resources/drawable/icon.png (note that the .png extension is not included in the resource name). 이 특성은 이 샘플 코드 조각에서처럼 Properties\AssemblyInfo.cs 파일에서 선언할 수도 있습니다.This attribute can also be declared in the file Properties\AssemblyInfo.cs, as shown in this sample snippet:

[assembly: Application(Icon = "@drawable/icon")]

일반적으로 using Android.AppAssemblyInfo.cs(Application 특성의 네임스페이스는 Android.App임)의 맨 위에 선언되지만, 아직 없는 경우 이 using 문을 추가해야 합니다.Normally, using Android.App is declared at the top of AssemblyInfo.cs (the namespace of the Application attribute is Android.App); however, you may need to add this using statement if it is not already present.

애플리케이션 버전 지정Version the Application

버전 작업은 Android 애플리케이션 유지 관리와 배포를 위해 중요합니다.Versioning is important for Android application maintenance and distribution. 일종의 버전 작업이 없으면 애플리케이션이 업데이트되어야 하는지 여부를 판단하기가 어렵습니다.Without some sort of versioning in place, it is difficult to determine if or how an application should be updated. 버전 작업을 지원하기 위해 Android는 두 가지 유형의 정보를 인식합니다.To assist with versioning, Android recognizes two different types of information:

  • 버전 번호– 애플리케이션의 버전을 나타내는 정수값(Android 및 애플리케이션에서 내부적으로 사용)입니다.Version Number – An integer value (used internally by Android and the application) that represents the version of the application. 대부분의 애플리케이션은 이 값을 1로 설정한 다음 빌드마다 커집니다.Most applications start out with this value set to 1, and then it is incremented with each build. 이 값은 버전 이름 특성과의 관련이나 선호 관계가 없습니다(아래 참조).This value has no relationship or affinity with the version name attribute (see below). 애플리케이션 및 게시 서비스는 이 값을 사용자에게 표시해서는 안 됩니다.Applications and publishing services should not display this value to users. 이 값은 AndroidManifest.xml 파일에 android:versionCode로 저장됩니다.This value is stored in the AndroidManifest.xml file as android:versionCode.

  • 버전 이름– 애플리케이션 버전에 대한 정보를 사용자에게 알리는 데만 사용되는 문자열입니다(특정 디바이스에 설치된 대로).Version Name – A string that is used only for communicating information to the user about the version of the application (as installed on a specific device). 버전 이름은 사용자 또는 Google Play에 표시하기 위한 것입니다.The version name is intended to be displayed to users or in Google Play. 이 문자열은 Android에서 내부적으로 사용되지 않습니다.This string is not used internally by Android. 버전 이름은 디바이스에 설치된 빌드를 사용자가 식별하는 데 도움이 되는 모든 문자열이 될 수 있습니다.The version name can be any string value that would help a user identify the build that is installed on their device. 이 값은 AndroidManifest.xml 파일에 android:versionName으로 저장됩니다.This value is stored in the AndroidManifest.xml file as android:versionName.

Visual Studio에서는 다음 스크린 샷에서처럼 프로젝트 속성Android 매니페스트 섹션에서 이 값을 설정할 수 있습니다.In Visual Studio, these values can be set in the Android Manifest section of project Properties, as shown in the following screenshot:

버전 번호 설정Set the version number

APK 축소Shrink the APK

불필요한 관리 코드를 제거하는 Xamarin.Android 링커와, 사용하지 않는 Java 바이트코드를 제거하는 Android SDK ProGuard 도구 조합을 통해 Xamarin.Android APK를 더 작게 만들 수 있습니다.Xamarin.Android APKs can be made smaller through a combination of the Xamarin.Android linker, which removes unnecessary managed code, and the ProGuard tool from the Android SDK, which removes unused Java bytecode. 빌드 프로세스에서는 먼저 Xamarin.Android 링커를 사용하여 관리 코드(C#) 수준에서 앱을 최적화한 다음 ProGuard(사용하도록 설정된 경우)를 사용하여 Java 바이트코드 수준에서 APK를 최적화합니다.The build process first uses the Xamarin.Android linker to optimize the app at the managed code (C#) level, and then it later uses ProGuard (if enabled) to optimize the APK at the Java bytecode level.

링커 구성Configure the Linker

릴리스 모드는 공유 런타임을 해제하고 연결을 실행하여 애플리케이션이 런타임 시 필요한 Xamarin.Android 부분만 탑재할 수 있게 합니다.Release mode turns off the shared runtime and turns on linking so that the application only ships the pieces of Xamarin.Android required at runtime. Xamarin.Android의 링커는 정적 분석을 사용하여 Xamarin.Android 애플리케이션에서 사용하거나 참조하는 어셈블리, 형식 및 형식 번호를 결정합니다.The linker in Xamarin.Android uses static analysis to determine which assemblies, types, and type members are used or referenced by a Xamarin.Android application. 그런 다음 링커는 사용되지 않는(또는 참조되지 않는) 모든 어셈블리, 형식 및 멤버를 버립니다.The linker then discards all the unused assemblies, types, and members that are not used (or referenced). 이렇게 해서 패키지 크기를 상당히 줄일 수 있습니다.This can result in a significant reduction in the package size. 예를 들어 HelloWorld 샘플에서는 최종 APK 크기가 83% 줄었습니다.For example, consider the HelloWorld sample, which experiences an 83% reduction in the final size of its APK:

  • 구성: None – Xamarin.Android 4.2.5 Size = 17.4 MB.Configuration: None – Xamarin.Android 4.2.5 Size = 17.4 MB.

  • 구성: SDK Assemblies Only – Xamarin.Android 4.2.5 Size = 3.0 MB.Configuration: SDK Assemblies Only – Xamarin.Android 4.2.5 Size = 3.0 MB.

프로젝트 속성Android 옵션 섹션을 통해 링커 옵션을 설정합니다.Set linker options through the Android Options section of the project Properties:

링커 옵션Linker options

연결 풀다운 메뉴는 링커 제어를 위한 다음 옵션을 제공합니다.The Linking pull-down menu provides the following options for controlling the linker:

  • 없음 – 링커가 꺼지고 연결이 수행되지 않습니다.None – This turns off the linker; no linking will be performed.

  • SDK 어셈블리만Xamarin.Android에서 필요한 어셈블리만 연결합니다.SDK Assemblies Only – This will only link the assemblies that are required by Xamarin.Android. 다른 어셈블리는 연결되지 않습니다.Other assemblies will not be linked.

  • SDK 및 사용자 어셈블리– Xamarin.Android뿐 아니라 애플리케이션에서 필요한 모든 어셈블리를 연결합니다.Sdk and User Assemblies – This will link all assemblies that are required by the application, and not just the ones required by Xamarin.Android.

연결에는 의도치 않은 부작용이 있을 수 있으므로 물리적 디바이스의 릴리스 모드에서 애플리케이션을 다시 테스트하는 것이 중요합니다.Linking can produce some unintended side effects, so it is important that an application be re-tested in Release mode on a physical device.

ProGuardProGuard

ProGuard는 Java 코드를 연결하고 난독 처리하는 Android SDK 도구입니다.ProGuard is an Android SDK tool that links and obfuscates Java code. ProGuard는 일반적으로 APK에 포함된 대형 라이브러리(예: Google Play Services)의 공간을 축소하여 애플리케이션을 더 작게 만드는 데 사용됩니다.ProGuard is normally used to create smaller applications by reducing the footprint of large included libraries (such as Google Play Services) in your APK. ProGuard는 사용되지 않는 Java 바이트 코드를 제거하기 때문에 앱이 더 작아집니다.ProGuard removes unused Java bytecode, which makes the resulting app smaller. 예를 들어, 소형 Xamarin.Android 앱에 ProGuard를 사용하면 크기가 약 24% 감소합니다. – 여러 라이브러리 종속성이 있는 대형 앱에 ProGuard를 사용하면 보통 더 큰 축소 효과가 있습니다.For example, using ProGuard on small Xamarin.Android apps usually achieves about a 24% reduction in size – using ProGuard on larger apps with multiple library dependencies typically achieves an even greater size reduction.

ProGuard는 Xamarin.Android 링커를 대체하지 않습니다.ProGuard is not an alternative to the Xamarin.Android linker. Xamarin.Android 링커는 관리 코드를 연결하고 ProGuard는 Java 바이트 코드를 연결합니다.The Xamarin.Android linker links managed code, while ProGuard links Java bytecode. 빌드 프로세스에서는 먼저 Xamarin.Android 링커를 사용하여 관리 코드(C#) 수준에서 앱을 최적화한 다음 ProGuard(사용하도록 설정된 경우)를 사용하여 Java 바이트 코드 수준에서 APK를 최적화합니다.The build process first uses the Xamarin.Android linker to optimize the managed (C#) code in the app, and then it later uses ProGuard (if enabled) to optimize the APK at the Java bytecode level.

ProGuard 사용을 선택하면 Xamarin.Android이 나타나는 APK에서 ProGuard 도구를 실행합니다.When Enable ProGuard is checked, Xamarin.Android runs the ProGuard tool on the resulting APK. ProGuard 구성 파일이 생성되며 빌드 시점에 ProGuard에서 사용됩니다.A ProGuard configuration file is generated and used by ProGuard at build time. Xamarin.Android는 사용자 지정ProguardConfiguration 빌드 작업도 지원합니다.Xamarin.Android also supports custom ProguardConfiguration build actions. 사용자 지정 ProGuard 구성 파일을 프로젝트에 추가하고 아래 예제에서처럼 마우스 오른쪽 단추로 클릭하여 빌드 작업으로 선택할 수 있습니다.You can add a custom ProGuard configuration file to your project, right-click it, and select it as a build action as shown in this example:

ProGuard는 기본적으로 사용하지 않게 설정되어 있습니다.ProGuard is disabled by default. ProGuard 사용 옵션은 프로젝트가 릴리스 모드로 설정된 경우에만 사용할 수 있습니다.The Enable ProGuard option is available only when the project is set to Release mode. ProGuard 사용을 선택하지 않았다면 모든 ProGuard 빌드 작업이 무시됩니다.All ProGuard build actions are ignored unless Enable ProGuard is checked. Xamarin.Android ProGuard 구성은 APK를 난독 처리하지 않으며 사용자 지정 구성 파일을 통해서도 난독 처리를 사용할 수 없습니다.The Xamarin.Android ProGuard configuration does not obfuscate the APK, and it is not possible to enable obfuscation, even with custom configuration files. 난독 처리를 사용려면 Dotfuscator를 통한 애플리케이션 보호를 참조하세요.If you wish to use obfuscation, please see Application Protection with Dotfuscator.

ProGuard 도구 사용에 대한 자세한 정보는 ProGuard를 참조하세요.For more detailed information about using the ProGuard tool, see ProGuard.

애플리케이션 보호Protect the Application

디버깅 사용 안 함Disable Debugging

Android 애플리케이션 개발 중에는 JDWP(Java Debug Wire Protocol) 를 사용하여 디버그를 수행합니다.During development of an Android application, debugging is performed with the use of the Java Debug Wire Protocol (JDWP). 이것은 adb 같은 도구가 디버그를 위해 JVM과 통신할 수 있게 하는 기술입니다.This is a technology that allows tools such as adb to communicate with a JVM for the purposes of debugging. JDWP는 Xamarin.Android 애플리케이션의 디버그 빌드에 대해 기본적으로 켜져 있습니다.JDWP is turned on by default for Debug builds of a Xamarin.Android application. JDWP는 개발 중에 중요하지만 릴리스된 애플리케이션에는 보안 문제를 야기할 수 있습니다.While JDWP is important during development, it can pose a security issue for released applications.

중요

디버그 상태를 사용하지 않게 설정하지 않은 경우 Java 프로세스에 완전히 액세스할 수 있고 애플리케이션의 컨텍스트에서 임의 코드를 실행할 수 있으므로(JDWP를 통해 가능) 릴리스된 애플리케이션에서는 디버그 상태를 항상 사용하지 않게 설정합니다.Always disable the debug state in a released application as it is possible (via JDWP) to gain full access to the Java process and execute arbitrary code in the context of the application if this debug state is not disabled.

Android 매니페스트에는 애플리케이션의 디버그 가능 여부를 제어하는 android:debuggable 특성이 포함됩니다.The Android Manifest contains the android:debuggable attribute, which controls whether or not the application may be debugged. android:debuggable 특성은 false로 설정하는 것이 좋습니다.It is considered a good practice to set the android:debuggable attribute to false. 이것은 조건부 컴파일 문을 AssemblyInfo.cs에 추가하면 간단하게 설정할 수 있습니다.The simplest way to do this is by adding a conditional compile statement in AssemblyInfo.cs:

#if DEBUG
[assembly: Application(Debuggable=true)]
#else
[assembly: Application(Debuggable=false)]
#endif

더비그 빌드에서는 디버그 편의를 위해 자동으로 일부 권한을 설정합니다(예: 인터넷ReadExternalStorage).Note that Debug builds automatically set some permissions to make debug easier (such as Internet and ReadExternalStorage). 하지만 릴리스 빌드는 명시적으로 구성된 권한만 사용합니다.Release builds, however, use only the permissions that you explicitly configure. 릴리스 빌드로 전환하면 앱이 디버그 빌드에서 사용 가능했던 권한을 잃게 되는 경우 권한에서 설명한 것처럼 필수 권한에서 이 권한을 명시적으로 사용하도록 설정했는지 확인합니다.If you find that switching to the Release build causes your app to lose a permission that was available in the Debug build, verify that you have explicitly enabled this permission in the Required permissions list as described in Permissions.

Dotfuscator를 통한 애플리케이션 보호Application Protection with Dotfuscator

디버깅을 사용하지 않는 경우에도 공격자가 애플리케이션을 다시 패키지하고, 구성 옵션이나 권한을 추가 또는 제거할 가능성은 여전히 남아 있습니다.Even with debugging disabled, it is still possible for attackers to re-package an application, adding or removing configuration options or permissions. 이를 통해 애플리케이션의 리버스 엔지니어링, 디버그 또는 변조가 가능해집니다.This allows them to reverse-engineer, debug, or tamper with the application. Dotfuscator CE(Community Edition)를 사용하여 관리 코드를 난독 처리하고, Xamarin.Android 앱이 루트 디바이스에서 실행되고 있는지 검색하고 응답하기 위해 빌드 시간에 런타임 보안 상태 검색 코드를 이 앱에 삽입할 수 있습니다.Dotfuscator Community Edition (CE) can be used to obfuscate managed code and inject runtime security state detection code into a Xamarin.Android app at build time to detect and respond if the app is running on a rooted device.

Dotfuscator CE는 Visual Studio 2017에 포함되어 있습니다.Dotfuscator CE is included with Visual Studio 2017. Dotfuscator를 사용하려면 도구 > PreEmptive Protection - Dotfuscator를 클릭합니다.To use Dotfuscator, click Tools > PreEmptive Protection - Dotfuscator.

Dotfuscator CE를 구성하려면 Xamarin에서 Dotfuscator Community Edition 사용을 참조하세요.To configure Dotfuscator CE, please see Using Dotfuscator Community Edition with Xamarin. 구성된 후에는 Dotfuscator CE가 만들어진 각 빌드를 자동으로 보호합니다.Once it is configured, Dotfuscator CE will automatically protect each build that is created.

어셈블리를 네이티브 코드에 번들Bundle Assemblies into Native Code

이 옵션을 사용할 경우 어셈블리가 네이티브 공유 라이브러리에 번들로 포함됩니다.When this option is enabled, assemblies are bundled into a native shared library. 이 옵션은 코드를 안전하게 유지합니다. 즉 네이티브 바이너리에 관리 어셈블리를 포함하여 보호합니다.This option keeps the code safe; it protects managed assemblies by embedding them in native binaries.

이 옵션을 사용하려면 엔터프라이즈 라이선스가 필요하며 빠른 배포 사용을 사용하지 않도록 설정한 경우에만 사용할 수 있습니다.This option requires an Enterprise license and is only available when Use Fast Deployment is disabled. 어셈블리를 네이티브 코드에 번들은 기본적으로 사용하지 않게 설정되어 있습니다.Bundle assemblies into native code is disabled by default.

네이티브 코드에 번들 옵션은 어셈블리가 네이티브 코드로 컴파일 되는 것이 아닙니다.Note that the Bundle into Native Code option does not mean that the assemblies are compiled into native code. AOT 컴파일을 사용하여 어셈블리를 네이티브 코드로 컴파일할 수 없습니다(현재 테스트 기능이며 프로덕션에 사용할 수 없음).It is not possible to use AOT Compilation to compile assemblies into native code (currently only an experimental feature, and not for production use).

AOT 컴파일AOT Compilation

AOT 컴파일 옵션(패키지 속성 페이지)을 사용하면 어셈블리의 AOT(Ahead-of-Time) 컴파일이 가능합니다.The AOT Compilation option (on the Packaging Properties page) enables Ahead-of-Time (AOT) compilation of assemblies. 이 옵션을 사용하면 런타임 이전에 어셈블리를 미리 컴파일하여 JIT(Just In Time) 시작 과부하가 최소화됩니다.When this option is enabled, Just In Time (JIT) startup overhead is minimized by precompiling assemblies before runtime. 나타나는 네이티브 코드는 컴파일되지 않은 어셈블리와 함께 APK에 포함됩니다.The resulting native code is included in the APK along with the uncompiled assemblies. 이로 인해 애플리케이션 시작 시간이 짧아지며 APK 크기는 약간 커집니다.This results in shorter application startup time, but at the expense of slightly larger APK sizes.

AOT 컴파일 옵션에는 엔터프라이즈 이상의 라이선스가 필요합니다.The AOT Compilation option requires an Enterprise license or higher. AOT 컴파일은 프로젝트가 릴리스 모드로 구성된 경우에만 사용할 수 있고 기본적으로 사용하지 않게 설정되어 있습니다.AOT compilation is available only when the project is configured for Release mode, and it is disabled by default. AOT에 대한 자세한 내용은 AOT를 참조하세요.For more information about AOT Compilation, see AOT.

LLVM 최적화 컴파일러LLVM Optimizing Compiler

_LLVM 최적화 컴파일러_는 더 작고 빠른 컴파일 코드를 만들며 AOT 컴파일 어셈블리를 네이티브 코드로 변환하지만 빌드 시간이 느려집니다.The LLVM Optimizing Compiler will create smaller and faster compiled code and convert AOT-compiled assemblies into native code, but at the expense of slower build times. LLVM 컴파일러는 기본적으로 사용하지 않게 설정되어 있습니다.The LLVM compiler is disabled by default. LLVM 컴파일러를 사용하려면 먼저 AOT 컴파일 옵션을 사용하도록 설정해야 합니다(패키지 속성 페이지).To use the LLVM compiler, the AOT Compilation option must first be enabled (on the Packaging Properties page).

참고

LLVM 최적화 컴파일러 옵션에는 엔터프라이즈 라이선스가 필요합니다.The LLVM Optimizing Compiler option requires an Enterprise license.

패키지 속성 설정Set Packaging Properties

다음 스크린 샷에서처럼 프로젝트 속성Android 옵션 섹션에서 패키지 속성을 설정할 수 있습니다.Packaging properties can be set in the Android Options section of project Properties, as shown in the following screenshot:

패키징 속성Packaging Properties

공유 런타임 사용, 빠른 배포 사용 등과 같이 이러한 여러 속성은 디버그 모드용입니다.Many of these properties, such as Use Shared Runtime, and Use Fast Deployment are intended for Debug mode. 그러나 애플리케이션이 릴리스 모드용으로 구성되었을 때 앱이 크기 및 실행 속도를 위해 최적화되고, 변조를 방지하며, 다양한 아키텍처 및 크기 제한을 지원하도록 패키징할 수 있는 방법을 결정하는 다른 설정이 있습니다.However, when the application is configured for Release mode, there are other settings that determine how the app is optimized for size and execution speed, how it is protected from tampering, and how it can be packaged to support different architectures and size restrictions.

지원되는 아키텍처 지정Specify Supported Architectures

Xamarin.Android 앱의 릴리스를 준비할 때는 지원되는 CPU 아키텍처를 지정해야 합니다.When preparing a Xamarin.Android app for release, it is necessary to specify the CPU architectures that are supported. 단일 APK가 여러 서로 다른 아키텍처를 지원하는 머신 코드를 포함할 수 잇습니다.A single APK can contain machine code to support multiple, different architectures. 여러 CPU 아키텍처 지원에 대한 세부 정보는 CPU 아키텍처를 참조하세요.See CPU Architectures for details about supporting multiple CPU architectures.

선택한 ABI마다 한 패키지(.APK) 생성Generate One Package (.APK) per Selected ABI

이 옵션을 사용하는 경우 모든 지원되는 ABI에 대해 대형 단일 APK를 만드는 것이 아니라, 지원되는 ABI 각각에 대해 하나의 APK가 만들어집니다(CPU 아키텍처에서 설명한 것처럼 고급 탭).When this option is enabled, one APK will be created for each of the supported ABI's (selected on the Advanced tab, as described in CPU Architectures) rather than a single, large APK for all supported ABI's. 이 옵션은 프로젝트가 릴리스 모드로 구성되었고 기본적으로 사용하지 않게 설정된 경우에만 사용할 수 있습니다.This option is available only when the project is configured for Release mode, and it is disabled by default.

Multi-DexMulti-Dex

Multi-Dex 사용 옵션을 사용하도록 선택한 경우 Android SDK 도구를 사용하여 .dex 파일 형식의 65K 메서드 제한을 무시하게 됩니다.When the Enable Multi-Dex option is enabled, Android SDK tools are used to bypass the 65K method limit of the .dex file format. 65k로 메서드 제한은 앱이 _참조_하는 Java 메서드 수(앱이 사용하는 모든 라이브러리의 항목 포함)–를 기준으로 하며, 원본 코드에 작성된 메서드 수는 기준이 아닙니다.The 65K method limitation is based on the number of Java methods that an app references (including those in any libraries that the app depends on) – it is not based on the number of methods that are written in the source code. 애플리케이션이 일부 메서드만 정의하고 여러 메서드(또는 대규모 라이브러리)를 사용하는 경우 65K 제한이 초과될 수 있습니다.If an application only defines a few methods but uses many (or large libraries), it is possible that the 65K limit will be exceeded.

앱이 참조되는 모든 라이브러리의 모든 메서드를 사용하는 것은 아니므로 ProGuard 같은 도구(위 참조)를 사용하면 사용되지 않는 메서드를 코드에서 제거할 수 있습니다.It is possible that an app is not using every method in every library that is referenced; therefore, it is possible that a tool such as ProGuard (see above) can remove the unused methods from code. Multi-Dex 사용은 절대적으로 필요한 경우에만 사용하도록 설정합니다. 즉 ProGuard를 사용한 후에도 앱이 65K 이상의 Java 메서드를 참조하는 경우입니다.The best practice is to enable Enable Multi-Dex only if absolutely necessary, i.e.the app still references more than 65K Java methods even after using ProGuard.

Multi-Dex에 대한 자세한 내용은 64K가 넘는 메서드의 앱 구성을 참조하세요.For more information about Multi-Dex, see Configure Apps with Over 64K Methods.

CompileCompile

위의 단계가 모두 완료되면 앱을 컴파일할 수 있습니다.After all of the above steps are completed, the app is ready for compilation. 빌드 > 솔루션 다시 빌드를 선택하여 릴리스 모드에서 성공적으로 빌드되는지 확인합니다.Select Build > Rebuild Solution to verify that it builds successfully in Release mode. 이 단계에서는 아직 APK가 생성되지 않았습니다.Note that this step does not yet produce an APK.

앱 패키지 서명에서 패키지와 서명을 더 상세하게 설명합니다.Signing the App Package discusses packaging and signing in more detail.

게시를 위해 보관Archive for Publishing

게시 프로세스를 시작하려면 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 보관... 바로 가기 메뉴 항목을 선택합니다.To begin the publishing process, right-click the project in Solution Explorer and select the Archive... context menu item:

앱 보관Archive app

보관...Archive Manager를 실행하고 이 스크린 샷에서처럼 앱 번들을 보관하는 프로세스를 시작합니다.Archive... launches the Archive Manager and begins the process of archiving the App bundle as shown in this screenshot:

보관 관리자Archive Manager

보관 파일을 만드는 또 다른 방법은 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 모두 보관... 을 선택하는 것입니다. 그러면 솔루션을 빌드하고 보관 파일을 생성할 수 있는 모든 Xamarin 프로젝트를 보관합니다.Another way to create an archive is to right-click the Solution in the Solution Explorer and select Archive All..., which builds the solution and archives all Xamarin projects that can generate an archive:

모두 보관Archive All

보관모두 보관에서는 모두 Archive Manager가 자동으로 시작됩니다.Both Archive and Archive All automatically launch the Archive Manager. Archive Manager를 직접 시작하려면 도구 > Archive Manager... 메뉴 항목을 클릭합니다.To launch the Archive Manager directly, click the Tools > Archive Manager... menu item:

보관 관리자 시작Launch Archive Manager

솔루션 노드를 마우스 오른쪽 단추로 클릭하고 보관 보기를 선택하면 언제든 솔루션의 보관 파일을 볼 수 있습니다.The solution's archives at any time by right clicking the Solution node and selecting View Archives:

보관 파일 보기View Archives

Archive ManagerThe Archive Manager

Archive Manager솔루션 목록 창, 보관 목록, 세부 정보 패널로 구성됩니다.The Archive Manager is comprised of a Solution List pane, an Archives List, and a Details Panel:

보관 관리자 창Archive Manager Panes

솔루션 목록은 보관된 프로젝트가 하나 이상 있는 모든 솔루션을 표시합니다.The Solution List displays all solutions having at least one archived project. 솔루션 목록에는 다음 섹션이 포함됩니다.The Solution List includes the following sections:

  • 현재 솔루션 – 현재 솔루션을 표시합니다.Current Solution – Displays the current solution. 현재 솔루션에 기존 보관 파일이 없으면 이 영역이 비었을 수 있습니다.Note that this area may be empty if the current solution does not have an existing archive.
  • 모든 보관 – 보관 파일이 있는 모든 솔루션을 표시합니다.All Archives – Displays all solutions that have an archive.
  • 검색 텍스트 상자(위) – 텍스트 상자에 입력한 검색 문자열에 따라 모든 보관 목록에 나열된 솔루션을 필터링합니다.Search text box (at the top) – Filters the solutions listed in the All Archives list according to the search string entered in the text box.

보관 목록 선택한 솔루션에 대한 모든 보관 파일 목록을 표시합니다.The Archives List displays the list of all archives for the selected solution. 보관 목록에는 다음 섹션이 포함됩니다.The Archives List includes the following sections:

  • 솔루션 이름 선택솔루션 목록에서 선택한 솔루션의 이름을 표시합니다.Selected solution name – Displays the name of the solution selected in the Solution List. 보관 목록에 표시된 모든 정보는 이 선택한 솔루션에 대한 것입니다.All information shown in the Archives List refers to this selected solution.
  • 플랫폼 필터 – 이 필드를 통해 플랫폼 종류(예: iOS 또는 Android)에 따라 보관 파일을 필터링할 수 있습니다.Platforms Filter – This field makes it possible to filter archives by platform type (such as iOS or Android).
  • 항목 보관 – 선택한 솔루션의 보관 파일의 목록입니다.Archive Items – List of archives for the selected solution. 이 목록의 각 항목에는 프로젝트 이름, 만든 날짜 및 플랫폼이 포함되어 있습니다.Each item in this list includes the project name, creation date, and platform. 항목이 보관 또는 게시 중인 동안 진행률 같은 추가 정보를 표시할 수도 있습니다.It can also show additional information such as the progress when an item is being archived or published.

세부 정보 패널 각 보관 파일에 대한 추가 정보를 표시합니다.The Details Panel displays additional information about each archive. 이를 통해 사용자가 배포 워크플로를 시작하거나 배포가 만들어진 폴더를 열 수 있습니다.It also allows the user to start the Distribution workflow or open the folder where the distribution has been created. 빌드 설명 섹션을 사용하면 보관 파일에 빌드 설명을 포함할 수 있습니다.The Build Comments section makes it possible to include build comments in the archive.

분포Distribution

애플리케이션의 보관 버전을 게시할 준비가 되면 Archive Manager에서 보관 파일을 선택하고 배포... 단추를 클릭합니다.When an archived version of the application is ready to publish, select the archive in the Archive Manager and click the Distribute... button:

배포 단추Distribute button

배포 채널 대화 상자에는 앱 관련 정보, 배포 워크플로 진행률 표시, 배포 채널 선택이 나타납니다.The Distribution Channel dialog shows information about the app, an indication of distribution workflow progress, and a choice of distribution channels. 첫 번째 실행에서는 두 가지 선택 항목이 표시됩니다.On the first run, two choices are presented:

배포 채널 선택Select Distribution Channel

다음 배포 채널 중 하나를 선택할 수 있습니다.It is possible to choose one of the following distribution channels:

  • 임시– 서명된 APK를 Android 디바이스에 사이드로드할 수 있는 디스크에 저장합니다.Ad-Hoc – Saves a signed APK to disk that can be sideloaded to Android devices. 계속하여 앱 패키지 서명에서 Android 서명 ID를 만들고, Android 애플리케이션용 새 서명 인증서를 만들며, 임시 앱 버전을 디스크에 게시하는 방법을 알아봅니다.Continue to Signing the App Package to learn how to create an Android signing identity, create a new signing certificate for Android applications, and publish an ad hoc version of the app to disk. 테스트를 위한 APK를 만드는 좋은 방법입니다.This is a good way to create an APK for testing.

  • Google Play – 서명된 APK를 Google Play에 게시합니다.Google Play – Publishes a signed APK to Google Play. 계속하여 Google Play에 게시에서 APK를 서명하여 Google Play 스토어에 게시하는 방법을 알아봅니다.Continue to Publishing to Google Play to learn how to sign and publish an APK in the Google Play store.