targetSdkVersion: ключові поняття, behavioural changes та Google Play

Автор: IT Sectr Опубліковано: 2026-02-08 Час читання: 11 хв

targetSdkVersion — API Level Android, під який застосунок протестовано та оптимізовано. Цей параметр вказується в build.gradle та визначає, які behavioural changes (зміни поведінки системи) будуть застосовані до застосунку під час роботи. Якщо targetSdkVersion нижчий за API Level пристрою, Android вимикає behavioural changes, введені в новіших версіях, зберігаючи сумісність для старих застосунків. Згідно з Android Developers, Google Play вимагає, щоб targetSdkVersion був не старшим за 1 рік від поточного API Level.

Головне

  • targetSdkVersion — API Level, під який застосунок протестовано; впливає на behavioural changes
  • Behavioural changes — модифікації системи (Scoped Storage, Permissions), що застосовуються за targetSdk
  • Google Play вимагає targetSdk не старше 1 року від поточного API Level, інакше блокує публікацію
  • Підвищення targetSdk потребує тестування всіх behavioural changes нової версії Android
  • Різниця між targetSdk та compileSdk: targetSdk — рантайм, compileSdk — компіляція

Що таке targetSdkVersion в Android?

targetSdkVersion — цілочисельний параметр у build.gradle, який оголошує API Level, на якому застосунок тестувався. Система Android використовує цей параметр для вирішення, які behavioural changes застосовувати до застосунку під час виконання. Якщо targetSdkVersion = 33, Android застосовує всі behavioural changes, введені до API 33 включно, але не застосовує зміни API 34+. Якщо targetSdkVersion = 34 — застосовуються зміни до API 34, і так далі.

Ключова відмінність targetSdkVersion від minSdkVersion — механізм дії. minSdk перевіряється одноразово при встановленні та блокує встановлення, якщо умова не виконана. targetSdkVersion впливає на поведінку системи під час виконання на кожному пристрої, незалежно від того, на якій версії Android запущено застосунок. Той самий застосунок з targetSdk 31 поводитиметься по-різному на Android 13, 14 та 15, оскільки behavioural changes вище 31 вимкнені.

Механізм targetSdkVersion — це інструмент зворотної сумісності, вбудований в Android. Без нього кожне оновлення ОС ламало б тисячі старих застосунків. Google ввів цей механізм в Android 2.1 (API Level 7) і з тих пір використовує його як стандартний спосіб впровадження нових правил безпеки, конфіденційності та управління ресурсами без порушення роботи існуючих застосунків.

kotlin
// build.gradle.kts — targetSdkVersion у defaultConfig
android {
    namespace = "com.example.myapp"
    compileSdk = 36

    defaultConfig {
        applicationId = "com.example.myapp"
        minSdk = 26
        targetSdk = 36   // Протестовано під Android 16
        versionCode = 1
        versionName = "1.0.0"
    }
}

// Перевірка поточного targetSdk у коді
fun isUsingScopedStorage(): Boolean {
    // Context.getApplicationInfo().targetSdkVersion містить targetSdk застосунку
    return context.applicationInfo.targetSdkVersion >= VERSION_CODES.Q
}

У прикладі targetSdk = 36 включає всі behavioural changes Android 16. Код перевіряє targetSdkVersion через context.applicationInfo.targetSdkVersion — це дозволяє динамічно визначати, який режим сумісності увімкнено. Допоміжна функція корисна для бібліотек, які повинні адаптуватися під targetSdk викликаючого застосунку.

Behavioural Changes: як targetSdk впливає на застосунок

Behavioural changes — це модифікації поведінки системи Android, які застосовуються лише до застосунків з targetSdkVersion >= певного API Level. Кожен новий мажорний реліз Android вводить behavioural changes, і якщо застосунок не оновлює targetSdk, ці зміни не набувають чинності. Такий механізм дозволяє розробникам оновлювати застосунок у своєму темпі, а не синхронно з виходом нової версії ОС.

Scoped Storage (API 29) — одна з найзначніших behavioural changes. Застосунки з targetSdk 29+ не можуть отримувати прямий File-доступ до спільних директорій Pictures, Downloads, Music, Documents. Натомість використовується MediaStore для мультимедіа, SAF (Storage Access Framework) для довільних файлів та getExternalFilesDir() для власного сховища. Старі застосунки з targetSdk 28 і нижче продовжують працювати зі старим Full Storage Access, але це створює загрозу безпеці.

