빌드 프로세스
Android용 .NET 빌드 프로세스는 생성Resource.designer.cs
, 지원 @(AndroidResource)
@(AndroidAsset)
및 기타 빌드 작업, Android 호출 가능 래퍼 생성 및 Android 디바이스에서 실행용으로 생성 등 모든 것을 결합하는 .apk
작업을 담당합니다.
애플리케이션 패키지
일반적으로 Android용 .NET 빌드 시스템에서 생성할 수 있는 두 가지 유형의 Android 애플리케이션 패키지(.apk
파일)가 있습니다.
완전히 자체 포함되고 추가 패키지를 실행할 필요가 없는 릴리스 빌드. 앱 스토어에 제공되는 패키지입니다.
이와 반대되는 디버그 빌드.
이러한 패키지 유형은 패키지를 생성하는 MSBuild Configuration
과 일치합니다.
빠른 배포
‘빠른 배포’는 Android 애플리케이션 패키지 크기를 더 축소하는 방식으로 수행됩니다. 이렇게 하려면 패키지에서 앱의 어셈블리를 제외하고 대신 앱의 어셈블리를 애플리케이션의 내부 files
디렉터리(일반적으로 /data/data/com.some.package
에 있음)에 직접 배포합니다. 내부 files
디렉터리는 전역적으로 쓰기 가능한 폴더가 아니므로 해당 디렉터리에 파일을 복사하는 모든 명령을 실행하려면 run-as
도구를 사용합니다.
이 프로세스를 사용하면 어셈블리‘만’ 변경되는 경우에는 패키지가 다시 설치되지 않으므로 빌드/배포/디버그 주기가 단축됩니다. 업데이트된 어셈블리만 대상 디바이스에 다시 동기화됩니다.
Warning
빠른 배포는 run-as
를 차단하는 디바이스에서는 실패하는 것으로 알려져 있으며 종종 Android 5.0 이전 디바이스가 포함됩니다.
빠른 배포는 기본적으로 활성화되며, 디버그 빌드에서 $(EmbedAssembliesIntoApk)
속성을 True
로 설정하여 비활성화할 수 있습니다.
향상된 빠른 배포 모드를 이 기능과 함께 사용하면 배포 속도를 훨씬 더 향상할 수 있습니다.
그러면 어셈블리, 네이티브 라이브러리, typemaps, dexes가 모두 files
디렉터리에 배포됩니다. 그러나 실제로 네이티브 라이브러리, 바인딩 또는 Java 코드를 변경하는 경우에만 사용하도록 설정해야 합니다.
MSBuild 프로젝트
Android용 .NET 빌드 프로세스는 msBuild를 기반으로 하며, Mac용 Visual Studio 및 Visual Studio에서 사용하는 프로젝트 파일 형식이기도 합니다. 일반적으로 사용자는 MSBuild 파일을 직접 편집할 필요가 없습니다. IDE는 완벽하게 작동하는 프로젝트를 만들고 변경 내용으로 업데이트하고 필요에 따라 빌드 대상을 자동으로 호출합니다.
고급 사용자가 IDE의 GUI에서 지원하지 않는 작업을 수행할 수도 있으므로, 프로젝트 파일을 직접 편집하여 빌드 프로세스를 사용자 지정할 수 있습니다. 이 페이지에서는 Android 관련 기능 및 사용자 지정에 대한 .NET만 문서화합니다. 일반적인 MSBuild 항목, 속성 및 대상을 통해 더 많은 작업을 수행할 수 있습니다.
바인딩 프로젝트
다음 MSBuild 속성을 바인딩 프로젝트와 함께 사용할 수 있습니다.
Resource.designer.cs
생성
다음 MSBuild 속성은 Resource.designer.cs
파일의 생성을 제어하는 데 사용됩니다.
$(AndroidAapt2CompileExtraArgs)
$(AndroidAapt2LinkExtraArgs)
$(AndroidExplicitCrunch)
$(AndroidR8IgnoreWarnings)
$(AndroidResgenExtraArgs)
$(AndroidResgenFile)
$(AndroidUseAapt2)
$(MonoAndroidResourcePrefix)
서명 속성
서명 속성은 Android 디바이스에 설치할 수 있도록 애플리케이션 패키지에 서명하는 방법을 제어합니다. 더 빠른 빌드 반복을 허용하기 위해 서명 속도가 매우 느리기 때문에 Android용 .NET 작업은 빌드 프로세스 중에 패키지에 서명하지 않습니다. 대신, IDE 또는 설치 빌드 대상을 통해 설치 전이나 내보내기 중에 서명합니다(필요할 경우). SignAndroidPackage 대상을 호출하면 출력 디렉터리에 접미사가 -Signed.apk
인 패키지가 생성됩니다.
기본적으로 서명 대상은 필요한 경우 새 디버그 서명 키를 생성합니다. 예를 들어 빌드 서버에서 특정 키를 사용하려는 경우 다음 MSBuild 속성을 사용합니다.
$(AndroidDebugKeyAlgorithm)
$(AndroidDebugKeyValidity)
$(AndroidDebugStoreType)
$(AndroidKeyStore)
$(AndroidSigningKeyAlias)
$(AndroidSigningKeyPass)
$(AndroidSigningKeyStore)
$(AndroidSigningStorePass)
$(JarsignerTimestampAuthorityCertificateAlias)
$(JarsignerTimestampAuthorityUrl)
keytool
옵션 매핑
다음 keytool
호출의 경우:
$ keytool -genkey -v -keystore filename.keystore -alias keystore.alias -keyalg RSA -keysize 2048 -validity 10000
Enter keystore password: keystore.filename password
Re-enter new password: keystore.filename password
...
Is CN=... correct?
[no]: yes
Generating 2,048 bit RSA key pair and self-signed certificate (SHA1withRSA) with a validity of 10,000 days
for: ...
Enter key password for keystore.alias
(RETURN if same as keystore password): keystore.alias password
[Storing filename.keystore]
위에서 생성한 키 저장소를 사용하려면 속성 그룹을 사용합니다.
<PropertyGroup>
<AndroidKeyStore>True</AndroidKeyStore>
<AndroidSigningKeyStore>filename.keystore</AndroidSigningKeyStore>
<AndroidSigningStorePass>keystore.filename password</AndroidSigningStorePass>
<AndroidSigningKeyAlias>keystore.alias</AndroidSigningKeyAlias>
<AndroidSigningKeyPass>keystore.alias password</AndroidSigningKeyPass>
</PropertyGroup>
빌드 확장점
Android용 .NET 빌드 시스템은 빌드 프로세스에 연결하려는 사용자를 위해 몇 가지 공용 확장 지점을 노출합니다. 이 확장점 중 하나를 사용하려면 사용자 지정 대상을 PropertyGroup
의 해당하는 MSBuild 속성에 추가해야 합니다. 예시:
<PropertyGroup>
<AfterGenerateAndroidManifest>
$(AfterGenerateAndroidManifest);
YourTarget;
</AfterGenerateAndroidManifest>
</PropertyGroup>
확장점에는 다음이 포함됩니다.
빌드 프로세스 확장에 대한 주의 사항: 빌드 확장이 올바르게 작성되지 않은 경우 특히 모든 빌드에서 실행되는 경우 빌드 성능에 영향을 줄 수 있습니다. 해당 확장을 구현하기 전에 MSBuild 설명서를 읽는 것이 좋습니다.
대상 정의
빌드 프로세스의 Android 관련 부분에 대한 .NET은 정의$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets
되어 있지만 어셈블리를 빌드하려면 Microsoft.CSharp.targets와 같은 일반적인 언어별 대상도 필요합니다.
모든 언어 대상을 가져오기 전에 다음과 같은 빌드 속성을 설정해야 합니다.
<PropertyGroup>
<TargetFrameworkIdentifier>MonoDroid</TargetFrameworkIdentifier>
<MonoDroidVersion>v1.0</MonoDroidVersion>
<TargetFrameworkVersion>v2.2</TargetFrameworkVersion>
</PropertyGroup>
C#에서는 Xamarin.Android.CSharp.targets를 가져와서 이러한 대상과 속성을 모두 포함할 수 있습니다.
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
이 파일은 다른 언어에 맞게 쉽게 조정할 수 있습니다.