The Android Developer Challenge is back! Submit your idea before December 2.

Novos recursos na visualização do Android Studio

O Android Studio 3.4 foi lançado para o Canal Stable. Faça o download aqui.

O Android Studio 3.5 está atualmente no Canal Beta.

O Android Studio 3.6 está atualmente nos Canais Canary e Dev.

Esta página fornece um resumo dos novos recursos e mudanças nessas versões de visualização.

Para ver as notícias mais recentes sobre as versões, incluindo uma lista das principais correções em cada uma, consulte também as Atualizações de versão.

Se você encontrar algum problema ao usar uma versão de visualização do Android Studio, informe-nos. Seus relatórios de bugs ajudam a melhorar o Android Studio.

Android Studio 3.5

Esta seção fornece um resumo dos novos recursos e alterações no Android Studio 3.5.

Atualizações do Project Marble

O Project Marble é uma iniciativa do Android Studio para melhorar significativamente a integridade do sistema e dos recursos e reduzir o número de bugs. O Android Studio 3.5 inclui muitas melhorias com esse objetivo, como as seguintes:

  • Redução da latência da IU na janela do editor e melhoria nos recursos do editor inteligente ao usar a biblioteca de vinculação de dados.
  • Aumento das velocidades de compilação com o processamento incremental de anotações.
  • Melhorias no desempenho ao usar o Android NDK.
  • Melhoria no desempenho da verificação do Lint, mitigando vários vazamentos de memória.
  • No Windows, novas ações de notificação para mitigar as regressões de velocidade de compilação causadas por software antivírus.
  • Redução significativa do uso de CPU ao usar o Android Emulator.
  • Melhoria no desempenho do Gradle Sync, ajustando o cache de compilação excluído.
  • Melhoria na experiência de atualização para fornecer mais informações e ações para ajudar a atualizar o ambiente de desenvolvimento integrado e o Android Gradle Plugin.
  • Melhor desempenho e experiência do usuário com o Layout Editor.

Para mais informações sobre atualizações do Project Marble, leia a postagem do blog Android Developers (link em inglês) ou as seções abaixo.

Processamento de anotações incremental

Ao usar o Android Gradle Plugin 3.5.0-beta01 e versões posteriores, ainda mais processadores de anotações são compatíveis com a compilação incremental de Java (link em inglês), como a Vinculação de dados. Essa otimização resulta em melhor desempenho de compilação incremental. Para ver uma lista completa, consulte a tabela de processadores de anotações incrementais (link em inglês).

Além disso, o KAPT 1.3.30 e versões posteriores também são compatíveis com processadores de anotações incrementais, que podem ser ativados incluindo o seguinte no seu arquivo gradle.properties: kapt.incremental.apt=true

Configurações de gerenciamento de memória

Se você usa um sistema operacional de 64 bits com pelo menos 5 GB de RAM, agora pode configurar a quantidade máxima de memória RAM que seu SO precisa alocar para os processos do Android Studio, como IDE principal, daemon do Gradle e daemon do Kotlin. Use essas configurações para oferecer a quantidade ideal de memória para cada processo e melhorar o desempenho do Android Studio.

Configurações de memória que permitem configurar a quantidade máxima de RAM para os processos do Android Studio.

Figura 1. Configurações de memória no Android Studio.

Você pode acessar as novas configurações selecionando File > Settings (ou Android Studio > Preferences no macOS) e localizando a seção Memory Settings em Appearance & Behavior > System Settings.

Relatório de uso de memória

Às vezes, os problemas de memória no Android Studio são difíceis de reproduzir e informar. Para ajudar a resolver esse problema, o Android Studio agora inclui um relatório de uso de memória que pode ser enviado para a equipe do Android Studio para ajudar a identificar a origem dos problemas de memória. Em versões de visualização (Canary, Beta e candidatas a lançamento), o Android Studio monitora automaticamente o uso de memória e aciona uma análise de heap de memória se detecta que o limite de pouca memória foi atingido com frequência.

