compileSdkVersion: basi, nuove API e configurazione in Gradle

Autore: IT Sectr Pubblicato: 2026-02-08 Tempo di lettura: 11 min

compileSdkVersion — la versione dell'Android SDK utilizzata durante la compilazione dell'applicazione. Questo parametro è specificato in build.gradle e determina quali API sono disponibili per lo sviluppatore al momento della compilazione: classi, metodi, costanti e interfacce di un determinato livello API. A differenza di targetSdkVersion, compileSdkVersion non influisce sul comportamento in fase di esecuzione — i cambiamenti comportamentali di Android non dipendono da questo parametro. Secondo Android Developers, compileSdk deve essere almeno uguale a targetSdk, e idealmente dovrebbe corrispondere all'ultimo livello API stabile.

Punti chiave

  • compileSdkVersion — la versione SDK per la compilazione, fornisce accesso alle API del livello specificato
  • Non influisce sul comportamento runtime — i cambiamenti comportamentali sono controllati da targetSdkVersion, non da compileSdk
  • compileSdk deve essere >= targetSdk, si consiglia di mantenerlo all'ultimo livello API stabile
  • L'aggiornamento di compileSdk richiede la verifica delle API deprecate e della compatibilità delle dipendenze
  • Android SDK include piattaforme per ogni livello API — scaricate tramite SDK Manager

Cos'è compileSdkVersion in Android?

compileSdkVersion è un parametro intero in build.gradle che specifica contro quale versione dell'Android SDK compilare il codice. Quando scrivi codice usando classi da android.* o androidx.*, il compilatore le confronta con le API disponibili nella versione compileSdk specificata. Se un metodo è stato introdotto nell'API 36 e compileSdk = 35, il codice non verrà compilato. Se compileSdk = 36, il codice verrà compilato, ma chiamare quel metodo su un dispositivo con API 35 senza un controllo causerà un arresto anomalo.

compileSdkVersion viene caricato dalla piattaforma Android SDK installata tramite SDK Manager in Android Studio. Ogni livello API ha la propria piattaforma: android-21, android-29, android-34, android-35, android-36. La piattaforma contiene android.jar — un insieme di classi, metodi e costanti che il compilatore Kotlin/Java utilizza. Se la piattaforma non è installata, Gradle la scaricherà automaticamente tramite sdkmanager al primo build.

AGP (Android Gradle Plugin) versione 8.7+ raccomanda di specificare compileSdk come intero tramite compileSdk = 36 in Kotlin DSL, senza il prefisso android-. compileSdk può anche essere impostato tramite compileSdkVersion 36 in Groovy DSL o compileSdkPreview per versioni di anteprima dell'SDK (developer previews). compileSdkPreview viene utilizzato per testare i livelli API imminenti prima del rilascio ufficiale.

kotlin
// build.gradle.kts — configurazione di compileSdkVersion
android {
    namespace = "com.example.myapp"

    // compileSdk = 36 — ultimo livello API stabile (Android 16)
    compileSdk = 36

    defaultConfig {
        applicationId = "com.example.myapp"
        minSdk = 26
        targetSdk = 36
        versionCode = 1
        versionName = "1.0.0"
    }
}

// Alternativamente: compileSdkPreview per versioni di anteprima
// compileSdkPreview = "Baklava"

Nell'esempio, compileSdk = 36 fornisce accesso a tutte le API di Android 16 (Baklava). La piattaforma Android SDK 36 deve essere installata in SDK Manager. compileSdkPreview con il nome "Baklava" può essere utilizzato per testare API instabili prima del rilascio ufficiale della piattaforma. Dopo il rilascio, l'anteprima viene sostituita con compileSdk = 36 stabile.

compileSdkVersion vs targetSdkVersion vs minSdkVersion

Tre parametri di livello API in build.gradle — compileSdkVersion, targetSdkVersion e minSdkVersion — sono spesso confusi. Ognuno è responsabile di un diverso aspetto della compatibilità e i loro valori devono seguire la regola compileSdk >= targetSdk >= minSdk. minSdk è il limite inferiore: i dispositivi al di sotto non vedranno l'app. targetSdk è il punto di test: i cambiamenti comportamentali sono abilitati fino a questo livello. compileSdk è il soffitto: le API al di sopra di questo livello non sono disponibili per il compilatore.

