Aggiornamenti dell'API del plug-in Android per Gradle

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

Tracker ritiri e rimozioni dell'API

La seguente tabella riassume quando le API AGP vengono ritirate e rimosse in termini della versione AGP.

API Deprecato nella versione AGP Rimossa dalla versione AGP
Component.setAsmFramesComputationMode 7,2
Component.transformClassesWith 7,2
RenderScript 7,2
Trasforma 7,2 8.0

AGP 8.0

Di seguito sono riportati importanti aggiornamenti API per AGP 8.0.

L'API Transform è stata rimossa

A partire da AGP 8.0, Trasforma L'API viene rimossa. Ciò significa che tutte le classi nel pacchetto com.android.build.api.transform rimosso.

È in corso la rimozione dell'API Transform per migliorare le prestazioni della build. Progetti che l'API Transform consente di forzare l'AGP a usare un flusso meno ottimizzato per la build può causare grandi regressioni nei tempi di build. Inoltre, è difficile utilizzare l'API Transform e la sua combinazione con altre funzionalità Gradle; le API sostitutive puntare a semplificare l'estensione di AGP senza introdurre prestazioni o build problemi di correttezza.

API sostitutive

Non esiste una sola sostituzione per l'API Transform: ci sono nuovi target API 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 di bytecode

Per trasformare il bytecode, utilizza l'API Instrumentation. Per le biblioteche, puoi registrare una strumentazione solo per le classi di progetto locali; per app e test, puoi scegliere di registrare una strumentazione solo per le classi locali o per tutte di Google Cloud, incluse le dipendenze locali e remote. Per utilizzare questa API, è necessario la strumentazione viene eseguita in modo indipendente su ogni classe, con accesso limitato in classpath (vedi createClassVisitor() per ulteriori informazioni). Questa restrizione migliora le prestazioni sia di build complete che incrementali e semplifica l'aspetto dell'API. Ogni libreria viene instrumentato in parallelo non appena è pronto, anziché la compilazione è completata. Inoltre, una modifica in un singolo corso solo le classi interessate devono essere reinserite in modo incrementale creare. Per esempio di come utilizzare l'API Instrumentation, consulta Trasformazione delle classi con ASM Ricetta AGP.

Supporto per l'aggiunta di corsi generati alla tua app

Per aggiungere altri corsi generati all'app, utilizza il metodo Artefatti dell'API con MultipleArtifact.ALL_CLASSES_DIRS In particolare, usa

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

con MultipleArtifact.ALL_CLASSES_DIRS per aggiungere ulteriori alle classi del progetto. L'API Artifacts seleziona automaticamente una posizione univoca per l'attività personalizzata in cui eseguire l'output. Consulta le Ricetta addToAllCorsi per un esempio di come utilizzare questa API.

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

Per implementare trasformazioni basate sull'analisi dell'intero programma, tutte le classi possono essere trasformati insieme in una singola attività. Questo approccio deve essere utilizzato con cautela poiché ha un costo per le prestazioni di build molto più elevato rispetto all'uso della strumentazione tramite Google Cloud CLI o tramite l'API Compute Engine. Se il plug-in utilizza questa API, è consigliabile eseguire la trasformazione attivare la funzionalità per ogni tipo di build, in modo che lo sviluppatore dell'app possa disattivarla build di sviluppo.

Per registrare un'attività che trasforma tutte le classi insieme, è necessario il plug-in Android per Gradle 7.4 introduce Artifacts.forScope tramite Google Cloud CLI o tramite l'API Compute Engine. Per trasformare tutte le classi nel progetto attuale, usa Artifacts.forScope.PROJECT. Per trasformare tutte le classi nel progetto attuale, i progetti importati e tutte le dipendenze esterne utilizzano Artifacts.forScope.ALL. Il seguente codice mostra come utilizzare Artifacts.forScope.ALL per registrare un che trasforma tutte le classi insieme:

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

Consulta le formula modificaProjectCorsi per vedere un esempio di come utilizzare questa API Ricetta agpDsl di personalizzazione per un esempio di come registrare estensioni personalizzate nei tipi di build Android.

Se il tuo caso d'uso non è coperto da uno dei AndroidComponents API: segnala un bug.

Diversi plug-in di uso comune sono già stati migrati per utilizzare queste nuove API, incluso il plug-in Firebase Performance Monitoring (1.4.1 è compatibile con AGP 8.0) e il plug-in Hilt Gradle (2.40.1 è compatibile con AGP 8.0). L'AGP L'Assistente per l'upgrade aiuterà anche gli sviluppatori dei progetti a eseguire l'upgrade di uso comune i plug-in necessari.

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

AGP 7.2

Di seguito sono riportati importanti aggiornamenti API per AGP 7.2.

RenderScript è deprecato

A partire da AGP 7.2, le API RenderScript sono deprecate. Continuerà funzioni, ma richiamare avvisi e verrà rimossa completamente in futuro tutte le versioni di AGP. Per indicazioni su come passare da RenderScript, vedi Eseguire la migrazione da RenderScript.

Component.transformClassesWith e Component.setAsmFramesComputationMode sono deprecati

A partire da AGP 7.2, le API di strumentazione bytecode di classe Component.transformClassesWith e Le risorse Component.setAsmFramesComputationMode sono deprecate. Sono stati spostati in un nuovo blocco, Component.instrumentation, che contiene tutte le API relative alla configurazione del processo di strumentazione. A continuano a utilizzare queste funzionalità di strumentazione, usa le API corrispondenti il 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
          )
      })
  }