Atualizações da API do Plug-in do Android para Gradle

Esta página monitora as descontinuações e remoções da API do Plug-in do Android para Gradle (AGP), além de fornecer informações sobre como atualizar seu código adequadamente.

Descontinuação de APIs e monitoramento de remoções

A tabela abaixo resume quando as APIs AGP são descontinuadas e removidas em relação à versão do AGP.

API Descontinuada na versão do AGP Removida da versão do AGP
Component.setAsmFramesComputationMode 7.2
Component.transformClassesWith 7.2
RenderScript 7.2
Transform 7.2 8.0

AGP 8.0

Veja a seguir atualizações importantes da API para a AGP 8.0.

A API Transform foi removida

A partir da AGP 8.0, a API Transform foi removida. Isso significa que todas as classes no pacote com.android.build.api.transform foram removidas.

A API Transform está sendo removida para melhorar o desempenho do build. Os projetos que usam a API Transform forçam a AGP a usar um fluxo menos otimizado para o build, podendo resultar em grandes regressões nos tempos de compilação. Também é difícil usar a API Transform e combiná-la com outros recursos do Gradle. O objetivo das APIs de substituição é facilitar a extensão do AGP sem introduzir problemas de precisão de performance ou de criação.

APIs de substituição

Não há uma substituição única para a API Transform. Em vez disso, há novas APIs voltadas para cada caso de uso. Todas as APIs de substituição estão no bloco androidComponents {}. Essas APIs estão disponíveis pela AGP 7.2.

Suporte à transformação de bytecode

Para transformar bytecode, use a API Instrumentation. No caso de bibliotecas, é possível registrar uma instrumentação apenas para classes de projetos locais. Para apps e testes, você pode escolher registrar uma instrumentação apenas para classes locais ou todas as classes, incluindo dependências locais e remotas. Para usar a API, a instrumentação é executada de maneira independente em cada classe, com acesso limitado a outras classes no caminho de classe (consulte createClassVisitor() para ver mais informações). Essa restrição melhora o desempenho de builds completos e incrementais, mantendo a superfície da API simples. Cada biblioteca é instrumentada em paralelo assim que fica pronta, e não depois que toda a compilação é concluída. Além disso, uma mudança em uma única classe significa que apenas as classes afetadas precisam ser reinstrumentadas em um build incremental. Para ver um exemplo de como usar a API Instrumentation, consulte o Como transformar classes com o ASM Roteiro do AGP.

Suporte à adição de classes geradas ao app

Para adicionar outras classes geradas ao app, use a API Artifacts com MultipleArtifact.ALL_CLASSES_DIRS. Especificamente, use

artifacts.use(TaskProvider)
  .wiredWith(...)
  .toAppend(Artifact.Multiple)

com MultipleArtifact.ALL_CLASSES_DIRS para anexar outros diretórios gerados às classes do projeto. A API Artifacts vai selecionar automaticamente um local exclusivo para a saída da tarefa personalizada. Consulte a Roteiro addToAllClasses para conferir um exemplo de como usar essa API.

Suporte a transformações com base na análise completa do programa

Para implementar transformações com base na análise completa do programa, todas as classes podem ser transformadas em uma única tarefa. Essa abordagem precisa ser usada com cuidado, já que tem um custo de performance de build muito maior do que o uso da API Instrumentation. Se o plug-in usar essa API, recomendamos que a transformação seja ativada por tipo de build para que os desenvolvedores de apps possam a desativar em builds de desenvolvimento.

Para registrar uma tarefa que transforma todas as classes ao mesmo tempo, o Plug-in do Android para Gradle 7.4 lançou a API Artifacts.forScope. Para transformar todas as classes do projeto atual, use Artifacts.forScope.PROJECT. Para transformar todas as classes no projeto atual, em projetos importados e em todas as dependências externas, use Artifacts.forScope.ALL. O código abaixo mostra como usar Artifacts.forScope.ALL para registrar uma tarefa que transforma todas as classes ao mesmo tempo:

variant.artifacts.forScope(ScopedArtifacts.Scope.ALL)
    .use(taskProvider)
    .toTransform(
        ScopedArtifact.CLASSES,
        ModifyClassesTask::allJars,
        ModifyClassesTask::allDirectories,
        ModifyClassesTask::output,
    )

Consulte a Roteiro modificarProjectClasses para obter um exemplo de como usar esta API, e a roteiro personalizávelAgpDsl para ver um exemplo de como registrar extensões personalizadas para os tipos de build do Android.

Se o caso de uso não for coberto por nenhuma das APIs AndroidComponents, informe um bug.

Vários plug-ins usados com frequência já migraram para essas novas APIs, incluindo o plug-in Monitoramento de desempenho do Firebase (1.4.1 é compatível com a AGP 8.0) e o plug-in Hilt Gradle (2.40.1 é compatível com a AGP 8.0). O AGP Upgrade Assistant também vai ajudar os desenvolvedores de projetos a fazer upgrade dos plug-ins mais usados, conforme necessário.

Se você estiver usando a API Transform com um plug-in de terceiros, informe ao autor que o plug-in vai precisar ser atualizado para funcionar com as novas APIs da AGP 8.0.

AGP 7.2

Veja a seguir atualizações importantes da API para a AGP 7.2.

O RenderScript foi descontinuado

A partir da versão 7.2 da AGP, as APIs do RenderScript foram descontinuadas. Elas ainda funcionam, mas vão invocar avisos e ser completamente removidas em versões futuras da AGP. Para saber como fazer a transição para o RenderScript, consulte Migrar do RenderScript.

Component.transformClassesWith e Component.setAsmFramesComputationMode foram descontinuados.

A partir do AGP 7.2, as APIs de instrumentação de bytecode da classe Component.transformClassesWith e Component.setAsmFramesComputationMode foram descontinuadas. Elas foram movidas para um novo bloco, Component.instrumentation, que contém todas as APIs relacionadas à configuração do processo de instrumentação. Para continuar usando esses recursos de instrumentação, use as APIs correspondentes no novo bloco, conforme mostrado no snippet de código a seguir:

androidComponents {
      onVariants(selector().all(), {
          instrumentation.transformClassesWith(AsmClassVisitorFactoryImpl.class,
                                               InstrumentationScope.Project) { params ->
              params.x = "value"
          }
          instrumentation.setAsmFramesComputationMode(
              COMPUTE_FRAMES_FOR_INSTRUMENTED_METHODS
          )
      })
  }