Regola pratica chiave: compileSdk può essere aumentato senza alcun test sui dispositivi. Questa è un'operazione sicura che fornisce semplicemente al compilatore una nuova versione di android.jar. L'unico rischio sono le API deprecate che potrebbero essere rimosse nella nuova versione della piattaforma, ma questo viene rilevato in fase di compilazione e facilmente risolto. Aumentare targetSdk, d'altra parte, richiede un ciclo QA completo.

ParametroAmbitoInfluisce sul runtimeRichiede test
compileSdkVersionCompilazioneNoNo (solo controllo deprecati)
targetSdkVersionRuntimeSì — cambiamenti comportamentaliSì — ciclo QA completo
minSdkVersionInstallazioneNoNo (ma influisce sulla copertura)

Perché compileSdk può essere superiore a targetSdk? Immagina che Android 16 (API 36) sia stato rilasciato con nuove API che vuoi utilizzare nel codice, ma non hai ancora testato i cambiamenti comportamentali dell'API 36. Imposti compileSdk = 36 (nuove API disponibili), targetSdk = 35 (cambiamenti comportamentali dell'API 36 disabilitati). Il codice verrà compilato, utilizzerà nuovi metodi sotto controlli SDK_INT e i cambiamenti comportamentali dell'API 36 non romperanno l'app perché targetSdk = 35.

Esempi di combinazioni corrette

compileSdk = 36, targetSdk = 36, minSdk = 26 — compatibilità completa con le ultime API e cambiamenti comportamentali, copertura dell'85% dei dispositivi. compileSdk = 36, targetSdk = 34, minSdk = 26 — nuove API disponibili, cambiamenti comportamentali solo fino all'API 34. compileSdk = 35, targetSdk = 36 — non corretto: compileSdk è inferiore a targetSdk, l'API 36 non è disponibile mentre i cambiamenti comportamentali della 36 sono attivi.

Come aggiornare compileSdkVersion: guida passo passo

Aggiornare compileSdkVersion è una delle operazioni più semplici e sicure in un progetto Android. A differenza di targetSdk, non richiede test approfonditi dei cambiamenti comportamentali. Tuttavia, ci sono alcuni passaggi da seguire per evitare errori di compilazione e avvisi di deprecazione.

Passo 1 — installa la nuova piattaforma tramite SDK Manager in Android Studio: Tools → SDK Manager → SDK Platforms → seleziona il nuovo livello API. Se non installi la piattaforma, Gradle proverà a scaricarla automaticamente, ma ciò potrebbe rallentare il primo build. Passo 2 — modifica compileSdk in build.gradle con il nuovo valore. Passo 3 — esegui il build (Build → Make Project) e correggi eventuali errori di compilazione.

Passo 4 — verifica le API deprecate. Dopo aver aggiornato compileSdk, alcuni metodi potrebbero essere contrassegnati come @Deprecated con la nota "removed in API X". Android Studio li evidenzia con barratura e mostra un avviso. Sostituisci le chiamate deprecate con nuove alternative. Se l'alternativa richiede un livello API superiore a minSdk, aggiungi un controllo in fase di esecuzione. Passo 5 — verifica le dipendenze: alcune librerie potrebbero richiedere una versione specifica di compileSdk. AGP 8.7+ raccomanda compileSdk = 36.

kotlin
// Dopo l'aggiornamento di compileSdk: sostituzione API deprecate
import android.os.Build
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES
import android.os.Process
import android.app.ActivityManager

class CompileSdkMigration {

    // PRIMA: metodo deprecato (può essere rimosso nella nuova API)
    @Suppress("DEPRECATION")
    fun getMemoryClassOld(context: android.content.Context): Int {
        val am = context.getSystemService(
            android.content.Context.ACTIVITY_SERVICE
        ) as ActivityManager
        return am.memoryClass  // Può essere deprecato in API 36
    }

