compileSdkVersion: основи, нови API и настройка в Gradle

Автор: IT Sectr Публикувано: 2026-02-08 Време за четене: 11 мин

compileSdkVersion — версията на Android SDK, използвана при компилиране на приложението. Параметърът се посочва в build.gradle и определя кои API са достъпни за разработчика на етапа на изграждане: класове, методи, константи и интерфейси от определено API Level. За разлика от targetSdkVersion, compileSdkVersion не влияе на runtime поведението — behavioural changes на Android не зависят от този параметър. Според Android Developers, compileSdk трябва да бъде поне не по-нисък от targetSdk, а в идеалния случай — равен на последното стабилно API Level.

Основни точки

  • compileSdkVersion — версия на SDK за компилиране, дава достъп до API на посоченото ниво
  • Не влияе на runtime поведението — behavioural changes се управляват от targetSdkVersion, а не от compileSdk
  • compileSdk трябва да бъде >= targetSdk, препоръчва се да се държи на последното стабилно API Level
  • Повишаването на compileSdk изисква проверка на остарели API и съвместимост на зависимостите
  • Android SDK включва платформи за всяко API Level — изтеглят се чрез SDK Manager

Какво е compileSdkVersion в Android?

compileSdkVersion — целочислен параметър в build.gradle, който указва срещу коя версия на Android SDK да се компилира кодът. Когато пишете код, използващ класове от android.* или androidx.*, компилаторът ги проверява с API, налични в посочената версия на compileSdk. Ако метод се появил в API 36 и compileSdk = 35, кодът няма да се компилира. Ако compileSdk = 36 — кодът ще се компилира, но на устройство с API 35 при извикване на този метод без проверка ще възникне грешка.

compileSdkVersion се зарежда от Android SDK Platform, инсталирана чрез SDK Manager в Android Studio. Всяко API Level има своя платформа: android-21, android-29, android-34, android-35, android-36. Платформата съдържа android.jar — набор от класове, методи и константи, с които работи компилаторът Kotlin/Java. Ако платформата не е инсталирана, Gradle ще я изтегли автоматично чрез sdkmanager при първото изграждане.

AGP (Android Gradle Plugin) версия 8.7+ препоръчва посочване на compileSdk като цяло число чрез compileSdk = 36 в Kotlin DSL, без префикс android-. compileSdk може също да бъде посочен чрез compileSdkVersion 36 в Groovy DSL или compileSdkPreview за предварителни версии на SDK (developer previews). compileSdkPreview се използва за тестване на предстоящи API Level преди официалното пускане.