POST_NOTIFICATIONS (API 33) — runtime-дозвіл для надсилання сповіщень. Застосунки з targetSdk 33+ повинні запитувати дозвіл Manifest.permission.POST_NOTIFICATIONS у користувача через стандартний діалог. Якщо дозвіл не надано, NotificationManager.silent() не показує сповіщення користувачеві. На Android 13+ без цього дозволу push-сповіщення та локальні сповіщення просто не відображаються, що може суттєво знизити залученість користувачів.

API LevelBehavioural ChangeНеобхідні дії при оновленні
29Scoped StorageПерехід на MediaStore та SAF для файлів поза sandbox
30Package VisibilityДодавання <queries> у маніфест для взаємодії з пакетами
31Foreground Service NotificationПоказ сповіщення протягом 10 секунд після запуску служби
33POST_NOTIFICATIONSRuntime-запит дозволу на надсилання сповіщень
34Foreground Service TypesДекларація типу foreground-сервісу в маніфесті
35Privacy SandboxОбмеження рекламних ідентифікаторів (Advertising ID)

Як перевірити поточний targetSdk

Значення targetSdkVersion можна отримати через ADB: команда adb shell dumpsys package com.example.myapp | grep targetSdk виводить targetSdk=34. У коді context.getApplicationInfo().targetSdkVersion повертає ціле число. Для аналітики корисно логувати targetSdk разом з android.os.Build.VERSION.SDK_INT, щоб розуміти, які behavioural changes фактично активні на кожному сеансі.

Вимоги Google Play до targetSdkVersion (2026)

Google Play встановлює обов'язкові вимоги до targetSdkVersion для всіх опублікованих застосунків. З серпня 2024 року мінімальний targetSdk = 33 (Android 13). З серпня 2025 року — targetSdk = 34. Очікується, що з серпня 2026 року Google вимагатиме targetSdk = 35 (Android 15). Нові застосунки та оновлення існуючих повинні відповідати цим вимогам, інакше консоль блокує публікацію. Це політика Google Play, а не обмеження Android Runtime: застосунок з targetSdk 34 може працювати на Android 16, але не може бути опублікований у Play Store.

Android App Bundle (AAB) — обов'язковий формат публікації з серпня 2021 року. APK більше не приймається в Google Play (виняток — застосунки з розміром > 150 MB та деякі legacy-проєкти). AAB-формат дозволяє Google генерувати оптимізовані APK для кожного API Level та щільності екрану, що знижує розмір завантаження на 15-30%. Для перевірки targetSdk Google Play аналізує AAB-маніфест і при невідповідності видає помилку із зазначенням мінімального необхідного значення.

ПеріодМінімальний targetSdkВерсія AndroidПримітка
Серпень 202433Android 13Tiramisu — обов'язковий POST_NOTIFICATIONS
Серпень 202534Android 14Upside Down Cake — типи foreground-сервісів
Серпень 202635Android 15Vanilla Ice Cream — Privacy Sandbox
Серпень 2027 (план)36Android 16Baklava — T+

Google Play Console перевіряє targetSdkVersion не тільки при завантаженні нового AAB, але й при оновленні існуючого застосунку. Якщо ваш застосунок має targetSdk 33, а Google підвищить мінімальний поріг до 34 — ви не зможете випустити жодного оновлення, доки не підвищите targetSdk. Для застосунків, які довго не оновлювалися, Google Play може автоматично зняти їх з публікації (unpublish).

Як оновлювати targetSdkVersion без помилок

Оновлення targetSdkVersion — не просто зміна числа в build.gradle. Кожна behavioural change може зламати існуючу функціональність, якщо не підготувати код заздалегідь. Рекомендується починати підготовку за 3-6 місяців до дедлайну Google Play, особливо якщо застосунок великий і використовує багато системних API.

Покроковий процес: Крок 1 — вивчіть behavioural changes для нового API Level у документації Android Developers (сторінка "Behavioural Changes by API Level"). Крок 2 — створіть гілку targetSdk-update та змініть targetSdk на нове значення. Крок 3 — запустіть застосунок на емуляторі або пристрої з новим API Level та перевірте кожну функціональність, пов'язану зі змінами. Крок 4 — виправте помилки: додайте дозволи, змініть роботу з файлами, оновіть маніфест.

Крок 5 — протестуйте на старих пристроях. Підвищення targetSdk не впливає на пристрої з API Level нижче нового targetSdk, але behavioural changes застосовуються на всіх пристроях з API Level >= targetSdk. Якщо ви підняли targetSdk з 33 до 34, то на пристроях з API 34+ включаться behavioural changes API 34. На пристроях з API 33 нічого не зміниться.

kotlin
// Підготовка до targetSdk 35: Privacy Sandbox
import android.os.Build
import android.os.Build.VERSION_CODES
import com.google.android.gms.ads.identifier.AdvertisingIdClient

