Build Type — что это, конфигурация debug и release в Gradle

Автор: IT Sectr Опубликовано: 2026-05-30 Время чтения: 9 мин

Build Type в Android-разработке — это конфигурация Gradle, которая определяет, как приложение собирается: с отладкой или без, с оптимизацией кода или без, с каким сертификатом подписи. Android Gradle Plugin предоставляет два стандартных Build Type — debug и release, а разработчик может добавлять собственные, например staging или benchmark. По данным Google Android Developers, 2025, правильная настройка Build Type сокращает размер APK до 60% за счёт minification и resource shrinking. Каждый Build Type комбинируется с Product Flavors в Build Variant.

Главное

  • Build Type — конфигурация сборки с параметрами debuggable, minification, signing.
  • Debug — отладочная сборка с debuggable=true, minification=false, debug.keystore.
  • Release — финальная сборка с debuggable=false, minification=true, production signing.
  • ProGuard и R8 выполняют обфускацию, оптимизацию и сжатие кода в release-сборках.
  • BuildConfigField позволяет задавать переменные, доступные в коде, отдельно для каждого типа.

Что такое Build Type?

Build Type — это элемент Gradle-конфигурации Android-проекта, который описывает параметры компиляции и упаковки приложения. Каждый Build Type представляет собой именованный набор опций: debuggable (включить отладку), minificationEnabled (включить сжатие кода), shrinkResources (включить сжатие ресурсов), proguardFiles (файлы правил ProGuard), signingConfig (сертификат подписи) и другие. Build Types объявляются в блоке android.buildTypes файла build.gradle модуля app.

Основная задача Build Type — разделить development workflow (быстрая сборка, подробные логи, отладка) и production release (оптимизированный код, минимальный размер, безопасность). Debug-сборка должна собираться за секунды и предоставлять максимум информации разработчику. Release-сборка должна быть максимально быстрой и компактной для пользователей. Build Type — это инфраструктурная настройка, не связанная с функциональностью приложения.

Android Gradle Plugin автоматически создаёт source set для каждого Build Type — директорию src/<buildType>/ (например, src/debug/, src/release/). В этот source set можно помещать ресурсы, код и манифест, которые будут применяться только для данного типа сборки. Например, в src/debug/ можно разместить AndroidManifest.xml с разрешением на установку из ADB, а в src/release/ — без него. Source set Build Type имеет приоритет над source set Product Flavor.

Build Type vs Product Flavor

Ключевое отличие: Build Type отвечает на вопрос "как собирать?", а Product Flavor — на вопрос "что собирать?". Build Type может быть debug, release, staging. Product Flavor может быть free, paid, enterprise. Build Type не меняет функциональность приложения (не добавляет и не убирает экраны), Product Flavor — меняет. Build Type может отключить отладчик и включить обфускацию, Product Flavor — изменить applicationId и ресурсы. Оба работают в паре: каждый Build Type комбинируется с каждым Product Flavor, образуя Build Variant.

Стандартные Build Types: debug и release

Debug — это Build Type, создаваемый AGP по умолчанию. Он включает debuggable=true, что позволяет подключиться отладчиком, просматривать логи Log.d и использовать профилировщик Android Studio. Minification отключён, поэтому сборка происходит быстро. В debug-сборке applicationId получает суффикс ".debug" (если не переопределён), что позволяет установить debug-версию параллельно с release-версией на одном устройстве. Debug-сборка подписывается сертификатом из debug.keystore, который создаётся Android SDK автоматически.

Release — это Build Type для публикации приложения. debuggable=false, minificationEnabled=true (по умолчанию), shrinkResources=true. Разработчик обязан указать signingConfig с production-сертификатом — иначе сборка не будет считаться релизной. Release-сборка использует ProGuard или R8 для обфускации, оптимизации и сжатия кода. Android Studio не может подключиться отладчиком к release-сборке (если debuggable=false). Все Log.d и Log.v вызовы удаляются из кода на этапе minification, если настроены соответствующие правила ProGuard.

Важно: debug-сборки не тестируют поведение release. Minification может изменить поведение кода — reflection, сериализация, Gson/SQLite и другие библиотеки часто требуют правил ProGuard. Поэтому перед публикацией обязательно собирать release-сборку и тестировать её. Google Play Console и Firebase Test Lab позволяют загружать release-сборки для автоматического тестирования на реальных устройствах перед публикацией.

groovy
android {
    buildTypes {
        debug {
            debuggable true
            minification false
            signingConfig signingConfigs.debug
            versionNameSuffix "-debug"
        }

        release {
            debuggable false
            minification true
            shrinkResources true
            proguardFiles "proguard-rules.pro"
            signingConfig signingConfigs.release
            ndk { abiFilters "arm64-v8a", "x86_64" }
        }
    }
}

Создание кастомных Build Types

