Aggiornamenti dell'API del plug-in Android per Gradle

Questa pagina monitora il ritiro e le rimozioni dell'API per il plug-in Android Gradle (AGP) e fornisce informazioni su come aggiornare il codice di conseguenza.

Tracker delle rimozioni e dei ritiri di API

La seguente tabella riassume quando le API AGP vengono deprecate e rimosse, in termini di versione di AGP.

API Deprecata nella versione AGP Rimosso dalla versione AGP
Component.setAsmFramesComputationMode 7,2
Component.transformClassesWith 7,2
RenderScript 7,2
Trasformazione 7,2 con Android 8.0

8.0 AGP

Di seguito sono riportati importanti aggiornamenti dell'API per AGP 8.0.

L'API Transform è stata rimossa

A partire da AGP 8.0, l'API Transform viene rimossa. Ciò significa che tutte le classi nel pacchetto com.android.build.api.transform vengono rimosse.

L'API Transform verrà rimossa per migliorare le prestazioni della build. I progetti che utilizzano l'API Transform obbligano AGP a utilizzare un flusso meno ottimizzato per la build, che può comportare grandi regressioni nei tempi di build. Inoltre, è difficile utilizzare l'API Transform e combinarla con altre funzionalità di Gradle; le API sostitutive mirano a semplificare l'estensione di AGP senza introdurre problemi di prestazioni o di correttezza.

API sostitutive

Non esiste un'unica sostituzione per l'API Transform: esistono nuove API mirate per ogni caso d'uso. Tutte le API sostitutive si trovano nel blocco androidComponents {}. Queste API sono tutte disponibili tramite AGP 7.2.

Supporto per la trasformazione del bytecode

Per trasformare il bytecode, utilizza l'API strumentazione. Per le librerie, puoi registrare una strumentazione solo per le classi di progetto locali; per le app e i test, puoi scegliere di registrare una strumentazione solo per le classi locali o per tutte le classi, incluse le dipendenze locali e remote. Per utilizzare questa API, la strumentazione viene eseguita in modo indipendente su ogni classe, con accesso limitato alle altre classi nel percorso della classe (vedi createClassVisitor() per ulteriori informazioni). Questa limitazione migliora le prestazioni delle build sia complete che incrementali e semplifica la visualizzazione della piattaforma API. Ogni libreria viene strumentata in parallelo non appena è pronta, anziché dopo il completamento della compilazione. Inoltre, la modifica di una singola classe significa che solo le classi interessate devono essere reinstrumentate in una build incrementale. Ad esempio su come utilizzare l'API strumentazione, consulta la formula della formula AGP Trasformazione delle classi con ASM.

Supporto per l'aggiunta di classi generate alla tua app

Per aggiungere altre classi generate all'app, utilizza l'API Artifacts con MultipleArtifact.ALL_CLASSES_DIRS. In particolare, utilizza

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

con MultipleArtifact.ALL_CLASSES_DIRS per aggiungere altre directory generate alle classi di progetto. L'API Artifacts seleziona automaticamente una posizione unica in cui inviare l'attività personalizzata. Consulta la ricetta addToAllClasses per un esempio di come utilizzare questa API.

Supporto per le trasformazioni basate sull'analisi dell'intero programma

Per implementare trasformazioni basate sull'analisi dell'intero programma, tutte le classi possono essere trasformate insieme in una singola attività. Questo approccio deve essere utilizzato con cautela in quanto ha un costo per le prestazioni di build molto più elevato rispetto all'utilizzo dell'API strumentazione. Se il plug-in utilizza questa API, è consigliabile attivare la trasformazione per tipo di build, in modo che lo sviluppatore dell'app possa disabilitarla per le build di sviluppo.

Per registrare un'attività che trasforma tutte le classi, il plug-in Android Gradle 7.4 introduce l'API Artifacts.forScope. Per trasformare tutte le classi nel progetto attuale, utilizza Artifacts.forScope.PROJECT. Per trasformare tutte le classi nel progetto attuale, i progetti importati e tutte le dipendenze esterne, utilizza Artifacts.forScope.ALL. Il codice seguente mostra come utilizzare Artifacts.forScope.ALL per registrare un'attività che trasforma tutte le classi:

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

Consulta la ricetta modifyProjectClasses per un esempio sull'utilizzo di questa API e la ricetta "customizeAgpDsl" per un esempio di come registrare estensioni personalizzate per i tipi di build Android.

Se il tuo caso d'uso non è coperto da nessuna delle API AndroidComponenti, segnala un bug.

È già stata eseguita la migrazione di diversi plug-in di uso comune per utilizzare queste nuove API, tra cui il plug-in di monitoraggio delle prestazioni di Firebase (1.4.1 è compatibile con AGP 8.0) e il plug-in Hilt Gradle (2.40.1 è compatibile con AGP 8.0). L'Assistente per l'upgrade del programma AGP aiuterà inoltre gli sviluppatori di progetti a eseguire l'upgrade dei plug-in di uso comune, se necessario.

Se utilizzi l'API Transform tramite un plug-in di terze parti, informa l'autore che il plug-in dovrà essere aggiornato per funzionare con le nuove API per AGP 8.0.

AGP 7.2

Di seguito sono riportati importanti aggiornamenti dell'API per AGP 7.2.

RenderScript è deprecato

A partire da AGP 7.2, le API RenderScript sono deprecate. Continueranno a funzionare, ma richiamano gli avvisi e verranno completamente rimossi nelle versioni future di AGP. Per indicazioni su come eseguire la transizione da RenderScript, consulta Migrazione da RenderScript.

Component.transformClassesWith e Component.setAsmFramesComputationMode sono deprecati

A partire da AGP 7.2, le API di strumentazione bytecode delle classi Component.transformClassesWith e Component.setAsmFramesComputationMode sono deprecate. È stato spostato in un nuovo blocco, Component.instrumentation, che contiene tutte le API relative alla configurazione del processo di strumentazione. Per continuare a utilizzare queste funzionalità di strumentazione, utilizza le API corrispondenti nel nuovo blocco, come mostrato dal seguente snippet di codice:

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