Aggiornamenti dell'API del plug-in Android per Gradle

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

Tracker dei ritiri e delle rimozioni delle API

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

API È stata ritirata nella versione AGP Rimosso dalla versione AGP
Component.setAsmFramesComputationMode 7.2
Component.transformClassesWith 7.2
RenderScript 7.2
Trasforma 7.2 8.0

AGP 8.8

Di seguito sono riportati aggiornamenti importanti delle API per AGP 8.8.

Le configurazioni delle risorse sono state ritirate

Le configurazioni delle risorse sono state deprecate a partire da AGP 8.8. Questo è stato fatto perché AGP non supporta più densità di risorse diverse e Google Play Console ora richiede che le app vengano pubblicate come app bundle. Per la configurazione della lingua, puoi specificare le lingue supportate dalla tua app utilizzando il DSL localeFilters per mappare le configurazioni delle lingue alle risorse corrispondenti.

AGP 8.0

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

L'API Transform viene rimossa

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

L'API Transform verrà rimossa per migliorare le prestazioni di compilazione. I progetti che utilizzano l'API Transform forzano AGP a utilizzare un flusso meno ottimizzato per la compilazione che può comportare notevoli regressioni nei tempi di compilazione. È inoltre difficile utilizzare l'API Transform e combinarla con altre funzionalità di Gradle. Lo scopo delle API di sostituzione è semplificare l'estensione di AGP senza introdurre problemi di prestazioni o correttezza della compilazione.

API sostitutive

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

Supporto per la trasformazione del bytecode

Per trasformare il bytecode, utilizza l'API Instrumentation. Per le librerie, puoi registrare un'instrumentazione solo per i classi di progetto locali; per le app e i test, puoi scegliere di registrare un'instrumentazione solo per i classi locali o per tutti i classi, incluse le dipendenze locali e remote. Per utilizzare questa API, l'instrumentazione viene eseguita in modo indipendente su ogni classe, con accesso limitato ad altre classi nel percorso di classe (per ulteriori informazioni, consulta createClassVisitor()). Questa limitazione migliora le prestazioni sia delle build complete che di quelle incrementali e mantiene semplice l'interfaccia API. Ogni libreria viene instrumentata in parallelo non appena è pronta, anziché dopo il completamento della compilazione. Inoltre, una modifica in un singolo corso significa che solo i corsi interessati devono essere sottoposti nuovamente a strumenti in una compilazione incrementale. Per un esempio di come utilizzare l'API Instrumentation, consulta la ricetta 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. Nello specifico, utilizza

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

con MultipleArtifact.ALL_CLASSES_DIRS per aggiungere altre directory generate ai corsi del progetto. L'API Artifacts seleziona automaticamente una posizione univoca per l'output dell'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 le trasformazioni in base all'analisi dell'intero programma, tutte le classi possono essere trasformate insieme in un'unica attività. Questo approccio deve essere utilizzato con cautela poiché ha un costo molto più elevato per le prestazioni di compilazione rispetto all'utilizzo dell'API Instrumentation. Se il tuo plug-in utilizza questa API, ti consigliamo di attivare la trasformazione per tipo di build, in modo che lo sviluppatore dell'app possa disattivarla per le build di sviluppo.

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

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

Consulta la ricetta modifyProjectClasses per un esempio di come utilizzare questa API e la ricetta customizeAgpDsl per un esempio di come registrare estensioni personalizzate ai tipi di build Android.

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

Diversi plug-in di uso comune sono già stati migrati 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 Gradle Hilt (2.40.1 è compatibile con AGP 8.0). L'Assistente all'upgrade di AGP aiuterà anche 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 aggiornamenti importanti delle API per AGP 7.2.

RenderScript è deprecato

A partire da AGP 7.2, le API RenderScript sono ritirate. Continueranno a funzionare, ma attiveranno avvisi e verranno completamente rimossi nelle versioni future di AGP. Per indicazioni su come eseguire la transizione da RenderScript, consulta la pagina Eseguire la migrazione da RenderScript.

Component.transformClassesWith e Component.setAsmFramesComputationMode sono deprecati

A partire da AGP 7.2, le API di ispezione del bytecode delle classi Component.transformClassesWith e Component.setAsmFramesComputationMode sono ritirate. Sono state spostate in un nuovo blocco, Component.instrumentation, che contiene tutte le API relative alla configurazione del processo di misurazione. Per continuare a utilizzare queste funzionalità di misurazione, 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
          )
      })
  }