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
)
})
}