Questa pagina monitora il ritiro e la rimozione delle API del plug-in Android per Gradle (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 | Deprecata 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.12
Il plug-in Android per Gradle 8.12.0 contiene le seguenti modifiche importanti all'API.
Modifica del comportamento: l'opzione includeAndroidResources unisce il manifest dalla directory di test
Ora puoi creare un file AndroidManifest.xml nella directory di origine dei test per personalizzare il manifest per gli unit test con l'opzione android.testOptions.unitTests.includeAndroidResources. Il file manifest di test verrà unito al file manifest principale dell'app. Problema n. 127986458
AGP 8.10
Il plug-in Android per Gradle 8.10.0 contiene le seguenti modifiche importanti all'API.
Modifica che provoca un errore a livello di origine: finalizeDsl ora richiede l'utilizzo di tipi con parametri
Per consentire l'utilizzo di AndroidComponentsExtension direttamente con il plug-in com.android.kotlin.multiplatform.library, il tipo associato a finalizeDsl è stato reso meno restrittivo.
Ad esempio, se utilizzavi i tipi non elaborati di AndroidComponentsExtension per indirizzare applicazioni e librerie:
extensions.getByType(AndroidComponentsExtension::class).finalizeDsl { androidExtension ->
androidExtension.experimentalProperties["android.example"] = true
}
Prima o durante l'upgrade, dovrai adattare il codice sorgente in modo che sia simile al seguente:
extensions.getByType<AndroidComponentsExtension<CommonExtension<*, *, *, *, *, *>, *, *>>().finalizeDsl { androidExtension ->
androidExtension.experimentalProperties["android.example"] = true
}
Tieni presente che se vuoi scrivere codice finalizeDsl che funzioni sia con i plug-in com.android.library e com.android.application attuali sia con il nuovo plug-in com.android.kotlin.multiplatform.library, potresti dover controllare i tipi in fase di runtime:
extensions.getByType<AndroidComponentsExtension<*, *, *>>().finalizeDsl { androidExtension ->
when(androidExtension) {
is CommonExtension<*, *, *, *, *, *> -> androidExtension.experimentalProperties["android.example"] = true
is KotlinMultiplatformAndroidLibraryExtension -> androidExtension.experimentalProperties["android.example"] = true
}
}
Si tratta di una modifica che provoca un errore solo a livello di codice sorgente e non influirà sui plug-in binari.
AGP 8.8
Di seguito sono riportati importanti aggiornamenti dell'API per AGP 8.8.
Le configurazioni delle risorse sono state ritirate
Le configurazioni delle risorse sono state ritirate a partire da AGP 8.8. Questo è stato fatto perché AGP non supporta più densità di risorse diverse e Google Play Console ora richiede la pubblicazione delle app come app bundle. Per la configurazione della lingua, puoi specificare le impostazioni internazionali supportate dalla tua app utilizzando il DSL localeFilters per mappare le configurazioni delle impostazioni internazionali alle risorse corrispondenti.
AGP 8.0
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 è stata 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 costringono AGP a utilizzare un flusso meno ottimizzato per la build, il 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 della build.
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 sostitutive 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 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 ad altre classi nel classpath (per ulteriori informazioni, consulta createClassVisitor()).
Questa limitazione migliora le prestazioni delle build complete e incrementali e mantiene snella la superficie dell'API. Ogni libreria viene instrumentata in parallelo non appena è pronta, anziché dopo il completamento di tutta la compilazione. Inoltre, una modifica in una singola classe significa che solo le classi interessate devono essere reinstrumentate in una build 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. In particolare, utilizza
artifacts.use(TaskProvider)
.wiredWith(...)
.toAppend(Artifact.Multiple)
con MultipleArtifact.ALL_CLASSES_DIRS per aggiungere altre directory generate alle classi del progetto. L'API Artifacts selezionerà automaticamente una località univoca in cui l'attività personalizzata potrà generare l'output. 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 basate sull'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 di prestazioni di build molto più elevato 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 di app possa disattivarla per le build di sviluppo.
Per registrare un'attività che trasforma tutte le classi insieme, il plug-in Android per Gradle 7.4 introduce l'API Artifacts.forScope. Per trasformare tutte le classi nel progetto corrente, utilizza Artifacts.forScope.PROJECT. Per trasformare tutte le classi nel progetto corrente, nei progetti importati e in 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 insieme:
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 per i tipi di build Android.
Se il tuo caso d'uso non è coperto da nessuna delle API AndroidComponents, puoi segnalare 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 (la versione 1.4.1 è compatibile con AGP 8.0) e il plug-in Hilt Gradle (la versione 2.40.1 è compatibile con AGP 8.0). L'assistente per l'upgrade di 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, puoi informare 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 delle API per AGP 7.2.
RenderScript è deprecato
A partire da AGP 7.2, le API RenderScript sono deprecate. Continueranno a funzionare, ma genereranno avvisi e verranno rimosse completamente nelle versioni future di AGP. Per indicazioni su come eseguire la transizione da RenderScript, consulta Esegui la migrazione da RenderScript.
Component.transformClassesWith e Component.setAsmFramesComputationMode sono deprecati
A partire da AGP 7.2, le API di strumentazione del bytecode delle classi Component.transformClassesWith e Component.setAsmFramesComputationMode sono deprecate. Sono state spostate 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 nello snippet di codice seguente:
androidComponents {
onVariants(selector().all(), {
instrumentation.transformClassesWith(AsmClassVisitorFactoryImpl.class,
InstrumentationScope.Project) { params ->
params.x = "value"
}
instrumentation.setAsmFramesComputationMode(
COMPUTE_FRAMES_FOR_INSTRUMENTED_METHODS
)
})
}