Depois que a análise de heap for acionada, o Android Studio capturará um despejo de heap localmente e o analisará na próxima vez em que você executar o Android Studio. Durante a análise, o Android Studio remove todos os dados pessoais e cria um resumo do estado da memória. Esse resumo inclui instâncias de classes e objetos, bem como caminhos de referência para alocações de memória excepcionalmente grandes.

Depois que a análise é concluída, o Android Studio gera um relatório para você analisar e exibe uma notificação, como mostrado na figura 2. Clique em Review Report para ver o conteúdo do relatório de uso de memória.

Notificação que indica que um relatório de uso de memória está pronto para análise

Figura 2. Notificação que indica que um relatório de uso de memória está pronto para análise.

Antes de enviar o relatório, você pode revisar todas as informações incluídas, como mostrado na figura 3. Depois de concluir a revisão, clique em Send. A equipe do Android Studio analisará o relatório para ajudar a investigar e resolver os problemas que você estiver enfrentando.

Um relatório de uso de memória.

Figura 3. Um relatório de uso de memória.

Para executar o relatório de uso de memória manualmente, selecione Help > Analyze Memory Usage na barra de menus. Quando você escolhe essa opção, o Android Studio despeja o heap e solicita a reinicialização do ambiente de desenvolvimento integrado (IDE, na sigla em inglês). Se você reiniciá-lo, a análise do despejo de heap será iniciada imediatamente. Caso contrário, a análise do despejo de heap será iniciada na próxima vez que você executar o Android Studio. Nos dois casos, o IDE mostra uma notificação assim que o relatório de uso de memória fica pronto para análise.

Entrega condicional para módulos de recursos dinâmicos

A entrega condicional permite que você defina alguns requisitos de configuração de dispositivos para que os módulos de recursos dinâmicos sejam transferidos por download automaticamente durante a instalação do aplicativo. Por exemplo, você pode configurar um módulo de recurso dinâmico que inclua a funcionalidade de realidade aumentada (RA) disponível na instalação do aplicativo apenas para dispositivos compatíveis com RA.

No momento, esse mecanismo de entrega permite controlar o download de um módulo no momento da instalação do aplicativo com base nas seguintes configurações de dispositivos:

Se um dispositivo não atender a todos os requisitos especificados, o módulo não será transferido por download no momento da instalação do aplicativo. No entanto, seu aplicativo poderá solicitar o download do módulo sob demanda usando a Play Core Library.

Antes de começar, verifique se você está usando o Android Studio 3.5 Canary 11 ou posterior.

As seções a seguir mostram como adicionar compatibilidade com entrega condicional aos módulos de recursos dinâmicos. No entanto, lembre-se de que você precisará participar do Programa Beta para publicar aplicativos com módulos de recursos dinâmicos no Google Play.

Adicionar um novo módulo com opções de entrega condicional

A maneira mais fácil de criar um novo módulo de recurso dinâmico com entrega condicional é usando o assistente New Module, da seguinte maneira:

  1. Para abrir a caixa de diálogo New Module, selecione File > New > New Module na barra de menus.
  2. Na caixa de diálogo "New Module", selecione Dynamic Feature Module e clique em Next.
  3. Configure seu módulo como faria normalmente e clique em Next.
  4. Na seção Module Download Options da caixa de diálogo, selecione Only include module at app install for devices with specified features nas seguintes opções:
    • Do not include module at app install (on-demand): cria um módulo disponível como um download sob demanda para todas as configurações do dispositivo com APIs de nível 21 ou posterior compatíveis com seu aplicativo.
    • Include module at install-time: cria um módulo que é incluído no seu aplicativo no momento da instalação.
    • Only include module at install-time for devices with specified features: cria um módulo que é incluído no seu aplicativo no momento da instalação apenas em dispositivos com determinadas configurações que você pode especificar, como características do dispositivo ou país.
  5. Para limitar o download automático do módulo para determinados países ou um nível mínimo de API, clique em Finish para concluir a criação do módulo e, em seguida, leia a seção sobre como especificar condições com base no país ou no nível mínimo de API.

    Caso contrário, clique em + device feature para adicionar um recurso necessário para o dispositivo fazer o download do módulo no momento da instalação.

  6. Ao lado de device-feature, selecione uma das seguintes opções no menu suspenso e especifique o valor:

    • Name: permite especificar um recurso de hardware ou software necessário para um dispositivo fazer o download do módulo no momento da instalação. Os recursos compatíveis com a entrega condicional são os mesmos listados como constantes FEATURE_* por PackageManager.

      Se você selecionar essa opção, comece a digitar qualquer parte do valor da constante do recurso, como "bluetooth", no campo ao lado da lista suspensa e selecione uma das sugestões exibidas.

    • OpenGL ES Version: permite que você especifique uma versão do OpenGL ES necessário para um dispositivo fazer o download do módulo no momento da instalação. Se você selecionar essa opção, comece a digitar a versão, como "0x00030001", no campo ao lado da lista suspensa e selecione uma das sugestões exibidas.

  7. Se você quer adicionar várias condições com base nos recursos disponíveis do dispositivo, clique em + device feature para cada condição de recurso do dispositivo que queira especificar.

  8. Ao terminar de configurar as opções de download de módulo, clique em Finish.