class AdsManager {

    fun getAdvertisingId(context: android.content.Context): String? {
        // Privacy Sandbox обмежує Advertising ID з API 35
        if (Build.VERSION.SDK_INT >= VERSION_CODES.VANILLA_ICE_CREAM) {
            // API 35+ — ідентифікатор недоступний, використовуємо MeasurementManager
            return null
        }
        return try {
            val adInfo = AdvertisingIdClient.getAdvertisingIdInfo(context)
            adInfo.getId()
        } catch (e: Exception) {
            null
        }
    }

    // Перевірка: які behavioural changes активні
    fun getActiveChanges(context: android.content.Context): List<String> {
        val sdkInt = Build.VERSION.SDK_INT
        val targetSdk = context.applicationInfo.targetSdkVersion
        return buildList {
            if (sdkInt >= VERSION_CODES.Q && targetSdk >= VERSION_CODES.Q)
                add("ScopedStorage")
            if (sdkInt >= VERSION_CODES.TIRAMISU && targetSdk >= VERSION_CODES.TIRAMISU)
                add("PostNotifications")
            if (sdkInt >= VERSION_CODES.UPSIDE_DOWN_CAKE && targetSdk >= VERSION_CODES.UPSIDE_DOWN_CAKE)
                add("FgsTypes")
        }
    }
}

Клас AdsManager показує підготовку до Privacy Sandbox (API 35). Advertising ID перестає бути доступним починаючи з API 35 при targetSdk 35+. Функція getActiveChanges демонструє правильний патерн перевірки behavioural changes: потрібно одночасно перевіряти і SDK_INT пристрою, і targetSdk застосунку. Тільки при збігу обох умов зміна дійсно активна.

Android 15 (API 35): ключові behavioural changes

Android 15 (API 35, Vanilla Ice Cream) вводить кілька критичних behavioural changes, які розробники повинні врахувати при оновленні targetSdk до 35. Перше — Privacy Sandbox for Android. Це ініціатива Google щодо заміни Advertising ID на більш приватні API: Topics API (інтереси користувача), Protected Audience (ремаркетинг) та Attribution Reporting (конверсії). З API 35 Advertising ID перестає бути стабільним ідентифікатором і може повертати нульове значення.

Друга зміна — Foreground Service Types (API 34, продовжено в API 35). Починаючи з API 34 кожен застосунок з targetSdk 34+ зобов'язаний вказати тип foreground-сервісу в маніфесті: dataSync, systemExempted, shortService, location, mediaPlayback та інші. Без цього система генерує ForegroundServiceTypeNotAllowedException. В API 35 додано новий тип health та посилено перевірку існуючих типів. Усі foreground-сервіси повинні бути переглянуті.

Третя зміна — обмеження на SCHEDULE_EXACT_ALARM. Починаючи з API 35 застосунки з targetSdk 35+ не можуть використовувати SCHEDULE_EXACT_ALARM без явного дозволу користувача. Система показує діалог, і користувач повинен схвалити точне планування. Для будильників і таймерів це означає додатковий крок в UX. Альтернатива — використовувати inexact-аларми з запасом у 10 хвилин.

kotlin
// Android 15 (API 35): перевірка SCHEDULE_EXACT_ALARM
import android.app.AlarmManager
import android.os.Build
import android.provider.Settings

class AlarmScheduler {

    fun canScheduleExactAlarms(context: android.content.Context): Boolean {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
            // API 35+: потрібен дозвіл користувача
            val alarmManager = context.getSystemService(
                android.content.Context.ALARM_SERVICE
            ) as AlarmManager
            return alarmManager.canScheduleExactAlarms()
        }
        // Нижче API 35 — точні аларми доступні без дозволу
        return true
    }

    fun requestExactAlarmPermission(activity: android.app.Activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
            val intent = android.content.Intent(
                Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM
            ).apply {
                data = android.net.Uri.fromParts(
                    "package", activity.packageName, null
                )
            }
            activity.startActivity(intent)
        }
    }
}

Privacy Sandbox та обмеження алармів — дві найбільш критичні behavioural changes API 35. Для рекламних SDK знадобиться міграція на Topics API та Attribution Reporting. Для застосунків з будильниками та нагадуваннями — адаптація UX під діалог дозволу. Ігнорування цих змін призведе до крашу застосунку в runtime на Android 15 або до несправної рекламної монетизації.

Різниця між targetSdk та compileSdk

