Plug-in do Android para Gradle 3.6.0 (fevereiro de 2020)

Esta versão do plug-in do Android requer o seguinte:

Novos recursos

Esta versão do Plug-in do Android para Gradle inclui os novos recursos a seguir.

Vinculação de visualizações

A vinculação de visualizações fornece segurança durante a compilação quando há referências a visualizações no código. Agora você pode substituir findViewById() pela referência de classe de vinculação gerada automaticamente. Para começar a usar a vinculação de visualizações, inclua o seguinte no arquivo build.gradle de cada módulo:

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

Para saber mais, leia a documentação de Vinculação de visualizações.

Suporte ao plug-in Maven Publish

O Plug-in do Android para Gradle inclui suporte para o plug-in Maven Publish para Gradle, que permite publicar artefatos de build em um repositório Apache Maven. O Plug-in do Android para Gradle cria um componente para cada artefato de variante de build no módulo do app ou da biblioteca que você pode usar para personalizar uma publicação para um repositório Maven.

Para saber mais, acesse a página sobre como usar o plug-in Maven Publish.

Nova ferramenta de empacotamento padrão

Ao criar a versão de depuração do app, o plug-in usa uma nova ferramenta de empacotamento, chamada zipflinger, para criar o APK. Essa nova ferramenta vai trazer melhorias de velocidade de build. Se a nova ferramenta de empacotamento não funcionar como esperado, informe um bug. Você pode voltar a usar a ferramenta de empacotamento antiga incluindo o seguinte no arquivo gradle.properties:

        android.useNewApkCreator=false
      

Atribuição do build nativo

Agora é possível determinar o tempo que o Clang leva para criar e vincular cada arquivo C/C ++ no seu projeto. O Gradle pode gerar um trace do Chrome que contém carimbos de data/hora para esses eventos do compilador para que você possa analisar o tempo necessário para criar seu projeto. Para gerar esse arquivo de atribuição de build, faça o seguinte:

  1. Adicione a flag -Pandroid.enableProfileJson=true ao gerar um build do Gradle. Por exemplo:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Abra o navegador Chrome e digite chrome://tracing na barra de pesquisa.

  3. Clique no botão Load e navegue até <var>project-root</var>/build/android-profile para encontrar o arquivo. O nome do arquivo é profile-<var>timestamp</var>.json.gz.

Você pode conferir os dados de atribuição do build nativo perto da parte de cima do visualizador:

Traço de atribuição do build nativo no Chrome

Mudanças de comportamento

Ao usar esta versão do plug-in, você pode encontrar as seguintes mudanças no comportamento.

Bibliotecas nativas empacotadas descompactadas por padrão

Quando você cria seu app, o plug-in agora define extractNativeLibs como "false" por padrão. Ou seja, suas bibliotecas nativas são alinhadas na página e empacotadas sem compactação. Apesar de isso gerar um tamanho do upload maior, seus usuários se beneficiam pelos seguintes motivos:

  • O tamanho de instalação do app é menor porque a plataforma pode acessar as bibliotecas nativas diretamente do APK instalado, sem criar uma cópia das bibliotecas.
  • O tamanho de download é menor, porque a compactação da Play Store geralmente é melhor quando você inclui bibliotecas nativas não compactadas no seu APK ou Android App Bundle.

Se, em vez disso, você quiser que o Plug-in do Android para Gradle empacote bibliotecas nativas compactadas, inclua o seguinte no manifesto do app:

        <application
          android:extractNativeLibs="true"
          ... >
        </application>
        
      

Observação: o atributo de manifesto extractNativeLibs foi substituído pela opção DSL useLegacyPackaging. Para saber mais, consulte a nota da versão Usar a DSL para empacotar bibliotecas nativas compactadas.

Versão padrão do NDK

Se você fizer o download de várias versões do NDK, o Plug-in do Android para Gradle agora vai selecionar uma versão padrão para compilar seus arquivos de código-fonte. Antes, o plug-in selecionava a versão mais recente do NDK transferida por download. Use a propriedade android.ndkVersion no arquivo build.gradle do módulo para substituir o padrão selecionado pelo plug-in.

Geração de classe R simplificada

