Build Type — co to je, konfigurace debug a release v Gradle

Autor: IT Sectr Publikováno: 2026-05-30 Doba čtení: 9 min

Build Type ve vývoji Android je konfigurace Gradle, která určuje, jak je aplikace sestavena: s laděním nebo bez, s optimalizací kódu nebo bez, s jakým podpisovým certifikátem. Android Gradle Plugin poskytuje dva standardní Build Type — debug a release, a vývojář může přidávat vlastní, například staging nebo benchmark. Podle Google Android Developers, 2025 správná konfigurace Build Type zmenšuje velikost APK až o 60% díky minification a resource shrinking. Každý Build Type se kombinuje s Product Flavors do Build Variant.

Hlavní body

  • Build Type — konfigurace sestavení s parametry debuggable, minification, signing.
  • Debug — ladicí sestavení s debuggable=true, minification=false, debug.keystore.
  • Release — finální sestavení s debuggable=false, minification=true, production signing.
  • ProGuard a R8 provádějí obfuskaci, optimalizaci a kompresi kódu v release sestaveních.
  • BuildConfigField umožňuje definovat proměnné přístupné v kódu zvlášť pro každý typ.

Co je Build Type?

Build Type je prvek konfigurace Gradle projektu Android, který popisuje parametry kompilace a balení aplikace. Každý Build Type představuje pojmenovanou sadu možností: debuggable (povolit ladění), minificationEnabled (povolit kompresi kódu), shrinkResources (povolit kompresi zdrojů), proguardFiles (soubory pravidel ProGuard), signingConfig (podpisový certifikát) a další. Build Types jsou deklarovány v bloku android.buildTypes souboru build.gradle modulu app.

Hlavním úkolem Build Type je oddělení development workflow (rychlé sestavení, podrobné logy, ladění) a production release (optimalizovaný kód, minimální velikost, bezpečnost). Debug sestavení by mělo být hotovo během sekund a poskytovat vývojáři maximum informací. Release sestavení by mělo být pro uživatele co nejrychlejší a nejkompaktnější. Build Type je infrastrukturní konfigurace, která nesouvisí s funkčností aplikace.

Android Gradle Plugin automaticky vytváří source set pro každý Build Type — adresář src/<buildType>/ (například src/debug/, src/release/). Do tohoto source set lze umístit zdroje, kód a manifest, které se použijí pouze pro daný typ sestavení. Například do src/debug/ lze umístit AndroidManifest.xml s oprávněním pro instalaci z ADB, do src/release/ — bez něj. Source set Build Type má prioritu před source set Product Flavor.

Build Type vs Product Flavor

Klíčový rozdíl: Build Type odpovídá na otázku „jak sestavit?", zatímco Product Flavor — na otázku „co sestavit?". Build Type může být debug, release, staging. Product Flavor může být free, paid, enterprise. Build Type nemění funkčnost aplikace (nepřidává ani neodebírá obrazovky), Product Flavor — mění. Build Type může vypnout ladicí nástroj a zapnout obfuskaci, Product Flavor může změnit applicationId a zdroje. Oba pracují v páru: každý Build Type se kombinuje s každým Product Flavor a tvoří Build Variant.

Standardní Build Types: debug a release

Debug je Build Type vytvářený AGP ve výchozím nastavení. Obsahuje debuggable=true, což umožňuje připojení debuggeru, prohlížení logů Log.d a použití profilovacího nástroje Android Studio. Minification je vypnuto, takže sestavení je rychlé. V debug sestavení získává applicationId příponu „.debug" (pokud není přepsána), což umožňuje nainstalovat debug verzi souběžně s release verzí na stejném zařízení. Debug je podepsán certifikátem z debug.keystore, který je automaticky vytvořen Android SDK.

Release je Build Type pro publikaci aplikace. debuggable=false, minificationEnabled=true (výchozí), shrinkResources=true. Vývojář musí uvést signingConfig s produkčním certifikátem — jinak sestavení není považováno za release. Release používá ProGuard nebo R8 pro obfuskaci, optimalizaci a kompresi kódu. Android Studio nemůže připojit debugger k release sestavení (pokud debuggable=false). Všechna volání Log.d a Log.v jsou odstraněna z kódu ve fázi minification, pokud jsou nakonfigurována příslušná pravidla ProGuard.

Důležité: debug sestavení netestují chování release. Minification může změnit chování kódu — reflexe, serializace, Gson/SQLite a další knihovny často vyžadují pravidla ProGuard. Proto před publikací vždy vytvořte release sestavení a otestujte ho. Google Play Console a Firebase Test Lab umožňují nahrávat release sestavení pro automatické testování na reálných zařízeních před publikací.

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" }
        }
    }
}

Vytváření vlastních Build Types

Dědění pomocí initWith

Kromě debug a release můžete vytvářet vlastní Build Types — například staging (přechodné prostředí) nebo benchmark (pro testy výkonu). Vlastní Build Type je deklarován v bloku buildTypes stejně jako debug a release. Název může být libovolný, ale doporučuje se používat sémanticky srozumitelné názvy v angličtině. Pro staging se obvykle nastavuje debuggable=true (pro diagnostiku problémů v staging prostředí) a minification=true (pro testování obfuskace před produkcí).

Vlastní Build Type automaticky získá odpovídající source set (src/staging/) a generuje úlohy typu assembleStaging. AGP neomezuje počet vlastních typů, ale každý nový typ násobí počet Build Variants. Praktický limit je 4-5 Build Types: debug, staging, benchmark, release a případně debugMinified (debug s povolenou minification pro testování pravidel ProGuard).

Pro vlastní Build Type lze debuggable zdědit z debug pomocí initWith. Klíčové slovo initWith zkopíruje všechny parametry zadaného Build Type, které pak lze přepsat. To je užitečné pro vytvoření staging na základě debug: initWith debug + dodatečné povolení minification. Bez initWith by bylo nutné ručně vyjmenovat všechny parametry základního typu.

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 — pro knihovny, které nemají benchmark typ
// pokud knihovna má pouze release — AGP jej použije

Konfigurace podpisu pro různé typy sestavení

SigningConfig určuje, jakým certifikátem je podepsán APK nebo AAB. Android vyžaduje podpis všech instalovatelných aplikací — bez něj systém nepovolí instalaci APK. Pro debug sestavení AGP používá debug.keystore — předinstalovaný certifikát se známým heslem, generovaný Android SDK Tools. Pro release sestavení je třeba vytvořit vlastní certifikát pomocí Android Studio (Build → Generate Signed Bundle/APK) nebo příkazem keytool.

Ukládání podpisových klíčů je kritický aspekt bezpečnosti. Doporučuje se neukládat release klíče v repozitáři zdrojového kódu. Místo toho se používají: soubor keystore.properties (přidaný do .gitignore), proměnné prostředí CI/CD nebo šifrované úložiště Android Studio. V CI/CD (GitHub Actions, GitLab CI) jsou podpisové klíče uloženy v secrets a předávány do build.gradle prostřednictvím systémových vlastností. Příklad: storePassword = System.getenv("KEYSTORE_PASSWORD").

Každý Build Type může odkazovat na svůj vlastní signingConfig. Pro release — produkční certifikát, pro debug — debug.keystore, pro staging — samostatný staging certifikát. Konfigurace podpisu přímo ovlivňuje možnost instalace aplikace: pokud je debug podepsán debug.keystore a staging produkčním klíčem, staging nelze nainstalovat přes debug verzi kvůli neshodě podpisů. ApplicationId musí být také odlišné — k tomu slouží 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 a R8

Resource Shrinking

Minification je proces odstraňování nepoužitého kódu a přejmenování tříd, metod a polí na krátká jména. AGP provádí minification pomocí ProGuard (zastaralý) nebo R8 (doporučený, vestavěný v AGP od verze 3.4). R8 provádí čtyři operace: shrinking (odstranění nepoužívaných tříd), optimisation (zjednodušení kódu), obfuscation (přejmenování) a preverify (přidání informací o kompatibilitě). Výsledkem je APK menší velikosti, který je obtížnější dekompilovat.

Pravidla minification jsou definována v ProGuard rules files — textových souborech se syntaxí -keep, -dontwarn, -keepclassmembers. Bez pravidel R8 odstraní nebo přejmenuje třídy používané prostřednictvím reflexe (Gson, Retrofit, Room, Kotlin serialization). Šablona projektu Android Studio vytváří proguard-rules.pro, do kterého se přidávají pravidla pro konkrétní knihovny. Knihovny mohou také obsahovat vestavěná pravidla — ta jsou automaticky připojena z jar/aar.

Shrink resources (shrinkResources=true) odstraňuje nepoužité zdroje z APK. R8 nejprve určí, které zdroje nejsou v kódu použity (kontroluje R.java a odkazy v manifestu), poté je odstraní z finálního sestavení. Pro zdroje používané prostřednictvím getIdentifier() nebo knihovnami třetích stran je třeba přidat tools:keep="@layout/my_layout" do zdrojů. V kombinaci s minification může resource shrinking zmenšit velikost APK o 40-60%.

