Publicar um aplicativo Android usando a linha de comando
Para distribuir um aplicativo Android do .NET MAUI (.NET Multi-Platform App UI), você precisará assiná-lo com uma chave do repositório de chaves. Um repositório de chaves é um banco de dados de certificados de segurança criado usando o keytool
do JDK (Java Development Kit). Um repositório de chaves é necessário ao publicar um aplicativo Android do .NET MAUI, pois o Android não executará aplicativos que não tiverem sido assinados.
Criar um arquivo de repositório de chaves
Durante o desenvolvimento, o .NET para Android usa um repositório de chaves de depuração para assinar o aplicativo, o que permite que ele seja implantado diretamente em um emulador ou em dispositivos configurados para executar aplicativos depuráveis. No entanto, esse repositório de chaves não é reconhecido como um repositório de chaves válido para fins de distribuição de aplicativos. Portanto, um repositório de chaves privado precisa ser criado e usado para assinar builds de versão. Essa é uma etapa que só deve ser executada uma vez, pois a mesma chave será usada para publicar atualizações e pode ser usada para assinar outros aplicativos. Depois de gerar um arquivo de repositório de chaves, você fornecerá os detalhes dele por meio da linha de comando ao compilar o aplicativo ou configurará o arquivo de projeto para referenciá-lo.
Execute as seguintes etapas para criar um arquivo de repositório de chaves:
Abra um terminal e navegue até a pasta do projeto.
Dica
Se o Visual Studio estiver aberto, use o menu Exibir>Terminal para abrir um terminal no local da solução ou do projeto. Navegue até a pasta do projeto.
Execute a ferramenta keytool com os seguintes parâmetros:
keytool -genkeypair -v -keystore {filename}.keystore -alias {keyname} -keyalg RSA -keysize 2048 -validity 10000
Importante
Se você tiver várias versões do JDK instaladas em seu computador, certifique-se de executar
keytool
a partir da versão mais recente do JDK.Você será solicitado a fornecer e confirmar uma senha, seguida pelo nome completo, unidade organizacional, organização, cidade ou localidade, estado ou província e código do país. Essas informações não são exibidas em seu aplicativo, mas são incluídas em seu certificado.
Por exemplo, para gerar um arquivo myapp.keystore na mesma pasta do projeto, com um alias de
myapp
, use o seguinte comando:keytool -genkeypair -v -keystore myapp.keystore -alias myapp -keyalg RSA -keysize 2048 -validity 10000
Dica
Faça backup do repositório de chaves e da senha. Se você perdê-lo, não será possível assinar seu aplicativo com a mesma identidade de assinatura.
Localizar a assinatura do repositório de chaves
Para listar as chaves armazenadas em um repositório de chaves, use keytool
com a opção -list
:
keytool -list -keystore {filename}.keystore
Por exemplo, para listar as chaves em um repositório de chaves chamado myapp.keystore, use o seguinte comando:
keytool -list -keystore myapp.keystore
Compilar e assinar seu aplicativo
Para compilar seu aplicativo a partir da linha de comando e assiná-lo usando o repositório de chaves, abra um terminal e navegue até a pasta do projeto de aplicativo do .NET MAUI. Execute o comando dotnet publish
, fornecendo os seguintes parâmetros:
Parâmetro | Valor |
---|---|
-f ou --framework |
A estrutura de destino, que é net8.0-android . |
-c ou --configuration |
A configuração do build, que é Release . |
Aviso
A tentativa de publicar uma solução MAUI do .NET resultará na tentativa do comando dotnet publish
de publicar cada projeto na solução individualmente, o que pode causar problemas quando você adicionou outros tipos de projeto à sua solução. Portanto, o comando dotnet publish
deve ser definido como escopo para seu projeto de aplicativo MAUI do .NET.
Parâmetros de build adicionais podem ser especificados na linha de comando, se não forem fornecidos em um <PropertyGroup>
em seu arquivo de projeto. A seguinte tabela lista alguns dos parâmetros comuns:
Parâmetro | Valor |
---|---|
-p:ApplicationTitle |
O nome visível do usuário para o aplicativo. |
-p:ApplicationId |
O identificador exclusivo do aplicativo, como com.companyname.mymauiapp . |
-p:ApplicationVersion |
A versão de build que identifica uma iteração do aplicativo. |
-p:ApplicationDisplayVersion |
O número de versão do aplicativo. |
-p:AndroidKeyStore |
Um valor booliano que indica se o aplicativo deve ser assinado. O valor padrão é false . |
-p:AndroidPackageFormats |
Uma propriedade delimitada por ponto e vírgula que indica se você deseja empacotar o aplicativo como um arquivo APK ou AAB. Defina como aab ou apk para gerar apenas um formato. O valor padrão para builds de versão é aab;apk . |
-p:AndroidSigningKeyAlias |
O alias da chave no repositório de chaves. Esse é o valor keytool -alias usado ao criar o repositório de chaves. |
-p:AndroidSigningKeyPass |
A senha da chave dentro do arquivo do repositório de chaves. Esse é o valor fornecido ao keytool criar o arquivo do repositório de chaves, e você é solicitado a inserir a senha do repositório de chaves. Isso ocorre porque o tipo de repositório de chaves padrão pressupõe que a senha da chave e a senha do repositório de chaves sejam idênticas. Essa propriedade também dá suporte a prefixos env: e file: que podem ser usados para especificar uma variável de ambiente ou arquivo que contenha a senha. Essas opções fornecem uma maneira de impedir que a senha apareça nos logs de build. |
-p:AndroidSigningKeyStore |
O nome do arquivo do repositório de chaves criado por keytool . Esse é o valor keytool -keystore usado ao criar o repositório de chaves. |
-p:AndroidSigningStorePass |
A senha do arquivo do repositório de chaves. Esse é o valor fornecido ao keytool criar o arquivo do repositório de chaves, e você é solicitado a inserir a senha do repositório de chaves. Isso ocorre porque o tipo de repositório de chaves padrão pressupõe que a senha do repositório de chaves e a senha da chave sejam idênticas. Essa propriedade também dá suporte a prefixos env: e file: que podem ser usados para especificar uma variável de ambiente ou arquivo que contenha a senha. Essas opções fornecem uma maneira de impedir que a senha apareça nos logs de build. |
-p:PublishTrimmed |
Um valor booliano que indica se o aplicativo deve ser reduzido. O valor padrão é true para builds de versão. |
Você deve usar a mesma senha que os valores dos parâmetros AndroidSigningKeyPass
e AndroidSigningStorePass
.
Para obter uma lista completa das propriedades de build, consulte Propriedades de build.
Importante
Os valores desses parâmetros não precisam ser fornecidos na linha de comando. Eles também podem ser fornecidos no arquivo de projeto. Quando um parâmetro é fornecido na linha de comando e no arquivo de projeto, o parâmetro de linha de comando tem precedência. Para obter mais informações sobre como fornecer propriedades de build em seu arquivo de projeto, consulte Definir propriedades de build em seu arquivo de projeto.
Execute o comando dotnet publish
com os seguintes parâmetros para compilar e assinar seu aplicativo:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore={filename}.keystore -p:AndroidSigningKeyAlias={keyname} -p:AndroidSigningKeyPass={password} -p:AndroidSigningStorePass={password}
Observação
No .NET 8, o comando dotnet publish
usa como padrão a configuração Release
. Portanto, a configuração de build pode ser omitida da linha de comando.
Por exemplo, use o seguinte comando para compilar e assinar seu aplicativo usando o repositório de chaves criado anteriormente:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore=myapp.keystore -p:AndroidSigningKeyAlias=myapp -p:AndroidSigningKeyPass=mypassword -p:AndroidSigningStorePass=mypassword
Ambas as propriedades AndroidSigningKeyPass
e AndroidSigningStorePass
dão suporte aos prefixos env:
e file:
que podem ser usados para especificar uma variável de ambiente ou arquivo que contenha a senha. Especificar a senha dessa forma impede que ela apareça em logs de build. Por exemplo, para usar uma variável de ambiente chamada AndroidSigningPassword
:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore=myapp.keystore -p:AndroidSigningKeyAlias=myapp -p:AndroidSigningKeyPass=env:AndroidSigningPassword -p:AndroidSigningStorePass=env:AndroidSigningPassword
Importante
O prefixo env: não tem suporte quando $(AndroidPackageFormat)
é definido como aab
.
Para usar um arquivo localizado em C:\Users\user1\AndroidSigningPassword.txt:
dotnet publish -f net8.0-android -c Release -p:AndroidKeyStore=true -p:AndroidSigningKeyStore=myapp.keystore -p:AndroidSigningKeyAlias=myapp -p:AndroidSigningKeyPass=file:C:\Users\user1\AndroidSigningPassword.txt -p:AndroidSigningStorePass=file:C:\Users\user1\AndroidSigningPassword.txt
A publicação compila e assina o aplicativo e copia os arquivos AAB e APK para a pasta bin\Release\net8.0-android\publish. Há dois arquivos AAB : um assinado e outro não assinado. A variante assinada tem -signed no nome do arquivo.
Para obter mais informações sobre o comando dotnet publish
, consulte dotnet publish.
Observação
Para aplicativos Android, dotnet build
também pode ser usado para compilar e assinar seu aplicativo. No entanto, os arquivos AAB e APK serão criados na pasta bin\Release\net8.0-android em vez da subpasta publish. dotnet build
também usa como padrão uma configuração Debug
, portanto, o parâmetro -c
é necessário para especificar a configuração Release
.
Definir propriedades de build em seu arquivo de projeto
Uma alternativa para especificar parâmetros de build na linha de comando é especificá-los em seu arquivo de projeto em um <PropertyGroup>
. A seguinte tabela lista algumas das propriedades de build comuns:
Propriedade | Valor |
---|---|
<ApplicationTitle> |
O nome visível do usuário para o aplicativo. |
<ApplicationId> |
O identificador exclusivo do aplicativo, como com.companyname.mymauiapp . |
<ApplicationVersion> |
A versão de build que identifica uma iteração do aplicativo. |
<ApplicationDisplayVersion> |
O número de versão do aplicativo. |
<AndroidKeyStore> |
Um valor booliano que indica se o aplicativo deve ser assinado. O valor padrão é false . |
<AndroidPackageFormats> |
Uma propriedade delimitada por ponto e vírgula que indica se você deseja empacotar o aplicativo como um arquivo APK ou AAB. Defina como aab ou apk para gerar apenas um formato. O valor padrão para builds de versão é aab;apk . |
<AndroidSigningKeyAlias> |
O alias da chave no repositório de chaves. Esse é o valor keytool -alias usado ao criar o repositório de chaves. |
<AndroidSigningKeyPass> |
A senha da chave dentro do arquivo do repositório de chaves. Esse é o valor fornecido ao keytool criar o arquivo do repositório de chaves, e você é solicitado a inserir a senha do repositório de chaves. Isso ocorre porque o tipo de repositório de chaves padrão pressupõe que a senha da chave e a senha do repositório de chaves sejam idênticas. Essa propriedade também dá suporte a prefixos env: e file: que podem ser usados para especificar uma variável de ambiente ou arquivo que contenha a senha. Essas opções fornecem uma maneira de impedir que a senha apareça nos logs de build. |
<AndroidSigningKeyStore> |
O nome do arquivo do repositório de chaves criado por keytool . Esse é o valor keytool -keystore usado ao criar o repositório de chaves. |
<AndroidSigningStorePass> |
A senha do arquivo do repositório de chaves. Esse é o valor fornecido ao keytool criar o arquivo do repositório de chaves, e você é solicitado a inserir a senha do repositório de chaves. Isso ocorre porque o tipo de repositório de chaves padrão pressupõe que a senha do repositório de chaves e a senha da chave sejam idênticas. Essa propriedade também dá suporte a prefixos env: e file: que podem ser usados para especificar uma variável de ambiente ou arquivo que contenha a senha. Essas opções fornecem uma maneira de impedir que a senha apareça nos logs de build. |
<PublishTrimmed> |
Um valor booliano que indica se o aplicativo deve ser reduzido. O valor padrão é true para builds de versão. |
Para obter uma lista completa das propriedades de build, consulte Propriedades de build.
Importante
Os valores dessas propriedades de build não precisam ser fornecidos no arquivo de projeto. Eles também podem ser fornecidos na linha de comando quando você publica o aplicativo. Isso permite omitir valores específicos do arquivo de projeto.
O seguinte exemplo mostra um grupo de propriedades típico para criar e assinar seu aplicativo Android:
<PropertyGroup Condition="$(TargetFramework.Contains('-android')) and '$(Configuration)' == 'Release'">
<AndroidSigningKeyStore>myapp.keystore</AndroidSigningKeyStore>
<AndroidSigningKeyAlias>myapp</AndroidSigningKeyAlias>
</PropertyGroup>
Este <PropertyGroup>
de exemplo adiciona uma verificação de condição, impedindo que essas configurações sejam processadas, a menos que a verificação de condição passe. A verificação de condição procura duas coisas:
- A estrutura de destino é definida como algo que contém o texto
-android
. - A configuração de build é definida como
Release
.
Se uma dessas condições falhar, as configurações não serão processadas. Mais importante, as configurações <AndroidSigningKeyStore>
e <AndroidSigningKeyAlias>
não são definidas, impedindo que o aplicativo seja assinado.
Por motivos de segurança, você não deve fornecer um valor para <AndroidSigningKeyPass>
e <AndroidSigningStorePass>
no arquivo de projeto. Você pode fornecer esses valores na linha de comando ao publicar o aplicativo ou usar os prefixos env:
ou file:
para impedir que a senha apareça nos logs de build. Por exemplo, para usar uma variável de ambiente chamada AndroidSigningPassword
:
<PropertyGroup Condition="$(TargetFramework.Contains('-android')) and '$(Configuration)' == 'Release'">
<AndroidSigningKeyStore>myapp.keystore</AndroidSigningKeyStore>
<AndroidSigningKeyAlias>myapp</AndroidSigningKeyAlias>
<AndroidSigningKeyPass>env:AndroidSigningPassword</AndroidSigningKeyPass>
<AndroidSigningStorePass>env:AndroidSigningPassword</AndroidSigningStorePass>
</PropertyGroup>
Importante
O prefixo env: não tem suporte quando $(AndroidPackageFormat)
é definido como aab
.
Como alternativa, para usar um arquivo localizado em C:\Users\user1\AndroidSigningPassword.txt:
<PropertyGroup Condition="$(TargetFramework.Contains('-android')) and '$(Configuration)' == 'Release'">
<AndroidSigningKeyStore>myapp.keystore</AndroidSigningKeyStore>
<AndroidSigningKeyAlias>key</AndroidSigningKeyAlias>
<AndroidSigningKeyPass>file:C:\Users\user1\AndroidSigningPassword.txt</AndroidSigningKeyPass>
<AndroidSigningStorePass>file:C:\Users\user1\AndroidSigningPassword.txt</AndroidSigningStorePass>
</PropertyGroup>
Distribuir o aplicativo
O arquivo APK ou AAB assinado pode ser distribuído com uma das seguintes abordagens:
- A abordagem mais comum para distribuir aplicativos Android aos usuários é por meio do Google Play. O Google Play exige que você envie seu aplicativo como um AAB (Pacote de Aplicativos Android). Para obter mais informações, consulte Carregar seu aplicativo no Play Console em developer.android.com
- Os arquivos APK podem ser distribuídos para dispositivos Android por meio de um site ou servidor. Quando os usuários navegam até um link de download de seu dispositivo Android, o arquivo é baixado. O Android começa automaticamente a instalá-lo no dispositivo, se o usuário tiver definido as configurações dele para permitir a instalação de aplicativos de fontes desconhecidas. Para obter mais informações sobre como optar por permitir aplicativos de fontes desconhecidas, consulte Aceitação do usuário para aplicativos e fontes desconhecidos em developer.android.com.
Confira também
- Sobre pacotes de aplicativos Android em developer.android.com