Compartilhar via


Preparando um aplicativo para lançamento

Depois que um aplicativo tiver sido codificado e testado, é necessário preparar um pacote para distribuição. A primeira tarefa na preparação desse pacote é criar o aplicativo para lançamento, o que envolve principalmente a definição de alguns atributos de aplicativo.

Use as seguintes etapas para criar o aplicativo para lançamento:

  • Especificar o Ícone do Aplicativo – cada aplicativo Xamarin.Android deve ter um ícone de aplicativo especificado. Embora tecnicamente não seja necessário, alguns mercados, como o Google Play, exigem isso.

  • Versão do aplicativo – esta etapa envolve inicializar ou atualizar as informações de controle de versão. Isso é importante para atualizações futuras de aplicativos e para garantir que os usuários estejam cientes de qual versão do aplicativo eles instalaram.

  • Reduzir o APK – O tamanho do APK final pode ser substancialmente reduzido usando o vinculador Xamarin.Android no código gerenciado e ProGuard no bytecode Java.

  • Proteger o aplicativo – impedir que usuários ou invasores depurem, adulteram ou revertam a engenharia do aplicativo desabilitando a depuração, ofuscando o código gerenciado, adicionando antidepuração e anti-adulteração e usando a compilação nativa.

  • Definir propriedades de empacotamento – as propriedades de empacotamento controlam a criação do APK (pacote de aplicativos Android). Esta etapa otimiza a APK, protege seus ativos e modulariza o empacotamento conforme necessário. Além disso, você pode fornecer aos usuários um Pacote de Aplicativos Android otimizado para seus dispositivos.

  • Compilar – Esta etapa compila o código e os ativos para verificar se ele é compilado no modo Versão.

  • Arquivo para Publicação – esta etapa compila o aplicativo e o coloca em um arquivo para assinatura e publicação.

Cada uma dessas etapas é descrita abaixo com mais detalhes.

Especificar o ícone do aplicativo

É altamente recomendável que cada aplicativo Xamarin.Android especifique um ícone de aplicativo. Alguns marketplaces de aplicativos não permitirão que um aplicativo Android seja publicado sem um. A Icon propriedade do Application atributo é usada para especificar o ícone do aplicativo para um projeto Xamarin.Android.

No Visual Studio 2017 e posterior, especifique o ícone do aplicativo por meio da seção Manifesto do Android das Propriedades do projeto, conforme mostrado na seguinte captura de tela:

Definir o ícone do aplicativo

Nestes exemplos, @drawable/icon refere-se a um arquivo de ícone localizado em Recursos/desenhável/icon.png (observe que a extensão .png não está incluída no nome do recurso). Esse atributo também pode ser declarado no arquivo Properties\AssemblyInfo.cs, conforme mostrado neste snippet de exemplo:

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

Normalmente, using Android.App é declarado na parte superior de AssemblyInfo.cs (o namespace do Application atributo é Android.App); no entanto, talvez seja necessário adicionar essa using instrução se ela ainda não estiver presente.

Versão do aplicativo

O controle de versão é importante para a manutenção e distribuição de aplicativos Android. Sem algum tipo de controle de versão em vigor, é difícil determinar se ou como um aplicativo deve ser atualizado. Para ajudar no controle de versão, o Android reconhece dois tipos diferentes de informações:

  • Número de versão – um valor inteiro (usado internamente pelo Android e pelo aplicativo) que representa a versão do aplicativo. A maioria dos aplicativos começa com esse valor definido como 1 e, em seguida, é incrementado com cada build. Esse valor não tem nenhuma relação ou afinidade com o atributo de nome de versão (veja abaixo). Aplicativos e serviços de publicação não devem exibir esse valor para os usuários. Esse valor é armazenado no arquivo AndroidManifest.xml como android:versionCode.

  • Nome da versão – uma cadeia de caracteres que é usada apenas para comunicar informações ao usuário sobre a versão do aplicativo (conforme instalado em um dispositivo específico). O nome da versão destina-se a ser exibido para usuários ou no Google Play. Essa cadeia de caracteres não é usada internamente pelo Android. O nome da versão pode ser qualquer valor de cadeia de caracteres que ajude um usuário a identificar o build instalado em seu dispositivo. Esse valor é armazenado no arquivo AndroidManifest.xml como android:versionName.