Depois que o Android Studio concluir a criação do seu módulo de recurso dinâmico, você poderá inspecionar o manifesto para ver a condição especificada no nó <dist:delivery>. Veja um exemplo abaixo.

<manifest ...>
      <dist:module ...>
        <dist:delivery>
          <dist:install-time>
            <dist:conditions>
              <!-- Requires that the device support AR to download the module at
              app install-time.  -->
              <dist:device-feature dist:name="android.hardware.camera.ar"/>
            </dist:conditions>
          </dist:install-time>
        </dist:delivery>
        ...
      </dist:module>
    </manifest>
    

Adicionar opções de entrega condicional a um módulo de recurso dinâmico existente

Você pode adicionar facilmente opções de entrega condicional a um módulo de recurso dinâmico existente por meio do manifesto do módulo. No entanto, leia primeiro sobre a compatibilidade das opções de entrega condicional com outras opções de entrega que você já tenha ativado.

Para começar, você precisa migrar seu manifesto para o novo elemento <dist:delivery>. O snippet de código abaixo mostra um exemplo da sintaxe antiga:

<dist:module
      dist:title="@string/title_dynamic_feature" dist:onDemand="true">
      <dist:fusing dist:include="true"/>
    </dist:module>
    

Agora, as opções de entrega acima são especificadas da seguinte forma.

<dist:module
      dist:title="@string/title_dynamic_feature">
      <dist:delivery>
          <dist:on-demand/>
      </dist:delivery>
      <dist:fusing dist:include="true"/>
    </dist:module>
    

Em seguida, inclua opções de entrega condicional com base nos recursos do dispositivo da seguinte maneira.

<dist:module
        dist:title="@string/title_dynamic_feature">
        <dist:delivery>
          <dist:on-demand/>
          <dist:install-time>
            <dist:conditions>
              <!-- Requires that the device support AR to download the module at
              app install-time.  -->
              <dist:device-feature dist:name="android.hardware.camera.ar"/>
            </dist:conditions>
          </dist:install-time>
        </dist:delivery>
        <dist:fusing dist:include="true"/>
    </dist:module>
    

As seções abaixo discutem outras opções para entrega condicional, como por país ou nível mínimo de API.

Compatibilidade com outras opções de download de módulo

Como os módulos de recursos dinâmicos oferecem várias opções para configurar como cada recurso é entregue ao dispositivo de um usuário, é importante entender como as opções de entrega condicional são afetadas por outras configurações. A tabela a seguir resume a compatibilidade da entrega condicional com outras opções de download de módulo.

Opção de download de módulo Compatibilidade com a entrega condicional
Fusing (<dist:fusing dist:include="true"/>) Se um módulo definir essa opção como true, o Google Play não respeitará as opções de entrega condicional especificadas ao implantar seu aplicativo em dispositivos que executam o nível de API 19 ou anterior. Ou seja, os módulos de recursos dinâmicos que ativam a fusão são sempre incluídos no momento da instalação para dispositivos com API de nível 19 ou anterior.
Instant-enabled (<dist:module dist:instant="true"/>) As opções de entrega condicional não são compatíveis com módulos de recursos dinâmicos compatíveis com instantâneos.
On demand (<dist:on-demand/>) Por padrão, se você especificar opções de entrega condicional, o módulo também estará disponível sob demanda.

Especificar condições com base no país

A entrega condicional também permite que você especifique quais países impedir (ou permitir) que façam o download do seu módulo no momento da instalação do aplicativo. Especificar essa condição pode ser útil se, por exemplo, seu módulo implementa uma forma de pagamento que não está disponível em determinadas regiões.

Nesse contexto, o país do dispositivo é normalmente determinado pelo endereço de faturamento do usuário registrado na conta do Google Play.

Para especificar os países para seu módulo, inclua o seguinte no manifesto do módulo de recurso dinâmico.

<dist:conditions>
       <!-- Specify "true" to specify countries to exclude from downloading
       this module at app install-time, or "false" to specify countries that should
       download the module. By default, this is set to “false”. -->
      <dist:user-countries dist:exclude="true">
        <!-- Specifies the two-letter  CLDR country code for regions that should
        not download the module at app install-time. -->
        <dist:country dist:code="CN"/>
        <dist:country dist:code="HK"/>
      </dist:user-countries>
    </dist:conditions>
    

Especificar condições para o nível mínimo de API

Especificar uma condição com base no nível de API de um dispositivo pode ser útil se você tiver módulos de recursos dinâmicos que dependam de APIs disponíveis apenas em algumas versões da plataforma Android.

Para definir uma condição com base em um nível mínimo de API do dispositivo, inclua o seguinte no manifesto do módulo de recurso dinâmico. Lembre-se de que o nível de API especificado como condição deve ser maior ou igual ao minSdkVersion do próprio módulo.

<dist:conditions>
        <!-- Specifies the minimum API level that the device must satisfy
              in order to download your module at app app install-time. -->
       <dist:min-sdk dist:value="24"/>
    </dist:conditions>
    

Apply Changes

Com o recurso "Apply Changes", você pode enviar alterações de código e recursos ao aplicativo em execução sem reiniciar o aplicativo e, em alguns casos, sem reiniciar a atividade atual. Esse recurso implementa uma abordagem completamente nova para preservar o estado do seu aplicativo. Ao contrário do "Instant Run", que reescreveu o bytecode do APK, o "Apply Changes" redefine classes em tempo real aproveitando a instrumentação no momento da execução compatível com Android 8.0 (API de nível 26) ou posterior.

Para usar o recurso "Apply Changes", faça o seguinte:

  • Se você quer fazer somente as alterações de código sem reiniciar a atividade atual, clique em Apply Code Changes Ícone de Apply Code Changes ou pressione Ctrl+Alt+F10 (ou Command+Shift+Ctrl+R no macOS).

    Em geral, Apply Code Changes precisa ser usado se você tiver modificado o código no corpo de um método sem modificar nenhum recurso. Caso você tenha modificado recursos, use a opção Apply Changes and Restart Activity.

  • Se você quer fazer alterações de recursos e código sem reiniciar o aplicativo, clique em Apply Changes and Restart Activity Ícone de Apply Changes ou pressione Ctrl+F10 (ou Command+Ctrl+R no macOS).

    Essa opção permite que você faça alterações em recursos e no código reiniciando a atividade atual sem reiniciar o aplicativo.

Ativar substituto de execução para "Apply Changes"

Quando as alterações que você fizer não puderem ser aplicadas sem reiniciar o aplicativo, o Android Studio solicitará que você execute Ícone de Run o app novamente. No entanto, se você não quiser ser avisado sempre que isso ocorrer, poderá configurar o Android Studio para executar o aplicativo automaticamente sempre que as alterações não puderem ser aplicadas.

Para ativar esse comportamento, siga as seguintes etapas:

  1. Abra a caixa de diálogo Settings ou Preferences.

    • No Windows ou no Linux, selecione File > Settings na barra de menus.
    • No macOS, selecione Android Studio > Preferences na barra de menus.
  2. Navegue até Build, Execution, Deployment > Deployment.

  3. Marque as caixas para ativar o substituto de execução automática para as ações de "Apply Changes".

  4. Clique em OK.