Наследование через initWith

В дополнение к debug и release можно создавать собственные Build Types — например staging (промежуточная среда) или benchmark (для тестов производительности). Кастомный Build Type объявляется в блоке buildTypes так же, как debug и release. Имя может быть любым, но рекомендуется использовать семантически понятные названия на английском языке. Для staging обычно устанавливают debuggable=true (для диагностики проблем в staging-окружении) и minification=true (чтобы тестировать обфускацию до продакшна).

Кастомный Build Type автоматически получает соответствующий source set (src/staging/) и генерирует задачи вида assembleStaging. AGP не накладывает ограничений на количество кастомных типов, но каждый новый тип умножает количество Build Variants. Практический лимит — 4-5 Build Types: debug, staging, benchmark, release, и, возможно, debugMinified (debug с включённой minification для тестирования ProGuard правил).

Для кастомного Build Type можно наследовать debuggable от debug с помощью initWith. Ключевое слово initWith копирует все параметры указанного Build Type, после чего их можно переопределить. Это удобно для создания staging на основе debug: initWith debug + дополнительно включить minification. Без initWith пришлось бы вручную перечислять все параметры базового типа.

groovy
android {
    buildTypes {
        staging {
            initWith debug
            minification true
            shrinkResources true
            proguardFiles "staging-proguard-rules.pro"
            versionNameSuffix "-staging"
        }

        benchmark {
            initWith release
            signingConfig signingConfigs.debug
            matchingFallbacks = ["release"]
        }
    }
}

// matchingFallbacks — для библиотек, у которых нет benchmark типа
// если библиотека имеет только release — AGP использует его

Signing-конфигурация для разных типов сборки

SigningConfig определяет, каким сертификатом подписывается APK или AAB. Android требует подписи всех устанавливаемых приложений — без неё система не позволит установить APK. Для debug-сборок AGP использует debug.keystore — предустановленный сертификат с известным паролем, который генерируется Android SDK Tools. Для release-сборок необходимо создать собственный сертификат через Android Studio (Build → Generate Signed Bundle/APK) или командой keytool командной строки.

Хранение signing-ключей — критичный аспект безопасности. Рекомендуется не хранить release-ключи в репозитории исходного кода. Вместо этого используются: файл keystore.properties (добавлен в .gitignore), переменные окружения CI/CD, или Android Studio свои encrypted-хранилище. В CI/CD (GitHub Actions, GitLab CI) signing-ключи хранятся в secrets и передаются в build.gradle через системные свойства. Пример: storePassword = System.getenv("KEYSTORE_PASSWORD").

Каждый Build Type может ссылаться на свой signingConfig. Для release — production-сертификат, для debug — debug.keystore, для staging — отдельный staging-сертификат. Signing-конфигурация напрямую влияет на возможность установки приложения: если подписать debug debug.keystore, а staging — production-ключом, staging нельзя будет установить поверх debug-версии из-за несовпадения подписей. ApplicationId тоже должен различаться — для этого используется applicationIdSuffix.