    // DOPO: nuova alternativa (se disponibile)
    fun getMemoryClassNew(context: android.content.Context): Int {
        if (VERSION.SDK_INT >= VERSION_CODES.BAKLAVA) {
            // Nuova API da compileSdk 36
            val am = context.getSystemService(
                android.content.Context.ACTIVITY_SERVICE
            ) as ActivityManager
            return am.getMemoryClassSafe()  // Esempio di nuova API
        }
        @Suppress("DEPRECATION")
        return context.getSystemService(
            android.content.Context.ACTIVITY_SERVICE
        ) as ActivityManager
            .memoryClass
    }
}

La classe CompileSdkMigration mostra il pattern di migrazione corretto. Il vecchio metodo memoryClass potrebbe essere rimosso nella nuova API — il compilatore genererà un errore. La nuova alternativa getMemoryClassSafe è disponibile solo su API 36+, quindi viene chiamata sotto un controllo SDK_INT >= BAKLAVA. Per i dispositivi vecchi, viene utilizzato un fallback con @Suppress("DEPRECATION").

Lavorare con nuove API: controlli condizionali e fallback

Le nuove API rese disponibili dall'aggiornamento di compileSdkVersion non possono essere chiamate direttamente se minSdkVersion è inferiore a quel livello API. Senza un controllo in fase di esecuzione, l'app si arresta in modo anomalo con AbstractMethodError, NoSuchMethodError o VerifyError su dispositivi vecchi. Il meccanismo di protezione principale è controllare Build.VERSION.SDK_INT, chiamare la nuova API solo quando il livello API è sufficiente e fornire un fallback per le versioni vecchie.

AndroidX fornisce backport per molte nuove API, consentendo l'uso di metodi moderni anche con un compileSdk basso. Ad esempio, l'API Activity Result da androidx.activity:activity-ktx:1.9.3 funziona su tutte le versioni di Android a partire dall'API 14. NotificationCompat da AndroidX consente notifiche moderne su API vecchie. PhotoPicker è disponibile tramite ActivityResultContracts.PickVisualMedia a partire dall'API 34+.

kotlin
// Chiamata sicura di nuova API con compileSdk 36 e minSdk 26
import android.os.Build
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES
import android.graphics.Color

class NewApiHelper {

    // API 36+: nuovo metodo per lavorare con il colore
    fun formatColor(colorInt: Int): String {
        if (VERSION.SDK_INT >= VERSION_CODES.BAKLAVA) {
            // Nuova API da compileSdk 36 — richiede API 36+
            return Color.toArgbHexString(colorInt)
        }
        // Fallback: formattazione manuale per API vecchie
        return String.format(
            "#%08X", (0xFFFFFFFF toLong() and colorInt.toLong())
        )
    }

    // AndroidX: nessun backport necessario — controllo SDK_INT
    fun isEdgeToEdgeAvailable(): Boolean {
        return VERSION.SDK_INT >= VERSION_CODES.VANILLA_ICE_CREAM
    }
}

// Utilizzo in Activity
class ColorActivity : android.app.Activity() {
    override fun onCreate(savedInstanceState: android.os.Bundle?) {
        super.onCreate(savedInstanceState)
        val helper = NewApiHelper()
        val colorStr = helper.formatColor(0xFF6200EE)
        println("Color: $colorStr")
    }
}

La classe NewApiHelper dimostra la chiamata sicura della nuova API Color.toArgbHexString (API 36 ipotetica) con formattazione di fallback per le versioni vecchie. Il principio chiave: compileSdk fornisce l'accesso per chiamare nuovi metodi nel codice, ma un controllo SDK_INT in fase di esecuzione protegge da arresti anomali su dispositivi vecchi. Senza un controllo SDK_INT, un'app con minSdk 26 e compileSdk 36 si arresterà in modo anomalo su Android 8-15.

AGP (Android Gradle Plugin) e compileSdkVersion

