Processo de build
O processo de build do Xamarin.Android é responsável por colar tudo: gerar Resource.designer.cs
, dar suporte ao @(AndroidAsset)
, @(AndroidResource)
e outras ações de build, gerar wrappers que podem ser chamados pelo Android e gerar um .apk
para execução em dispositivos Android.
Pacotes de Aplicativos
Em termos gerais, há dois tipos de pacotes de aplicativos do Android (arquivos .apk
) que o sistema de build do Xamarin.Android pode gerar:
Builds de versão, que são totalmente independentes e não exigem pacotes extras para execução. Esses são os pacotes fornecidos a uma Loja de aplicativos.
Builds de depuração, que não o são.
Esses tipos de pacote correspondem ao MSBuild Configuration
que produz o pacote.
Runtime compartilhado
Antes do Xamarin.Android 11.2, o runtime compartilhado era um par de pacotes extras do Android que fornecem a Biblioteca de Classes Base (mscorlib.dll
etc.) e a biblioteca de associação do Android (Mono.Android.dll
etc.). Builds de depuração contam com o runtime compartilhado em vez de incluir os assemblies da biblioteca de classes base e da biblioteca de associações dentro do pacote do aplicativo Android, permitindo que o pacote de depuração seja menor.
O runtime compartilhado pode ser desabilitado em builds de depuração definindo o$(AndroidUseSharedRuntime)
propriedade para False
.
O suporte para o Runtime Compartilhado foi removido no Xamarin.Android 11.2.
Fast Deployment
A implantação rápida funciona reduzindo ainda mais o tamanho do pacote do aplicativo Android. Isso é feito excluindo os assemblies do aplicativo do pacote e, em vez disso, implantando os assemblies do aplicativo diretamente no diretório interno files
do aplicativo, geralmente localizado em /data/data/com.some.package
. O diretório interno files
não é uma pasta globalmente gravável, portanto, a run-as
ferramenta é usada para executar todos os comandos para copiar os arquivos para esse diretório.
Esse processo acelera o ciclo de build/implantação/depuração porque o pacote não é reinstalado quando apenas assemblies são alterados. Somente os assemblies atualizados são ressincronizados para o dispositivo de destino.
Aviso
A implantação rápida é conhecida por falhar em dispositivos que bloqueiam run-as
, que geralmente inclui dispositivos mais antigos que o Android 5.0.
O Fast Deployment é habilitado por padrão e pode ser desabilitado em builds de depuração, definindo a propriedade $(EmbedAssembliesIntoApk)
para True
.
O modo de Implantação Rápida Aprimorada pode ser usado em conjunto com esse recurso para acelerar ainda mais as implantações.
Isso implantará assemblies, bibliotecas nativas, typemaps e dexes no files
diretório. Mas você só precisará habilitar isso se estiver alterando bibliotecas nativas, associações ou código Java.
Projetos do MSBuild
O processo de build do Xamarin.Android baseia-se no MSBuild, que também é o formato de arquivo de projeto usado pelo Visual Studio para Mac e pelo Visual Studio. Normalmente, os usuários não precisarão editar os arquivos do MSBuild manualmente – o IDE cria projetos totalmente funcionais e os atualiza com quaisquer alterações feitas e invoca automaticamente os destinos de build conforme necessário.
Usuários avançados talvez queiram realizar ações sem suporte na interface gráfica do IDE, portanto, o processo de build pode ser personalizado editando-se o arquivo de projeto diretamente. Esta página documenta apenas os recursos e personalizações específicos do Xamarin.Android – muito mais coisas são possíveis com os itens, propriedades e destinos normais do MSBuild.
Projetos de associação
As seguintes propriedades de MSBuild são usadas com projetos de associação:
Resource.designer.cs
Geração
As seguintes propriedades do MSBuild são usadas para controlar a geração do Resource.designer.cs
arquivo:
$(AndroidAapt2CompileExtraArgs)
$(AndroidAapt2LinkExtraArgs)
$(AndroidExplicitCrunch)
$(AndroidR8IgnoreWarnings)
$(AndroidResgenExtraArgs)
$(AndroidResgenFile)
$(AndroidUseAapt2)
$(MonoAndroidResourcePrefix)
Propriedades de assinatura
As propriedades de assinatura controlam como o pacote do aplicativo é assinado, para que ele possa ser instalado em um dispositivo Android. Para permitir uma iteração de build mais rápida, as tarefas do Xamarin.Android não assinam pacotes durante o processo de build, porque assinar é algo muito lento. Em vez disso, eles são assinados (se necessário) antes da instalação ou durante a exportação, pelo IDE ou pelo destino de build Install. Invocar o destino SignAndroidPackage produzirá um pacote com o sufixo -Signed.apk
no diretório de saída.
Por padrão, o destino da assinatura gera uma nova chave de assinatura de depuração, se necessário. Se você quiser usar uma chave específica, por exemplo, em um servidor de build, as seguintes propriedades do MSBuild serão usadas:
$(AndroidDebugKeyAlgorithm)
$(AndroidDebugKeyValidity)
$(AndroidDebugStoreType)
$(AndroidKeyStore)
$(AndroidSigningKeyAlias)
$(AndroidSigningKeyPass)
$(AndroidSigningKeyStore)
$(AndroidSigningStorePass)
$(JarsignerTimestampAuthorityCertificateAlias)
$(JarsignerTimestampAuthorityUrl)
keytool
Mapeamento de opções
Considere a seguinte keytool
invocação:
$ 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]
Para usar o armazenamento de chaves gerado acima, use o grupo de propriedades:
<PropertyGroup>
<AndroidKeyStore>True</AndroidKeyStore>
<AndroidSigningKeyStore>filename.keystore</AndroidSigningKeyStore>
<AndroidSigningStorePass>keystore.filename password</AndroidSigningStorePass>
<AndroidSigningKeyAlias>keystore.alias</AndroidSigningKeyAlias>
<AndroidSigningKeyPass>keystore.alias password</AndroidSigningKeyPass>
</PropertyGroup>
Criar pontos de extensão
O sistema de build Xamarin.Android expõe alguns pontos de extensão públicos para os usuários que desejam se conectar ao nosso processo de build. Para usar um desses pontos de extensão, você precisará adicionar seu destino personalizado à propriedade apropriada do MSBuild em um PropertyGroup
. Por exemplo:
<PropertyGroup>
<AfterGenerateAndroidManifest>
$(AfterGenerateAndroidManifest);
YourTarget;
</AfterGenerateAndroidManifest>
</PropertyGroup>
Os pontos de extensão incluem:
Uma palavra de cautela sobre a extensão do processo de build: se não for gravado corretamente, as extensões de build poderão afetar o desempenho do build, especialmente se forem executadas em cada build. É altamente recomendável que você leia a documentação do MSBuild antes de implementar essas extensões.
Definições de destino
As partes do processo de build específicas do Xamarin.Android são definidas em $(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets
, mas destinos normais específicos a uma linguagem, tais como Microsoft.CSharp.targets, também são necessários para compilar o assembly.
As seguintes propriedades de build devem ser definidas antes de importar quaisquer destinos de linguagem de programação:
<PropertyGroup>
<TargetFrameworkIdentifier>MonoDroid</TargetFrameworkIdentifier>
<MonoDroidVersion>v1.0</MonoDroidVersion>
<TargetFrameworkVersion>v2.2</TargetFrameworkVersion>
</PropertyGroup>
Todos esses destinos e propriedades podem ser incluídos para C# importando Xamarin.Android.CSharp.targets:
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
Esse arquivo pode ser facilmente adaptado para outras linguagens de programação.