kotlin
// build.gradle.kts — настройка на compileSdkVersion
android {
    namespace = "com.example.myapp"

    // compileSdk = 36 — последно стабилно API Level (Android 16)
    compileSdk = 36

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

// Алтернативно: compileSdkPreview за предварителни версии
// compileSdkPreview = "Baklava"

В примера compileSdk = 36 предоставя достъп до всички API на Android 16 (Baklava). Android SDK Platform 36 трябва да бъде инсталирана в SDK Manager. compileSdkPreview с име "Baklava" може да се използва за тестване на нестабилни API преди официалното пускане на платформата. След пускането, preview се заменя със стабилен compileSdk = 36.

compileSdkVersion срещу targetSdkVersion срещу minSdkVersion

Три параметъра на API Level в build.gradle — compileSdkVersion, targetSdkVersion и minSdkVersion — често се бъркат. Всеки отговаря за различен аспект на съвместимост и техните стойности трябва да бъдат съгласувани по правилото compileSdk >= targetSdk >= minSdk. minSdk — долна граница: устройства под нея няма да видят приложението. targetSdk — точка на тестване: behavioural changes се включват до това ниво. compileSdk — таван: API над това ниво не са достъпни за компилатора.

Ключово практическо правило: compileSdk може да бъде повишен без никакво тестване на устройства. Това е безопасна операция, която просто дава на компилатора нова версия на android.jar. Единственият риск — остарели API, които могат да бъдат премахнати в новата версия на платформата, но това се открива на етапа на компилиране и лесно се отстранява. Повишаването на targetSdk, напротив, изисква пълен QA цикъл.

ПараметърОбхват на действиеВлияе на runtimeИзисква тестване
compileSdkVersionКомпилиранеНеНе (само проверка на остарели)
targetSdkVersionRuntimeДа — behavioural changesДа — пълен QA цикъл
minSdkVersionИнсталиранеНеНе (но влияе на покритието)

Защо compileSdk може да бъде по-висок от targetSdk? Представете си, че излезе Android 16 (API 36) с нови API, които искате да използвате в кода, но behavioural changes на API 36 все още не сте тествали. Задавате compileSdk = 36 (новите API достъпни), targetSdk = 35 (behavioural changes на API 36 изключени). Кодът ще се компилира, ще използва нови методи под SDK_INT проверки и behavioural changes на API 36 няма да счупят приложението, защото targetSdk = 35.

Примери за правилни комбинации

compileSdk = 36, targetSdk = 36, minSdk = 26 — пълна съвместимост с най-новите API и behavioural changes, покритие 85% от устройствата. compileSdk = 36, targetSdk = 34, minSdk = 26 — нови API достъпни, behavioural changes само до API 34. compileSdk = 35, targetSdk = 36 — неправилно: compileSdk по-нисък от targetSdk, API 36 недостъпни, въпреки че behavioural changes 36 са активни.

Как да актуализирате compileSdkVersion: стъпка по стъпка ръководство

Актуализирането на compileSdkVersion — една от най-простите и безопасни операции в Android проект. За разлика от targetSdk, не изисква продължително тестване на behavioural changes. Въпреки това, има няколко стъпки, които трябва да се изпълнят, за да се избегнат грешки при компилиране и предупреждения за остарели елементи.

Стъпка 1 — инсталирайте новата платформа чрез SDK Manager в Android Studio: Tools → SDK Manager → SDK Platforms → изберете новото API Level. Ако не инсталирате платформата, Gradle ще се опита да я изтегли автоматично, но това може да забави първото изграждане. Стъпка 2 — променете compileSdk в build.gradle на новата стойност. Стъпка 3 — изпълнете изграждането (Build → Make Project) и поправете грешките при компилиране.

Стъпка 4 — проверете остарелите API. След повишаване на compileSdk, някои методи може да бъдат маркирани с @Deprecated с бележка "removed in API X". Android Studio ги подчертава със зачертаване и показва предупреждение. Заменете остарелите извиквания с нови алтернативи. Ако алтернативата изисква API Level по-високо от minSdk, добавете runtime проверка. Стъпка 5 — проверете dependencies: някои библиотеки може да изискват определена версия на compileSdk. AGP 8.7+ препоръчва compileSdk = 36.

kotlin
// След повишаване на compileSdk: замяна на остарели API
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 {

    // ПРЕДИ: остарял метод (може да бъде премахнат в ново API)
    @Suppress("DEPRECATION")
    fun getMemoryClassOld(context: android.content.Context): Int {
        val am = context.getSystemService(
            android.content.Context.ACTIVITY_SERVICE
        ) as ActivityManager
        return am.memoryClass  // Може да бъде остаряло в API 36
    }

    // СЛЕД: нова алтернатива (ако е налична)
    fun getMemoryClassNew(context: android.content.Context): Int {
        if (VERSION.SDK_INT >= VERSION_CODES.BAKLAVA) {
            // Ново API от compileSdk 36
            val am = context.getSystemService(
                android.content.Context.ACTIVITY_SERVICE
            ) as ActivityManager
            return am.getMemoryClassSafe()  // Пример за ново API
        }
        @Suppress("DEPRECATION")
        return context.getSystemService(
            android.content.Context.ACTIVITY_SERVICE
        ) as ActivityManager
            .memoryClass
    }
}

Класът CompileSdkMigration показва правилния модел за миграция. Старият метод memoryClass може да бъде премахнат в новото API — компилаторът ще даде грешка. Новата алтернатива getMemoryClassSafe е достъпна само на API 36+, затова се извиква под проверка SDK_INT >= BAKLAVA. За стари устройства се използва fallback с @Suppress("DEPRECATION").

Работа с нови API: conditional checks и fallback

Нови API, достъпни благодарение на повишаването на compileSdkVersion, не могат да бъдат извиквани директно, ако minSdkVersion е по-нисък от това API Level. Без runtime проверка, приложението ще се срине с AbstractMethodError, NoSuchMethodError или VerifyError на стари устройства. Основният защитен механизъм — проверка на Build.VERSION.SDK_INT с извикване на новото API само при достатъчно API Level и fallback за стари версии.

AndroidX предоставя обратна съвместимост за много нови API, което позволява използването на модерни методи дори при нисък compileSdk. Например Activity Result API от androidx.activity:activity-ktx:1.9.3 работи на всички версии на Android от API 14 нататък. NotificationCompat от AndroidX позволява използването на модерни известия на стари API. PhotoPicker е достъпен чрез ActivityResultContracts.PickVisualMedia от API 34+.

kotlin
// Безопасно извикване на ново API с compileSdk 36 и 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+: нов метод за работа с цвят
    fun formatColor(colorInt: Int): String {
        if (VERSION.SDK_INT >= VERSION_CODES.BAKLAVA) {
            // Ново API от compileSdk 36 — изисква API 36+
            return Color.toArgbHexString(colorInt)
        }
        // Fallback: ръчно форматиране за стари API
        return String.format(
            "#%08X", (0xFFFFFFFF toLong() and colorInt.toLong())
        )
    }

    // AndroidX: обратна съвместимост не се изисква — проверка SDK_INT
    fun isEdgeToEdgeAvailable(): Boolean {
        return VERSION.SDK_INT >= VERSION_CODES.VANILLA_ICE_CREAM
    }
}

// Използване в 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")
    }
}

Класът NewApiHelper демонстрира безопасно извикване на новото API Color.toArgbHexString (хипотетично API 36) с fallback форматиране за стари версии. Ключов принцип: compileSdk предоставя достъп до извикване на нови методи в кода, но runtime проверката SDK_INT предпазва от срив на стари устройства. Без проверка SDK_INT, приложението с minSdk 26 и compileSdk 36 ще се срива на Android 8-15.

AGP (Android Gradle Plugin) и compileSdkVersion

Android Gradle Plugin (AGP) — основният инструмент за изграждане на Android приложения. Всяка версия на AGP поддържа определен диапазон от compileSdkVersion. AGP 8.7.x (пуснат през 2026 г.) изисква compileSdk >= 34 и препоръчва compileSdk = 36. AGP 8.5.x поддържа compileSdk 33-35. Ако compileSdk е по-нисък от минималния за AGP, изграждането ще завърши с грешка "The SDK platform (X) is not supported by this version of the Android Gradle Plugin".

NDK (Native Development Kit) също е свързан с compileSdkVersion. Ако проектът използва нативен код на C/C++ чрез NDK, compileSdk определя версията на заглавните файлове и библиотеки. NDK r27+ препоръчва compileSdk 36. За библиотеки с .so файлове, compileSdk влияе на минималното API Level за нативен код чрез APP_MIN_SDK_VERSION в Application.mk.

Версия на AGPМинимален compileSdkПрепоръчителен compileSdkЗабележка
8.3.x3334Поддръжка на Android 14
8.5.x3335Android 15, R8 full mode
8.7.x3436Android 16, Kotlin 2.1
8.9.x3536Non-transitive R classes

Gradle (7.6+) и Kotlin (2.0+) също влияят на съвместимостта с compileSdk. AGP 8.7+ изисква Gradle 8.9+ и Kotlin 2.0+. При повишаване на compileSdk се препоръчва актуализиране на AGP, Gradle и Kotlin до последните стабилни версии. Проверете съвместимостта в официалната таблица Android Gradle Plugin compatibility.

Типични проблеми при повишаване на compileSdk

Проблемите при повишаване на compileSdkVersion се делят на три категории: compilation errors, deprecated warnings и runtime incompatibilities. Compilation errors — методи премахнати от API и кодът не се компилира. Deprecated warnings — методи маркирани с @Deprecated, кодът се компилира с предупреждения. Runtime incompatibilities — новите API са задължителни за определена функционалност и причиняват грешка при недостатъчно API Level на устройството.

Първият типичен проблем — "Cannot resolve symbol X". Това означава, че клас или метод е премахнат от публичния API в новата версия на SDK. Решение: намерете алтернатива на новата платформа или използвайте AndroidX еквивалент. Например класът AsyncTaskLoader беше остарял в API 28 и премахнат от публичния API в по-нови версии. Алтернатива — Kotlin Coroutines или WorkManager.

Вторият проблем — промяна на сигнатурата на метод. В новата версия на API, методът може да е променил броя или типовете параметри. Компилаторът Kotlin/Java дава грешка "None of the following functions can be called with the arguments supplied". Решение: актуализирайте извикването на метода към новата сигнатура или добавете проверка SDK_INT с извикване на старата сигнатура за стари устройства.

kotlin
// Решаване на проблеми при повишаване на compileSdk
import android.os.Build
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES
import android.content.pm.PackageManager

class CompileSdkProblemFixer {