Android Gradle Plugin (AGP) è lo strumento di build principale per le applicazioni Android. Ogni versione di AGP supporta un intervallo specifico di compileSdkVersion. AGP 8.7.x (rilasciato nel 2026) richiede compileSdk >= 34 e raccomanda compileSdk = 36. AGP 8.5.x supporta compileSdk 33-35. Se compileSdk è inferiore al minimo per AGP, il build fallirà con l'errore: "The SDK platform (X) is not supported by this version of the Android Gradle Plugin".

NDK (Native Development Kit) è anche legato a compileSdkVersion. Se il tuo progetto utilizza codice nativo in C/C++ tramite NDK, compileSdk determina la versione dei file di intestazione e delle librerie. NDK r27+ raccomanda compileSdk 36. Per le librerie con file .so, compileSdk influisce sul livello API minimo per il codice nativo tramite APP_MIN_SDK_VERSION in Application.mk.

Versione AGPcompileSdk minimocompileSdk raccomandatoNote
8.3.x3334Supporto Android 14
8.5.x3335Android 15, modalità R8 completa
8.7.x3436Android 16, Kotlin 2.1
8.9.x3536Classi R non transitive

Gradle (7.6+) e Kotlin (2.0+) influenzano anche la compatibilità con compileSdk. AGP 8.7+ richiede Gradle 8.9+ e Kotlin 2.0+. Quando si aggiorna compileSdk, si consiglia di aggiornare AGP, Gradle e Kotlin alle ultime versioni stabili. Verifica la compatibilità nella tabella ufficiale di compatibilità di Android Gradle Plugin.

Problemi comuni durante l'aggiornamento di compileSdk

I problemi durante l'aggiornamento di compileSdkVersion si dividono in tre categorie: errori di compilazione, avvisi di deprecazione e incompatibilità in fase di esecuzione. Errori di compilazione — i metodi vengono rimossi dall'API e il codice non viene compilato. Avvisi di deprecazione — i metodi sono contrassegnati come @Deprecated, il codice viene compilato con avvisi. Incompatibilità in fase di esecuzione — le nuove API sono necessarie per determinate funzionalità e causano errori se il livello API sul dispositivo è insufficiente.

Il primo problema comune — "Cannot resolve symbol X". Ciò significa che una classe o un metodo è stato rimosso dall'API pubblica nella nuova versione dell'SDK. Soluzione: trova un'alternativa nella nuova piattaforma o utilizza un equivalente AndroidX. Ad esempio, la classe AsyncTaskLoader è stata deprecata nell'API 28 e rimossa dall'API pubblica nelle versioni più recenti. Le alternative includono Kotlin Coroutines o WorkManager.

Il secondo problema — cambiamento della firma del metodo. Nella nuova versione dell'API, un metodo potrebbe aver cambiato il numero o il tipo dei suoi parametri. Il compilatore Kotlin/Java genera un errore: "None of the following functions can be called with the arguments supplied". Soluzione: aggiorna la chiamata del metodo per corrispondere alla nuova firma o aggiungi un controllo SDK_INT con la chiamata della vecchia firma per i dispositivi vecchi.

kotlin
// Risoluzione dei problemi durante l'aggiornamento di compileSdk
import android.os.Build
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES
import android.content.pm.PackageManager

class CompileSdkProblemFixer {

    // Problema: il metodo hasSystemFeature ha cambiato firma in API 36
    fun hasCamera(pm: PackageManager): Boolean {
        return if (VERSION.SDK_INT >= VERSION_CODES.BAKLAVA) {
            // Nuova firma: hasSystemFeature(String, FeatureType)
            pm.hasSystemFeature(
                PackageManager.FEATURE_CAMERA,
                PackageManager.FEATURE_TYPE_BACK
            )
        } else {
            // Vecchia firma: hasSystemFeature(String)
            @Suppress("DEPRECATION")
            pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)
        }
    }

    // Problema: classe rimossa, utilizzare equivalente AndroidX
    fun loadFragment(manager: androidx.fragment.app.FragmentManager) {
        // Invece di android.app.FragmentManager (rimosso) utilizzare
        // androidx.fragment.app.FragmentManager
        val fragment = CustomFragment()
        manager.beginTransaction()
            .replace(android.R.id.content, fragment)
            .commit()
    }
}