O Plug-in do Android para Gradle simplifica o caminho de classe de compilação gerando apenas uma classe R para cada módulo de biblioteca no projeto e compartilhando essas classes R com outras dependências do módulo. Essa otimização proporciona builds mais rápidos, mas exige que você tenha em mente o seguinte:

  • Como o compilador compartilha classes R com dependências de módulo upstream, é importante que cada módulo do projeto use um nome de pacote exclusivo.
  • A visibilidade da classe R de uma biblioteca para outras dependências do projeto é determinada pela configuração usada para incluir a biblioteca como dependência. Por exemplo, se a Biblioteca A incluir a Biblioteca B como uma dependência "API", a Biblioteca A e outras bibliotecas que dependem dela vão ter acesso à classe R da Biblioteca B. No entanto, outras bibliotecas podem não ter acesso à classe R da Biblioteca B. Se a Biblioteca A usar a configuração de dependência implementation. Para saber mais, leia sobre as configurações de dependência.

Remover recursos ausentes da configuração padrão

Para módulos de Biblioteca, se você adicionar um recurso a um idioma que não incluiu no conjunto padrão de recursos (por exemplo, se você incluir hello_world como um recurso de string em /values-es/strings.xml, mas não definir esse recurso em /values/strings.xml), o Plug-in do Android para Gradle não vai incluir mais esse recurso ao compilar seu projeto. Essa mudança de comportamento resulta em menos exceções de tempo de execução Resource Not Found e maior velocidade de build.

O D8 agora respeita a política de retenção de classe para anotações

Ao compilar seu app, o D8 agora respeita quando as anotações aplicam uma política de retenção CLASS, e essas anotações não estão mais disponíveis no ambiente de execução. Esse comportamento também existe ao definir o SDK de destino do app para a API de nível 23, que anteriormente permitia acessar essas anotações durante a execução ao compilar o app usando versões mais antigas do Plug-in do Android para Gradle e do D8.

Outras mudanças de comportamento

  • aaptOptions.noCompress não diferencia mais maiúsculas de minúsculas em todas as plataformas (para APK e pacotes) e respeita caminhos que usam caracteres maiúsculos.
  • A vinculação de dados agora é incremental por padrão. Para saber mais, consulte o problema 110061530.

  • Todos os testes de unidade, incluindo Roboeletric, agora podem ser totalmente armazenados em cache. Para saber mais, consulte o problema 115873047.

Correções de bugs

Esta versão do Plug-in do Android para Gradle inclui as seguintes correções de bugs:

  • Agora, os testes de unidade Roboletric têm suporte de módulos de biblioteca que usam vinculação de dados. Para saber mais, consulte o problema 126775542.
  • Agora é possível executar tarefas connectedAndroidTest em vários módulos enquanto o modo de execução paralela do Gradle está ativado.

Problemas conhecidos

Esta seção descreve problemas conhecidos que existem no Plug-in do Android para Gradle 3.6.0.

Desempenho lento da tarefa Android Lint

O Android Lint pode levar muito mais tempo para ser concluído em alguns projetos devido a uma regressão na infraestrutura de análise, o que resulta em um cálculo mais lento de tipos de inferência para lambdas em determinadas construções de códigos.

O problema é relatado como um bug no IDEA e será corrigido no Plug-in do Android para Gradle 4.0.

Falta a classe do manifesto {:#agp-missing-manifest}

Se o app define permissões personalizadas no manifesto, o Plug-in do Android para Gradle normalmente gera uma classe Manifest.java que inclui suas permissões personalizadas como constantes de string. O plug-in empacota essa classe com seu app para que você possa referenciar essas permissões com mais facilidade no tempo de execução.

A geração da classe de manifesto está corrompida no Plug-in do Android para Gradle 3.6.0. Se você criar seu app com essa versão do plug-in e fizer referência à classe de manifesto, talvez ocorra uma exceção ClassNotFoundException. Para resolver esse problema, execute uma destas ações:

  • Refira-se às suas permissões personalizadas pelo nome totalmente qualificado. Por exemplo: "com.example.myapp.permission.DEADLY_ACTIVITY".

  • Defina suas próprias constantes, conforme mostrado abaixo:

                public final class CustomPermissions {
                  public static final class permission {
                    public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY";
                  }
                }