    // Проблем: методът hasSystemFeature промени сигнатурата си в API 36
    fun hasCamera(pm: PackageManager): Boolean {
        return if (VERSION.SDK_INT >= VERSION_CODES.BAKLAVA) {
            // Нова сигнатура: hasSystemFeature(String, FeatureType)
            pm.hasSystemFeature(
                PackageManager.FEATURE_CAMERA,
                PackageManager.FEATURE_TYPE_BACK
            )
        } else {
            // Стара сигнатура: hasSystemFeature(String)
            @Suppress("DEPRECATION")
            pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)
        }
    }

    // Проблем: клас премахнат, използваме AndroidX еквивалент
    fun loadFragment(manager: androidx.fragment.app.FragmentManager) {
        // Вместо android.app.FragmentManager (премахнат) използваме
        // androidx.fragment.app.FragmentManager
        val fragment = CustomFragment()
        manager.beginTransaction()
            .replace(android.R.id.content, fragment)
            .commit()
    }
}

Класът CompileSdkProblemFixer решава типични проблеми: променената сигнатура на hasSystemFeature (хипотетична промяна в API 36) се обработва чрез SDK_INT проверка с извикване на правилната версия на метода. Премахнатият клас android.app.FragmentManager е заменен с AndroidX еквивалент. За стари извиквания, където няма алтернатива, се използва @Suppress("DEPRECATION") с коментар за причината за запазване.

Често задавани въпроси

Какво е compileSdkVersion в Android?

compileSdkVersion — версия на Android SDK за компилиране на код. Определя кои API са достъпни за разработчика при изграждане. compileSdk не влияе на runtime поведението — behavioural changes се управляват от targetSdkVersion. compileSdk трябва да бъде >= targetSdk и >= minSdk. Повишаването на compileSdk дава достъп до нови API, но изисква проверка на остарели методи и съвместимост с AGP.

Каква е разликата между compileSdkVersion и targetSdkVersion?

compileSdkVersion управлява компилирането: кои API са достъпни за извикване в кода. targetSdkVersion управлява runtime поведението: кои behavioural changes се прилагат. compileSdk може да бъде по-висок от targetSdk — това позволява използване на нови API в кода без активиране на behavioural changes на нови версии. compileSdk винаги е >= targetSdk. minSdk — най-ниският параметър, targetSdk — среден, compileSdk — най-високият.

Кой compileSdkVersion да използваме през 2026 г.?

През 2026 г. се препоръчва compileSdk = 36 (Android 16, кодово име Baklava). Това дава достъп до всички API на последната версия на Android. За библиотеки и SDK може да се използва compileSdk = 35 или 34, за да не се принуждават потребителите да актуализират. compileSdk трябва да бъде инсталиран чрез SDK Manager и поддържан от версията на AGP. AGP 8.7+ препоръчва compileSdk >= 34.

Какво да направим, ако кодът не се компилира след повишаване на compileSdk?

Грешките след повишаване на compileSdk обикновено са свързани с премахнати API: класове или методи, маркирани с @Deprecated и премахнати. Решение: намерете алтернатива в новия SDK, използвайте AndroidX еквивалент или добавете @SuppressLint. Втора причина — нови задължителни разрешения в манифеста. Трета — промяна на сигнатури на методи: проверете документацията и актуализирайте извикванията към новата сигнатура с проверка SDK_INT.

Трябва ли да повишаваме compileSdkVersion едновременно с targetSdk?

compileSdkVersion може да бъде повишаван независимо от targetSdk. Конфигурацията compileSdk = 36 с targetSdk = 34 е правилна: кодът се компилира с нови API, но behavioural changes на API 35-36 не се активират. Повишаването на compileSdk е безопасно и не изисква QA. Повишаването на targetSdk изисква пълен цикъл на тестване на behavioural changes. Препоръчва се да държите compileSdk на последното стабилно API Level.

Обобщение

  • compileSdkVersion — версия на Android SDK за компилиране, определя достъпните API, не влияе на runtime
  • Правило за йерархия: compileSdk >= targetSdk >= minSdk; compileSdk може да бъде по-висок от targetSdk
  • Повишаване на compileSdk — безопасна операция, изисква само проверка на остарели API и съвместимост на зависимости
  • Нови API от повишен compileSdk изискват runtime проверки на Build.VERSION.SDK_INT, иначе срив на стари устройства
  • AGP версия 8.7+ изисква compileSdk >= 34, препоръчва се compileSdk = 36
  • AndroidX предоставя обратна съвместимост на API, позволявайки използване на модерни методи при всякакъв compileSdk
  • Остарели API след повишаване на compileSdk: заменете с алтернативи или използвайте @Suppress с fallback

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също