La classe CompileSdkProblemFixer risolve i problemi comuni: la firma cambiata di hasSystemFeature (cambiamento ipotetico nell'API 36) viene gestita tramite un controllo SDK_INT che chiama la versione corretta del metodo. La classe rimossa android.app.FragmentManager viene sostituita con l'equivalente AndroidX. Per le chiamate vecchie in cui non esiste alternativa, viene utilizzato @Suppress("DEPRECATION") con un commento che spiega il motivo del mantenimento.

Domande frequenti

Cos'è compileSdkVersion in Android?

compileSdkVersion è la versione dell'Android SDK utilizzata per compilare il codice. Determina quali API sono disponibili per lo sviluppatore al momento della compilazione. compileSdk non influisce sul comportamento runtime — i cambiamenti comportamentali sono gestiti da targetSdkVersion. compileSdk deve essere >= targetSdk e >= minSdk. L'aggiornamento di compileSdk fornisce accesso a nuove API ma richiede la verifica dei metodi deprecati e della compatibilità con AGP.

In che cosa compileSdkVersion differisce da targetSdkVersion?

compileSdkVersion controlla la compilazione: quali API sono disponibili per essere chiamate nel codice. targetSdkVersion controlla il comportamento runtime: quali cambiamenti comportamentali vengono applicati. compileSdk può essere superiore a targetSdk — questo consente di utilizzare nuove API nel codice senza attivare i cambiamenti comportamentali della nuova versione. compileSdk è sempre >= targetSdk. minSdk è il parametro più basso, targetSdk è quello intermedio, compileSdk è il più alto.

Quale compileSdkVersion dovrei usare nel 2026?

Nel 2026, si raccomanda compileSdk = 36 (Android 16, nome in codice Baklava). Questo fornisce accesso a tutte le API dell'ultima versione di Android. Per librerie e SDK, puoi utilizzare compileSdk = 35 o 34 per evitare di forzare i consumatori all'aggiornamento. compileSdk deve essere installato tramite SDK Manager e supportato dalla versione AGP. AGP 8.7+ richiede compileSdk >= 34.

Cosa fare se il codice non viene compilato dopo l'aggiornamento di compileSdk?

Gli errori dopo l'aggiornamento di compileSdk sono solitamente causati da API rimosse: classi o metodi contrassegnati come @Deprecated e rimossi. Soluzione: trova un'alternativa nel nuovo SDK, utilizza un equivalente AndroidX o aggiungi @SuppressLint. Una seconda causa sono i nuovi permessi obbligatori nel manifest. Una terza sono i cambiamenti di firma dei metodi: controlla la documentazione e aggiorna le chiamate alla nuova firma con un controllo SDK_INT.

Dovrei aggiornare compileSdkVersion insieme a targetSdk?

compileSdkVersion può essere aggiornato indipendentemente da targetSdk. Una configurazione di compileSdk = 36 con targetSdk = 34 è valida: il codice viene compilato con nuove API, ma i cambiamenti comportamentali delle API 35-36 non vengono attivati. L'aggiornamento di compileSdk è sicuro e non richiede QA. L'aggiornamento di targetSdk richiede un ciclo completo di test dei cambiamenti comportamentali. Si consiglia di mantenere compileSdk all'ultimo livello API stabile.

Riepilogo

  • compileSdkVersion — la versione dell'Android SDK per la compilazione, determina le API disponibili, non influisce sul runtime
  • Regola di gerarchia: compileSdk >= targetSdk >= minSdk; compileSdk può essere superiore a targetSdk
  • Aggiornare compileSdk è un'operazione sicura che richiede solo la verifica delle API deprecate e della compatibilità delle dipendenze
  • Le nuove API dal compileSdk aggiornato richiedono controlli runtime di Build.VERSION.SDK_INT, altrimenti arresti anomali su dispositivi vecchi
  • AGP versione 8.7+ richiede compileSdk >= 34, si raccomanda compileSdk = 36
  • AndroidX fornisce backport delle API, consentendo metodi moderni con qualsiasi compileSdk
  • API deprecate dopo l'aggiornamento di compileSdk: sostituire con alternative o utilizzare @Suppress con fallback

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche