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 требует проверки deprecated 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 используется для тестирования upcoming 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 vs targetSdkVersion vs minSdkVersion

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

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

ПараметрСфера действияВлияет на runtimeТребует тестирования
compileSdkVersionКомпиляцияНетНет (только проверка deprecated)
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. Однако есть несколько шагов, которые нужно выполнить, чтобы избежать ошибок компиляции и deprecated-предупреждений.

Шаг 1 — установите новую платформу через SDK Manager в Android Studio: Tools → SDK Manager → SDK Platforms → выберите новый API Level. Если не установить платформу, Gradle попытается загрузить её автоматически, но это может замедлить первую сборку. Шаг 2 — измените compileSdk в build.gradle на новое значение. Шаг 3 — выполните сборку (Build → Make Project) и исправьте ошибки компиляции.

Шаг 4 — проверьте deprecated API. После повышения compileSdk некоторые методы могут оказаться помеченными @Deprecated с пометкой "removed in API X". Android Studio подсвечивает зачёркиванием и выдаёт warning. Замените deprecated-вызовы на новые альтернативы. Если альтернатива требует API Level выше minSdk, добавьте runtime-проверку. Шаг 5 — проверьте dependencies: некоторые библиотеки могут требовать определённую версию compileSdk. AGP 8.7+ рекомендует compileSdk = 36.

kotlin
// После повышения compileSdk: замена deprecated 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 {

    // ДО: deprecated метод (может быть удалён в новом API)
    @Suppress("DEPRECATION")
    fun getMemoryClassOld(context: android.content.Context): Int {
        val am = context.getSystemService(
            android.content.Context.ACTIVITY_SERVICE
        ) as ActivityManager
        return am.memoryClass  // Может быть deprecated в 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.x3334Android 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 был deprecated в 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, но требует проверки deprecated-методов и совместимости с 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. Вторая причина — новые обязательные permissions в манифесте. Третья — изменение сигнатур методов: проверьте документацию и обновите вызовы под новую сигнатуру с 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 — безопасная операция, требующая только проверки deprecated API и совместимости зависимостей
  • Новые API из повышенного compileSdk требуют runtime-проверок Build.VERSION.SDK_INT, иначе краш на старых устройствах
  • AGP версии 8.7+ требует compileSdk >= 34, рекомендуется compileSdk = 36
  • AndroidX предоставляет бэкпорты API, позволяя использовать современные методы при любом compileSdk
  • Deprecated API после повышения compileSdk: заменяйте на альтернативы или используйте @Suppress с fallback

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

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также