Partilhar via


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:

  1. 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.

  2. 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:

  1. A estrutura de destino é definida como algo que contém o texto -android.
  2. 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