groovy
android {
    signingConfigs {
        debug {
            storeFile file("debug.keystore")
            storePassword "android"
            keyAlias "androiddebugkey"
            keyPassword "android"
        }
        release {
            storeFile file("release-key.jks")
            storePassword System.getenv("KEYSTORE_PASS")
            keyAlias "my-key"
            keyPassword System.getenv("KEY_PASS")
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

Minification, ProGuard и R8

Resource Shrinking

Minification — это процесс удаления неиспользуемого кода и переименования классов, методов и полей в короткие имена. AGP выполняет minification с помощью ProGuard (устаревший) или R8 (рекомендуемый, встроен в AGP начиная с версии 3.4). R8 выполняет четыре операции: shrinking (удаление неиспользуемых классов), optimisation (упрощение кода), obfuscation (переименование) и preverify (добавление информации для совместимости). Результат — APK меньшего размера, который сложнее декомпилировать.

Правила minification задаются в ProGuard rules files — текстовых файлах с синтаксисом -keep, -dontwarn, -keepclassmembers. Без правил R8 удалит или переименует классы, используемые через reflection (Gson, Retrofit, Room, Kotlin serialization). Android Studio шаблон проекта создаёт proguard-rules.pro, куда добавляются правила для конкретных библиотек. Библиотеки также могут содержать встроенные правила — они автоматически подключаются из jar/aar.

Shrink resources (shrinkResources=true) удаляет неиспользуемые ресурсы из APK. R8 сначала определяет, какие ресурсы не используются в коде (проверяет R.java и ссылки в манифесте), после чего удаляет их из финальной сборки. Для ресурсов, используемых через getIdentifier() или сторонними библиотеками, необходимо добавить tools:keep="@layout/my_layout" в ресурсах. В сочетании с minification, resource shrinking может уменьшить размер APK на 40-60%.

text
# proguard-rules.pro — обязательные правила
# Gson: сохранить классы для сериализации
-keepclassmembers class com.example.** {
    <fields>;
}

# Retrofit: сохранить интерфейсы API
-keep,allowobfuscation interface com.example.api.*

# Room: сохранить DAO и Entity
-keep class * extends androidx.room.RoomDatabase
-keep @interface androidx.room.** { *; }

# Kotlin Coroutines: предотвротить удаление Continuation
-keepnames class kotlinx.coroutines.internal.*

# OkHttp: сохранение service loader
-keep class okhttp3.** { *; }

BuildConfigField и ресурсы для Build Type

BuildConfig — это автоматически генерируемый класс Java/Kotlin, который содержит константы, определённые в defaultConfig, productFlavors и buildTypes. Через buildConfigField можно добавить кастомные поля: buildConfigField "String", "API_URL", '"https://api.example.com"'. BuildConfigField, объявленный в buildType, доступен во всех вариантах этого типа. Значения в buildType переопределяют значения из productFlavor, которые, в свою очередь, переопределяют defaultConfig.

Для debug-сборок удобно задавать API_URL на localhost или staging-сервер, для release — на production. BuildConfig.FLAVOR и BuildConfig.BUILD_TYPE также генерируются автоматически и содержат имя текущего flavor и build type. В коде можно использовать: if (BuildConfig.DEBUG) { /* логи */ } — константа DEBUG равна true только для debug-build type. BuildConfig.DEBUG — это стандартное поле, которое AGP добавляет в каждый BuildConfig.

Ресурсы для Build Type задаются через source set src/<buildType>/res/. Например, src/debug/res/values/strings.xml может содержать строку "Server: Dev", а src/release/res/ — "Server: Prod". Ресурсы манифеста также переопределяются через source set: src/debug/AndroidManifest.xml может включать <uses-permission android:name="android.permission.INTERNET" /> только для debug-сборок. Это чище, чем проверка BuildConfig в коде, и работает даже для атрибутов, которые нельзя задать программно (например, networkSecurityConfig).

kotlin
// src/debug/kotlin/.../DebugConfig.kt
object DebugConfig {
    val apiUrl = "http://localhost:8080/api"
    val enableLogging = true
    val enableCrashReporting = false
}

// src/release/kotlin/.../ReleaseConfig.kt
object ReleaseConfig {
    val apiUrl = "https://api.production.com/v2"
    val enableLogging = false
    val enableCrashReporting = true
}

// Использование: главный класс загружает Config через reflection
fun getConfig(): AppConfig = when (BuildConfig.BUILD_TYPE) {
    "debug" -> DebugConfig
    else -> ReleaseConfig
}

Часто задаваемые вопросы

Можно ли иметь debug-сборку с minification?

Да, создайте кастомный Build Type вроде debugMinified с initWith debug и включите minification: debugMinified { initWith debug; minification true }. Это полезно для тестирования ProGuard правил без сборки полной release-версии.

Как проверить, что сборка release подписана правильно?

Выполните apksigner из Android SDK: apksigner verify --print-certs app-release.apk. Если сертификат совпадает с тем, что загружен в Google Play Console — подпись верна. Также можно проверить через jarsigner для старых форматов.

Что такое matchingFallbacks в Build Type?

matchingFallbacks указывает, какой Build Type библиотеки использовать, если у неё нет нужного типа. Например, если у app есть тип "staging", а у библиотеки только "release", AGP использует release для библиотеки. Указывается как список: matchingFallbacks = ["release", "debug"].

Как отключить minification для конкретной библиотеки?

В ProGuard rules используйте -keep для классов библиотеки. Например: -keep class com.some.library.** { *; }. Для полного отключения minification для всех библиотек укажите -dontobfuscate и -dontoptimize в proguard-rules.pro.

Build Type влияет на версию API Android?

Build Type сам по себе не меняет minSdk или targetSdk. Но можно задать minSdk для конкретного Build Type: debug { minSdk 21 }. Это полезно для debug-сборок — можно поддерживать только API 21+ для ускорения сборки, а release собирать на minSdk 26.

Итоги

  • Build Type — инфраструктурная конфигурация сборки, определяющая отладку, сжатие и подпись.
  • Debug — быстрая сборка для разработки, release — оптимизированная для публикации.
  • Кастомные Build Types (staging, benchmark) создаются через initWith для наследования параметров.
  • R8 выполняет minification, obfuscation и resource shrinking, сокращая APK до 60%.
  • BuildConfigField и source sets позволяют задавать переменные и ресурсы для каждого типа.
  • Signing-ключи для release должны храниться вне репозитория — в CI/CD secrets или encrypted-хранилище.
  • Рекомендация: всегда тестируйте release-сборку перед публикацией — debug не показывает поведение с minification.

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

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

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

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