text
# proguard-rules.pro — povinná pravidla
# Gson: zachovat třídy pro serializaci
-keepclassmembers class com.example.** {
    <fields>;
}

# Retrofit: zachovat API rozhraní
-keep,allowobfuscation interface com.example.api.*

# Room: zachovat DAO a Entity
-keep class * extends androidx.room.RoomDatabase
-keep @interface androidx.room.** { *; }

# Kotlin Coroutines: zabránit odstranění Continuation
-keepnames class kotlinx.coroutines.internal.*

# OkHttp: zachovat service loader
-keep class okhttp3.** { *; }

BuildConfigField a zdroje pro Build Type

BuildConfig je automaticky generovaná třída Java/Kotlin, která obsahuje konstanty definované v defaultConfig, productFlavors a buildTypes. Prostřednictvím buildConfigField lze přidat vlastní pole: buildConfigField "String", "API_URL", '"https://api.example.com"'. BuildConfigField deklarovaný v buildType je k dispozici ve všech variantách tohoto typu. Hodnoty v buildType přepisují hodnoty z productFlavor, které zase přepisují defaultConfig.

Pro debug sestavení je vhodné nastavit API_URL na localhost nebo staging server, pro release — na production. BuildConfig.FLAVOR a BuildConfig.BUILD_TYPE jsou také automaticky generovány a obsahují název aktuálního flavor a build type. V kódu lze použít: if (BuildConfig.DEBUG) { /* logy */ } — konstanta DEBUG je true pouze pro debug build type. BuildConfig.DEBUG je standardní pole, které AGP přidává do každého BuildConfig.

Zdroje pro Build Type jsou definovány prostřednictvím source set src/<buildType>/res/. Například src/debug/res/values/strings.xml může obsahovat text „Server: Dev", zatímco src/release/res/ — „Server: Prod". Zdroje manifestu jsou také přepisovány prostřednictvím source set: src/debug/AndroidManifest.xml může obsahovat <uses-permission android:name="android.permission.INTERNET" /> pouze pro debug sestavení. To je čistší než kontrola BuildConfig v kódu a funguje dokonce i pro atributy, které nelze nastavit programově (například 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
}

// Použití: hlavní třída načítá Config pomocí reflexe
fun getConfig(): AppConfig = when (BuildConfig.BUILD_TYPE) {
    "debug" -> DebugConfig
    else -> ReleaseConfig
}

Často kladené otázky

Lze mít debug sestavení s minification?

Ano, vytvořte vlastní Build Type jako debugMinified s initWith debug a povolte minification: debugMinified { initWith debug; minification true }. To je užitečné pro testování pravidel ProGuard bez sestavování plné release verze.

Jak zkontrolovat, že release sestavení je správně podepsáno?

Spusťte apksigner z Android SDK: apksigner verify --print-certs app-release.apk. Pokud se certifikát shoduje s tím nahraným do Google Play Console — podpis je správný. Lze také zkontrolovat pomocí jarsigner pro starší formáty.

Co je matchingFallbacks v Build Type?

matchingFallbacks určuje, který Build Type knihovny použít, pokud nemá požadovaný typ. Například, pokud aplikace má typ „staging" a knihovna pouze „release", AGP použije release pro knihovnu. Uvádí se jako seznam: matchingFallbacks = ["release", "debug"].

Jak vypnout minification pro konkrétní knihovnu?

V pravidlech ProGuard použijte -keep pro třídy knihovny. Například: -keep class com.some.library.** { *; }. Pro úplné vypnutí minification pro všechny knihovny nastavte -dontobfuscate a -dontoptimize v proguard-rules.pro.

Ovlivňuje Build Type verzi Android API?

Build Type sám o sobě nemění minSdk ani targetSdk. Lze však nastavit minSdk pro konkrétní Build Type: debug { minSdk 21 }. To je užitečné pro debug sestavení — lze podporovat pouze API 21+ pro zrychlení sestavení, zatímco release se sestavuje s minSdk 26.

Shrnutí

  • Build Type — infrastrukturní konfigurace sestavení určující ladění, kompresi a podpis.
  • Debug — rychlé sestavení pro vývoj, release — optimalizované pro publikaci.
  • Vlastní Build Types (staging, benchmark) se vytvářejí pomocí initWith pro dědění parametrů.
  • R8 provádí minification, obfuscation a resource shrinking, snižuje APK až o 60%.
  • BuildConfigField a source sets umožňují definovat proměnné a zdroje pro každý typ.
  • Podpisové klíče pro release by měly být uloženy mimo repozitář — v CI/CD secrets nebo šifrovaném úložišti.
  • Doporučení: vždy testujte release sestavení před publikací — debug neukazuje chování s minification.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také