Різниця між targetSdkVersion та compileSdkVersion — одна з найчастіших тем плутанини серед Android-розробників. compileSdkVersion — це версія SDK, проти якої компілюється код. Вона визначає, які API доступні під час компіляції, але не впливає на runtime-поведінку. targetSdkVersion — це версія, під яку застосунок протестовано, вона визначає, які behavioural changes застосовуються в runtime. compileSdk може і повинна бути вищою або дорівнювати targetSdk.

Правило просте: compileSdk >= targetSdk >= minSdk. compileSdk зазвичай дорівнює останньому стабільному API Level (у 2026 році — 36). targetSdk повинен бути якомога вищим серед версій, під які ви провели тестування. minSdk повинен бути якомога нижчим для максимального охоплення. Підвищення compileSdk не потребує тестування behavioural changes — воно лише відкриває доступ до нових API для компілятора. Підвищення targetSdk потребує повного циклу тестування всіх behavioural changes.

ПараметрМомент діїВпливає наМоже бути вищим за інші
compileSdkVersionКомпіляціяДоступність API для кодуТак, завжди вищий за targetSdk
targetSdkVersionRuntimeBehavioural changesТак, але нижчий за compileSdk
minSdkVersionВстановленняСумісність пристроївНі, завжди найнижчий

На практиці: якщо ви хочете використовувати новий API з Android 16 (API 36), але behavioural changes API 36 ще не тестували, встановіть compileSdk = 36, targetSdk = 35. Код скомпілюється з новими API, але behavioural changes API 36 не будуть застосовуватися. Як тільки протестуєте всі зміни — підніміть targetSdk до 36.

Часті запитання

Що таке targetSdkVersion в Android?

targetSdkVersion — API Level, під який застосунок протестовано. Android використовує його для застосування behavioural changes — змін поведінки, введених у цій версії. Якщо targetSdk нижчий за API Level пристрою, behavioural changes не застосовуються. Google Play вимагає targetSdk не старше 1 року від поточного API Level для публікації нових версій та оновлень.

Чим targetSdkVersion відрізняється від compileSdkVersion?

targetSdkVersion впливає на runtime-поведінку: включає behavioural changes певного API Level. compileSdkVersion впливає тільки на компіляцію: визначає, які API доступні для компілятора. compileSdk може бути вищим за targetSdk, але не навпаки. Підвищення compileSdk не потребує тестування, підвищення targetSdk — потребує перевірки всіх behavioural changes.

Які behavioural changes вводить Android 15 (API 35)?

Android 15 (API 35) вводить ключові behavioural changes: Privacy Sandbox з обмеженням Advertising ID, Foreground Service Types з обов'язковою декларацією, обмеження SCHEDULE_EXACT_ALARM з діалогом дозволу, посилення Scoped Storage та автоматичний перехід на credential-less автентифікацію. Застосунки з targetSdk 35+ повинні пройти повний цикл тестування під API 35.

Що буде, якщо не оновлювати targetSdkVersion?

Якщо не оновлювати targetSdkVersion, Google Play заблокує публікацію нових версій застосунку. Кожен рік Google підвищує мінімальний targetSdk: з серпня 2025 — targetSdk 34+, з серпня 2026 очікується targetSdk 35+. Застосунки, що не відповідають вимогам, видаляються з магазину. Крім того, не застосовуються behavioural changes безпеки, що робить застосунок вразливим.

Як перевірити targetSdkVersion встановленого застосунку?

Перевірити targetSdkVersion можна через ADB: adb shell dumpsys package com.example.myapp | grep targetSdk. В Android Studio відкрийте APK Analyzer: Build → Analyze APK → AndroidManifest.xml → uses-sdk. У коді: context.applicationInfo.targetSdkVersion. В Google Play Console targetSdk відображається на сторінці релізу в розділі Artifact Details.

Підсумки

  • targetSdkVersion — API Level, під який застосунок протестовано; визначає застосування behavioural changes в runtime
  • Behavioural changes — Scoped Storage, POST_NOTIFICATIONS, Foreground Service Types, Privacy Sandbox — активуються за targetSdk
  • Google Play вимагає targetSdk не старше 1 року від поточного API Level, інакше блокує публікацію оновлень
  • Підвищення targetSdk потребує 3-6 місяців підготовки: вивчення behavioural changes, тестування, виправлення коду
  • Privacy Sandbox (API 35+) змінює роботу з рекламними ідентифікаторами — потрібні Topics API та Attribution Reporting
  • compileSdk відповідає за компіляцію та доступ до API, targetSdk — за runtime-поведінку; compileSdk >= targetSdk
  • Перевірка active behavioural changes: context.applicationInfo.targetSdkVersion + Build.VERSION.SDK_INT

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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