No Visual Studio, esses valores podem ser definidos na seção Manifesto do Android das Propriedades do projeto, conforme mostrado na seguinte captura de tela:

Definir o número da versão

Reduzir o APK

As APKs do Xamarin.Android podem ser menores por meio de uma combinação do vinculador Xamarin.Android, que remove o código gerenciado desnecessário e a ferramenta ProGuard do SDK do Android, que remove o código de byte java não utilizado. O processo de build primeiro usa o vinculador Xamarin.Android para otimizar o aplicativo no nível do código gerenciado (C#) e, em seguida, usa o ProGuard (se habilitado) para otimizar o APK no nível do código de byte do Java.

Configurar o vinculador

O modo de liberação desativa o runtime compartilhado e ativa a vinculação para que o aplicativo forneça apenas as partes do Xamarin.Android necessárias durante a execução. O vinculador no Xamarin.Android usa análise estática para determinar quais assemblies, tipos e membros de tipo são usados ou referenciados por um aplicativo Xamarin.Android. O vinculador, em seguida, descarta todos os assemblies, tipos e membros que não são usados (ou referenciados). Isso pode resultar em uma redução significativa no tamanho do pacote. Por exemplo, considere o exemplo helloworld , que experimenta uma redução de 83% no tamanho final de sua APK:

  • Configuração: Nenhum - Xamarin.Android 4.2.5 Tamanho = 17,4 MB.

  • Configuração: Somente Assemblies do SDK - Xamarin.Android 4.2.5 Tamanho = 3 MB.

Defina as opções do vinculador por meio da seção Opções do Android das Propriedades do projeto:

Opções do vinculador

O menu suspenso Vinculação fornece as seguintes opções para controlar o vinculador:

  • Nenhum – isso desativa o vinculador; nenhuma vinculação será executada.

  • Apenas Assemblies do SDK – Isso vinculará apenas os assemblies exigidos pelo Xamarin.Android. Outros assemblies não serão vinculados.

  • Assemblies de SDK e de Usuário - Isso vinculará todos os assemblies exigidos pelo aplicativo, e não apenas os exigidos pelo Xamarin.Android.

A vinculação pode produzir alguns efeitos colaterais não intencionais, portanto, é importante que um aplicativo seja testado novamente no modo de versão em um dispositivo físico.

ProGuard

O ProGuard é uma ferramenta do SDK do Android que vincula e ofusca o código Java. O ProGuard normalmente é usado para criar aplicativos menores, reduzindo a presença de grandes bibliotecas incluídas (como o Google Play Services) no seu APK. O ProGuard remove o código de byte Java não utilizado, o que torna o aplicativo resultante menor. Por exemplo, usar o ProGuard em pequenos aplicativos Xamarin.Android geralmente alcança uma redução de 24% no tamanho - usar o ProGuard em aplicativos maiores com várias dependências de biblioteca geralmente alcança uma redução de tamanho ainda maior.

O ProGuard não é uma alternativa ao vinculador Xamarin.Android. O vinculador Xamarin.Android vincula o código gerenciado, enquanto o ProGuard vincula o bytecode Java. O processo de build primeiro usa o vinculador Xamarin.Android para otimizar o código gerenciado (C#) no aplicativo e, depois, usa o ProGuard (se habilitado) para otimizar o APK no nível do código de byte do Java.

Quando Habilitar ProGuard é verificado, o Xamarin.Android executa a ferramenta ProGuard no APK resultante. Um arquivo de configuração do ProGuard é gerado e usado pelo ProGuard no momento da compilação. O Xamarin.Android também dá suporte a ações de build personalizadas do ProguardConfiguration . Você pode adicionar um arquivo de configuração personalizado do ProGuard ao seu projeto, clicar com o botão direito do mouse nele e selecioná-lo como uma ação de build, conforme mostrado neste exemplo:

O ProGuard está desabilitado por padrão. A opção Habilitar ProGuard só estará disponível quando o projeto estiver definido em Modo de Release. Todas as ações de build do ProGuard são ignoradas, a menos que Enable ProGuard esteja marcado. A configuração do Xamarin.Android ProGuard não ofusca o APK e não é possível habilitar a ofuscação, mesmo com arquivos de configuração personalizados. Se você quiser usar ofuscação, consulte Proteção de Aplicativo com Dotfuscator.

Para obter informações mais detalhadas sobre como usar a ferramenta ProGuard, consulte ProGuard.

Proteger o aplicativo

Desativar a depuração

Durante o desenvolvimento de um aplicativo Android, a depuração é executada com o uso do JDWP ( Java Debug Wire Protocol ). Essa é uma tecnologia que permite que ferramentas como o adb se comuniquem com uma JVM para fins de depuração. O JDWP é ativado por padrão nas compilações de depuração de um aplicativo Xamarin.Android. Embora o JDWP seja importante durante o desenvolvimento, ele pode representar um problema de segurança para aplicativos lançados.

Importante

Sempre desabilite o estado de depuração em um aplicativo liberado, pois é possível (via JDWP) obter acesso total ao processo Java e executar código arbitrário no contexto do aplicativo se esse estado de depuração não estiver desabilitado.

O manifesto do Android contém o atributo android:debuggable, que controla se o aplicativo pode ou não ser depurado. É considerada uma boa prática definir o android:debuggable atributo como false. A maneira mais simples de fazer isso é adicionando uma instrução de compilação condicional em AssemblyInfo.cs:

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

Observe que os builds de depuração definem automaticamente algumas permissões para facilitar a depuração (como Internet e ReadExternalStorage). No entanto, as compilações de versão usam apenas as permissões que você configura explicitamente. Se você descobrir que alternar para o build de Release faz com que seu aplicativo perca uma permissão que estava disponível no build de Debug, verifique se você habilitou explicitamente essa permissão na lista de permissões necessárias, conforme descrito em Permissões.

Proteção de Aplicativo com o Dotfuscator

Mesmo com a depuração desabilitada, ainda é possível que os invasores reempacotem um aplicativo, adicionando ou removendo as opções ou permissões de configuração. Isso permite que eles façam engenharia reversa, depurem ou alterem o aplicativo. O Dotfuscator Community Edition (CE) pode ser usado para ofuscar o código gerenciado e injetar código de detecção do estado de segurança em tempo de execução em um aplicativo Xamarin.Android no momento da compilação para identificar e reagir caso o aplicativo esteja sendo executado em um dispositivo desbloqueado.

O Dotfuscator CE está incluído no Visual Studio 2017. Para usar o Dotfuscator, clique em Ferramentas > PreEmptive Protection - Dotfuscator.

Para configurar o Dotfuscator CE, consulte Usando o Dotfuscator Community Edition com o Xamarin. Depois de configurado, o Dotfuscator CE protegerá automaticamente cada build criado.

Agrupar assemblies em código nativo

Quando essa opção está habilitada, os assemblies são agrupados em uma biblioteca compartilhada nativa. Isso permite que os assemblies sejam compactados, permitindo arquivos menores .apk. A compactação de assembly também confere uma forma mínima de ofuscação; não se deve confiar nessa ofuscação.

Essa opção requer uma licença Enterprise e só está disponível quando a Implantação Rápida de Uso está desabilitada. Agrupar assemblies em código nativo é desabilitado por padrão.

Observe que a opção Agrupar em Código Nativonão significa que os assemblies são compilados em código nativo. Não é possível usar a Compilação AOT para compilar assemblies em código nativo.

Compilação AOT

A opção Compilação AOT (na página Propriedades de Empacotamento) permite compilação AOT (Ahead-of-Time) de assemblies. Quando essa opção está habilitada, a sobrecarga de inicialização JIT (Just-In-Time) é minimizada pela pré-compilação de assemblies antes do runtime. O código nativo resultante é incluído no APK junto com os assemblies não compilados. Isso resulta em um tempo de inicialização de aplicativo mais curto, mas em detrimento de tamanhos de APK ligeiramente maiores.

A opção Compilação AOT requer uma licença Enterprise ou superior. A compilação AOT só está disponível quando o projeto está configurado para o modo de versão e está desabilitado por padrão. Para obter mais informações sobre a Compilação AOT, consulte AOT.

Compilador de otimização de LLVM

O Compilador de Otimização de LLVM criará um código compilado menor e mais rápido e converterá assemblies compilados por AOT em código nativo, mas em detrimento de tempos de build mais lentos. O compilador LLVM está desabilitado por padrão. Para usar o compilador LLVM, a opção compilação AOT deve primeiro ser habilitada (na página Propriedades de Empacotamento ).

Observação

A opção do Compilador de Otimização de LLVM requer uma licença Enterprise.

Definir propriedades de empacotamento

As propriedades de empacotamento podem ser definidas na seção Opções do Android das Propriedades do projeto, conforme mostrado na seguinte captura de tela:

Propriedades de empacotamento

Muitas dessas propriedades, como Usar Runtime Compartilhado e Usar Implantação Rápida, destinam-se ao modo de Depuração. No entanto, quando o aplicativo é configurado para o modo de versão, há outras configurações que determinam como o aplicativo é otimizado para tamanho e velocidade de execução, como ele é protegido contra adulteração e como ele pode ser empacotado para dar suporte a diferentes arquiteturas e restrições de tamanho.

Especificar arquiteturas com suporte

Ao preparar um aplicativo Xamarin.Android para lançamento, é necessário especificar as arquiteturas de CPU com suporte. Uma única APK pode conter código de computador para dar suporte a várias arquiteturas diferentes. Consulte arquiteturas de CPU para obter detalhes sobre como dar suporte a várias arquiteturas de CPU.

Gerar um pacote (.APK) para cada ABI selecionada

Quando essa opção estiver habilitada, um APK será criado para cada uma das ABIs com suporte (selecionada na guia Avançado , conforme descrito em Arquiteturas de CPU) em vez de uma APK única e grande para todas as ABIs compatíveis. Essa opção só estará disponível quando o projeto estiver configurado para o modo de versão e estiver desabilitado por padrão.

Multi-Dex

Quando a opção Habilitar Multi-Dex está habilitada, as ferramentas do SDK do Android são usadas para superar o limite de método de 65K do formato .dex. A limitação do método 65K baseia-se no número de métodos Java que um aplicativo faz referência (incluindo aqueles em qualquer biblioteca da qual o aplicativo depende) – não se baseia no número de métodos escritos no código-fonte. Se um aplicativo definir apenas alguns métodos, mas usar muitas (ou bibliotecas grandes), é possível que o limite de 65 K seja excedido.

É possível que um aplicativo não esteja usando todos os métodos em cada biblioteca referenciada; portanto, é possível que uma ferramenta como o ProGuard (veja acima) possa remover os métodos não utilizados do código. A melhor prática é habilitar Multi-Dex somente se for absolutamente necessário, isto é, o aplicativo ainda faz referência a mais de 65K métodos Java mesmo depois de usar o ProGuard.

Para obter mais informações sobre o Multi-Dex, consulte Configurar aplicativos com mais de 64 mil métodos.

Pacotes de aplicativos Android

Os pacotes de aplicativos diferem das APKs, pois não podem ser implantados diretamente em um dispositivo. Em vez disso, é um formato que se destina a ser enviado com todo o seu código compilado e recursos. Depois de carregar o pacote do aplicativo assinado, o Google Play terá tudo o que precisa para criar e assinar as APKs do aplicativo e atendê-las aos usuários usando a Entrega Dinâmica.

Para habilitar o suporte para Pacotes de Aplicativos Android, você precisará aceitar o bundle valor da propriedade Formato de Pacote android nas opções de projeto do Android. Antes de fazer isso, certifique-se de alterar seu projeto para uma Release configuração, pois os pacotes de aplicativos são destinados apenas a pacotes de lançamento.

Agora você pode gerar um pacote de aplicativos seguindo o Fluxo de Arquivos. Isso gerará um pacote de aplicativos para seu aplicativo.

Para obter mais informações sobre pacotes de aplicativos Android, consulte Pacotes de Aplicativos Android.

Compilar

Depois que todas as etapas acima forem concluídas, o aplicativo estará pronto para compilação. Selecione Compilar > Reconstruir Solução para verificar se ela é compilada com êxito no modo de Release. Observe que essa etapa ainda não produz um APK.

Assinatura do Pacote do Aplicativo trata do empacotamento e da assinatura em mais detalhes.

Arquivo morto para publicação

Para iniciar o processo de publicação, clique com o botão direito do mouse no projeto no Gerenciador de Soluções e selecione o item de menu de contexto Arquivo...

Arquivar aplicativo

Arquivo... inicia o Gerenciador de Arquivos e inicia o processo de arquivamento do pacote de aplicativos, conforme mostrado nesta captura de tela:

Gerenciador de Arquivos

Outra maneira de criar um arquivo morto é clicar com o botão direito do mouse na Solução no Gerenciador de Soluções e selecionar Arquivar Tudo..., que cria a solução e arquiva todos os projetos do Xamarin que podem gerar um arquivo morto:

Arquivar Tudo

Arquivar e arquivar tudo automaticamente inicia o Gerenciador de Arquivos. Para iniciar o Gerenciador de Arquivos diretamente, clique no item de menu Gerenciador de Arquivos de Ferramentas > ... :

Iniciar o Gerenciador de Arquivos

Você pode visualizar os arquivos da solução a qualquer momento clicando com o botão direito do mouse no nó Solução e selecionando Visualizar Arquivos:

Exibir Arquivos

O Gerenciador de Arquivos

O Gerenciador de Arquivos é composto por um painel Lista de Soluções , uma Lista de Arquivos e um Painel de Detalhes:

Painéis do Gerenciador de Arquivos

A Lista de Soluções exibe todas as soluções com pelo menos um projeto arquivado. A Lista de Soluções inclui as seguintes seções:

  • Solução atual – exibe a solução atual. Note que esta área pode estar vazia se a solução atual não tiver um arquivo existente.
  • Todos os Arquivos – exibe todas as soluções que têm um arquivo.
  • Caixa de texto de pesquisa (na parte superior) – Filtra as soluções listadas na lista Todos os Arquivos de acordo com a cadeia de caracteres de pesquisa inserida na caixa de texto.

A Lista de Arquivos exibe a lista de todos os arquivos da solução selecionada. A Lista de Arquivos inclui as seguintes seções:

  • Nome da solução selecionada – exibe o nome da solução selecionada na Lista de Soluções. Todas as informações mostradas na Lista de Arquivos referem-se a esta solução selecionada.
  • Filtro de plataformas – esse campo possibilita filtrar arquivos por tipo de plataforma (como iOS ou Android).
  • Itens de Arquivo – Lista de itens arquivados para a solução selecionada. Cada item nessa lista inclui o nome do projeto, a data de criação e a plataforma. Ele também pode mostrar informações adicionais, como o progresso quando um item está sendo arquivado ou publicado.

O Painel de Detalhes exibe informações adicionais sobre cada arquivo. Ele também permite que o usuário inicie o fluxo de trabalho distribuição ou abra a pasta em que a distribuição foi criada. A seção Comentários de Build permite a inclusão de comentários de build no arquivo.

Distribuição

Quando uma versão arquivada do aplicativo estiver pronta para publicação, selecione o arquivo no Gerenciador de Arquivos e clique no botão Distribuir...

Botão Distribuir

A caixa de diálogo Canal de Distribuição mostra informações sobre o aplicativo, uma indicação do progresso do fluxo de trabalho de distribuição e uma opção de canais de distribuição. Na primeira execução, duas opções são apresentadas:

Selecionar Canal de Distribuição

É possível escolher um dos seguintes canais de distribuição:

  • Ad-Hoc – salva um APK assinado em disco que pode ser carregado em dispositivos Android. Continue para a assinatura do pacote de aplicativos para saber como criar uma identidade de assinatura para Android, criar um novo certificado de assinatura para aplicativos Android e publicar uma versão ad hoc do aplicativo no disco. Essa é uma boa maneira de criar um APK para teste.

  • Google Play – Publica um APK assinado no Google Play. Continue publicando no Google Play para saber como assinar e publicar um APK na Google Play Store.