Limitações

O recurso "Apply Changes" tem as seguintes limitações:

  • A opção "Apply Changes" só é compatível com dispositivos que executam o Android 8.0 (API de nível 26) ou posterior.
  • Como acontece com o "Instant Run", algumas alterações de código não podem ser aplicadas até que o aplicativo seja reiniciado, incluindo as seguintes:
    • Incluir ou excluir uma classe, método ou campo
    • Alterar o manifesto
    • Alterar assinaturas de método
    • Alterar modificadores de métodos ou classes
    • Renomear classes
    • Alterar herança da classe
    • Adicionar ou remover um recurso
    • Alterar bibliotecas nativas (arquivos .so)
    • Alterar valores em Enums

Problemas conhecidos

O recurso "Apply Changes" tem os seguintes problemas conhecidos:

  • A velocidade do "Apply Changes" às vezes pode ser mais lenta que o "Instant Run". A prioridade inicial era a estabilidade, e continuaremos a melhorar o desempenho nos próximos meses.
  • Você poderá observar um comportamento inesperado se usar classloaders personalizados diferentes do contexto da linha de execução do sistema e do aplicativo.

IntelliJ IDEA 2019.1

O IDE principal do Android Studio foi atualizado com as melhorias do IntelliJ IDEA até a versão 2019.1, como personalização de temas.

Isso também inclui melhorias das seguintes atualizações de correção de erros:

Android Studio 3.6

Esta seção fornece um resumo dos novos recursos e mudanças no Android Studio 3.6.

Apply Changes

Agora você pode adicionar uma classe e implantar essa alteração de código no aplicativo em execução clicando em Apply Code Changes Ícone de Apply Code Changes ou Apply Changes and Restart Activity Ícone de Apply Changes.

Para saber mais sobre a diferença entre as duas ações, consulte Apply Changes.

Atualizações do NDK

As seguintes atualizações são compatíveis com o desenvolvimento nativo (C/C++) no Android Studio.

Compatibilidade com o Kotlin

Os seguintes recursos do NDK no Android Studio, anteriormente compatíveis com Java, agora também são compatíveis com Kotlin:

  • Navegue de uma declaração JNI para a função de implementação correspondente em C/C++. Para visualizar esse mapeamento, passe o cursor sobre o marcador de item C ou C++ próximo ao número da linha no arquivo de código-fonte gerenciado.
  • Crie automaticamente uma função de implementação de stub para uma declaração JNI. Defina a declaração JNI primeiro e, em seguida, digite “jni” ou o nome do método no arquivo C/C++ a ser ativado.

  • As funções de implementação nativa não utilizadas são destacadas como avisos no código-fonte. Declarações JNI com implementações ausentes também são destacadas como erros.

  • Quando você renomeia (refatora) uma função de implementação nativa, todas as declarações JNI correspondentes são atualizadas. Renomeie uma declaração JNI para atualizar a função de implementação nativa.

  • Verificação de assinatura para implementações de JNI vinculadas implicitamente.

Outras melhorias do JNI

  • Cosméticas

    • Dicas de tipo para os valores de parâmetro e retorno são mostradas nas funções de implementação do JNI.
    • Nomes de funções JNI errados podem ser dobrados.

  • Compatibilidade com RegisterNatives

    • Preenchimento automático do nome da declaração do método, de tipos de parâmetros e tipo de retorno.

    • Renomeia a refatoração do nome da declaração do método.

    • Verifica assinatura de funções JNI vinculadas.

  • Mais ajuda para função JNI

    • Compatibilidade com preenchimento automático, inspeção, navegação e renomeação de refatoração para literais de string em:
      • FindClass
      • GetMethodID e GetStaticMethodID
      • GetFieldID e GetStaticFieldID
    • Várias inspeções para os seguintes itens:
      • Call[Static]<type>Method
      • CallNonvirtual<type>Method
      • Get[Static]<type>Field
      • NewObject