Ang Build Type sa Android development ay isang Gradle configuration na tumutukoy kung paano binuo ang application: may debugging o wala, may code optimization o wala, sa anong signing certificate. Ang Android Gradle Plugin ay nagbibigay ng dalawang standard na Build Type — debug at release, at maaaring magdagdag ang developer ng sariling mga uri, halimbawa staging o benchmark. Ayon sa Google Android Developers, 2025, ang tamang configuration ng Build Type ay nagpapababa ng laki ng APK hanggang 60% dahil sa minification at resource shrinking. Ang bawat Build Type ay pinagsasama sa Product Flavors sa Build Variant.
Mga pangunahing punto
Build Type ay isang elemento ng Gradle configuration ng Android project na naglalarawan ng mga parameter ng compilation at packaging ng application. Ang bawat Build Type ay isang pinangalanang set ng mga opsyon: debuggable (pag-enable ng debugging), minificationEnabled (pag-enable ng code compression), shrinkResources (pag-enable ng resource compression), proguardFiles (mga file ng ProGuard rules), signingConfig (signing certificate) at iba pa. Ang Build Types ay idinedeklara sa android.buildTypes block ng build.gradle file ng app module.
Ang pangunahing gawain ng Build Type ay paghiwalayin ang development workflow (mabilis na build, detalyadong log, debugging) at production release (naka-optimize na code, minimal na laki, seguridad). Ang debug build ay dapat mabuo sa ilang segundo at magbigay ng maximum na impormasyon sa developer. Ang release build ay dapat na pinakamabilis at pinakakompak para sa mga user. Ang Build Type ay isang infrastructural configuration na hindi nauugnay sa functionality ng application.
Ang Android Gradle Plugin ay awtomatikong gumagawa ng source set para sa bawat Build Type — ang direktoryo src/<buildType>/ (halimbawa src/debug/, src/release/). Sa source set na ito maaaring ilagay ang mga resources, code at manifest na ilalapat lamang para sa uri ng build na iyon. Halimbawa, sa src/debug/ maaaring ilagay ang AndroidManifest.xml na may pahintulot sa pag-install mula sa ADB, at sa src/release/ — wala. Ang Build Type source set ay may priyoridad kaysa sa Product Flavor source set.
Ang pangunahing pagkakaiba: Build Type ay sumasagot sa tanong na “paano buuin?”, at Product Flavor — sa tanong na “ano ang bubuuin?”. Ang Build Type ay maaaring debug, release, staging. Ang Product Flavor ay maaaring free, paid, enterprise. Ang Build Type ay hindi nagbabago ng functionality ng application (hindi nagdaragdag o nag-aalis ng mga screen), ang Product Flavor — nagbabago. Ang Build Type ay maaaring mag-disable ng debugger at mag-enable ng obfuscation, ang Product Flavor ay maaaring magbago ng applicationId at resources. Pareho silang gumagana nang magkapares: ang bawat Build Type ay pinagsasama sa bawat Product Flavor, na bumubuo ng Build Variant.
Debug ay ang Build Type na ginagawa ng AGP bilang default. Kasama nito ang debuggable=true, na nagpapahintulot sa pagkonekta ng debugger, pagtingin ng Log.d logs at paggamit ng Android Studio profiler. Ang Minification ay naka-disable, kaya mabilis ang build. Sa debug build, ang applicationId ay nakakakuha ng suffix na “.debug” (kung hindi na-override), na nagpapahintulot sa pag-install ng debug version nang parallel sa release version sa parehong device. Ang Debug ay naka-sign gamit ang certificate mula sa debug.keystore, na awtomatikong ginagawa ng Android SDK.
Release ay ang Build Type para sa publikasyon ng application. debuggable=false, minificationEnabled=true (default), shrinkResources=true. Dapat tukuyin ng developer ang signingConfig na may production certificate — kung hindi, ang build ay hindi ituturing na release. Ang Release ay gumagamit ng ProGuard o R8 para sa obfuscation, optimization at compression ng code. Hindi maaaring ikonekta ng Android Studio ang debugger sa release build (kung debuggable=false). Ang lahat ng Log.d at Log.v na tawag ay inaalis mula sa code sa yugto ng minification, kung ang mga naaangkop na ProGuard rules ay na-configure.
Mahalaga: ang mga debug build ay hindi sumusubok ng release behavior. Ang minification ay maaaring magbago ng behavior ng code — ang reflection, serialization, Gson/SQLite at iba pang mga library ay madalas na nangangailangan ng ProGuard rules. Kaya bago ang publikasyon, dapat gumawa at sumubok ng release build. Ang Google Play Console at Firebase Test Lab ay nagpapahintulot sa pag-upload ng mga release build para sa awtomatikong pagsubok sa mga totoong device bago ang publikasyon.
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" }
}
}
}
Bukod sa debug at release, maaari kang gumawa ng sariling Build Types — halimbawa staging (intermediate na kapaligiran) o benchmark (para sa performance testing). Ang custom na Build Type ay idinedeklara sa buildTypes block tulad ng debug at release. Ang pangalan ay maaaring kahit ano, ngunit inirerekomenda na gumamit ng semantikong naiintindihan na mga pangalan sa Ingles. Para sa staging, karaniwang naka-set ang debuggable=true (para sa diagnosis ng mga problema sa staging environment) at minification=true (upang subukan ang obfuscation bago ang produksyon).
Ang custom na Build Type ay awtomatikong nakakakuha ng kaukulang source set (src/staging/) at bumubuo ng mga gawain tulad ng assembleStaging. Ang AGP ay hindi nagpapataw ng mga limitasyon sa bilang ng mga custom na uri, ngunit ang bawat bagong uri ay nagpaparami ng bilang ng Build Variants. Ang praktikal na limitasyon ay 4-5 Build Types: debug, staging, benchmark, release at posibleng debugMinified (debug na may naka-enable na minification para sa pagsubok ng ProGuard rules).
Para sa custom na Build Type, ang debuggable ay maaaring mamana mula sa debug gamit ang initWith. Ang keyword na initWith ay kinokopya ang lahat ng parameter ng tinukoy na Build Type, pagkatapos nito ay maaari silang i-override. Ito ay maginhawa para sa paggawa ng staging batay sa debug: initWith debug + karagdagang paganahin ang minification. Kung wala ang initWith, kakailanganing manu-manong ilista ang lahat ng parameter ng base type.
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 — para sa mga library na walang benchmark type
// kung ang library ay may release lamang — ginagamit ito ng AGP
SigningConfig ay tumutukoy kung saang certificate naka-sign ang APK o AAB. Ang Android ay nangangailangan ng pag-sign ng lahat ng nai-install na application — kung wala ito, hindi papayagan ng system ang pag-install ng APK. Para sa mga debug build, ginagamit ng AGP ang debug.keystore — isang pre-installed na certificate na may kilalang password, na binuo ng Android SDK Tools. Para sa mga release build, kailangan mong gumawa ng sarili mong certificate sa pamamagitan ng Android Studio (Build → Generate Signed Bundle/APK) o gamit ang keytool command.
Ang pag-iimbak ng mga signing key ay isang kritikal na aspeto ng seguridad. Inirerekomenda na huwag iimbak ang mga release key sa source code repository. Sa halip, ginagamit ang: keystore.properties file (idinagdag sa .gitignore), CI/CD environment variables, o ang naka-encrypt na imbakan ng Android Studio. Sa CI/CD (GitHub Actions, GitLab CI), ang mga signing key ay naka-imbak sa mga secrets at ipinapasa sa build.gradle sa pamamagitan ng system properties. Halimbawa: storePassword = System.getenv("KEYSTORE_PASSWORD").
Ang bawat Build Type ay maaaring tumukoy sa sarili nitong signingConfig. Para sa release — production certificate, para sa debug — debug.keystore, para sa staging — hiwalay na staging certificate. Ang configuration ng pag-sign ay direktang nakakaapekto sa posibilidad ng pag-install ng application: kung ang debug ay naka-sign gamit ang debug.keystore, at ang staging ay gamit ang production key, ang staging ay hindi mai-install sa ibabaw ng debug version dahil sa hindi pagkakatugma ng mga signature. Ang ApplicationId ay dapat ding magkaiba — para dito ginagamit ang applicationIdSuffix.
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 ay ang proseso ng pag-alis ng hindi nagamit na code at pagpapalit ng pangalan ng mga klase, metodo at field sa mga maikling pangalan. Ginagawa ng AGP ang minification gamit ang ProGuard (luma na) o R8 (inirerekomenda, naka-embed sa AGP mula noong bersyon 3.4). Ang R8 ay nagsasagawa ng apat na operasyon: shrinking (pag-alis ng hindi nagamit na mga klase), optimisation (pagpapasimple ng code), obfuscation (pagpapalit ng pangalan) at preverify (pagdaragdag ng impormasyon ng compatibility). Resulta — isang APK na mas maliit ang laki na mas mahirap i-decompile.
Ang mga panuntunan ng minification ay tinukoy sa ProGuard rules files — mga text file na may syntax na -keep, -dontwarn, -keepclassmembers. Kung walang mga panuntunan, aalisin o papalitan ng R8 ang mga klase na ginagamit sa pamamagitan ng reflection (Gson, Retrofit, Room, Kotlin serialization). Ang template ng proyekto ng Android Studio ay gumagawa ng proguard-rules.pro, kung saan idinaragdag ang mga panuntunan para sa mga partikular na library. Ang mga library ay maaari ring maglaman ng mga built-in na panuntunan — awtomatikong ikokonekta ang mga ito mula sa jar/aar.
Shrink resources (shrinkResources=true) ay nag-aalis ng hindi nagamit na resources mula sa APK. Unang tinutukoy ng R8 kung aling resources ang hindi ginagamit sa code (sinusuri ang R.java at mga reference sa manifest), pagkatapos ay inaalis ang mga ito mula sa final build. Para sa mga resources na ginagamit sa pamamagitan ng getIdentifier() o ng third-party na mga library, kailangang magdagdag ng tools:keep="@layout/my_layout" sa mga resources. Sa kombinasyon sa minification, ang resource shrinking ay maaaring magpababa ng laki ng APK ng 40-60%.
# proguard-rules.pro — mga mandatoryong panuntunan
# Gson: panatilihin ang mga class para sa serialization
-keepclassmembers class com.example.** {
<fields>;
}
# Retrofit: panatilihin ang mga API interface
-keep,allowobfuscation interface com.example.api.*
# Room: panatilihin ang DAO at Entity
-keep class * extends androidx.room.RoomDatabase
-keep @interface androidx.room.** { *; }
# Kotlin Coroutines: pigilan ang pag-alis ng Continuation
-keepnames class kotlinx.coroutines.internal.*
# OkHttp: panatilihin ang service loader
-keep class okhttp3.** { *; }
BuildConfig ay isang awtomatikong binuong Java/Kotlin class na naglalaman ng mga constant na tinukoy sa defaultConfig, productFlavors at buildTypes. Sa pamamagitan ng buildConfigField ay maaaring magdagdag ng custom na field: buildConfigField "String", "API_URL", '"https://api.example.com"'. Ang BuildConfigField na idineklara sa buildType ay available sa lahat ng variant ng uri na ito. Ang mga halaga sa buildType ay nag-o-override ng mga halaga mula sa productFlavor, na siya namang nag-o-override ng defaultConfig.
Para sa mga debug build, maginhawang itakda ang API_URL sa localhost o staging server, at para sa release — sa production. Ang BuildConfig.FLAVOR at BuildConfig.BUILD_TYPE ay awtomatik ding nabubuo at naglalaman ng pangalan ng kasalukuyang flavor at build type. Sa code ay maaaring gamitin: if (BuildConfig.DEBUG) { /* log */ } — ang constant na DEBUG ay true lamang para sa debug build type. Ang BuildConfig.DEBUG ay isang standard na field na idinaragdag ng AGP sa bawat BuildConfig.
Ang mga resources para sa Build Type ay tinukoy sa pamamagitan ng source set src/<buildType>/res/. Halimbawa, ang src/debug/res/values/strings.xml ay maaaring maglaman ng text na “Server: Dev”, at ang src/release/res/ — “Server: Prod”. Ang mga resource ng manifest ay na-o-override din sa pamamagitan ng source set: ang src/debug/AndroidManifest.xml ay maaaring magsama ng <uses-permission android:name="android.permission.INTERNET" /> para lamang sa mga debug build. Ito ay mas malinis kaysa sa pagsuri ng BuildConfig sa code at gumagana kahit para sa mga attribute na hindi maaaring itakda nang programmatically (halimbawa networkSecurityConfig).
// 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
}
// Paggamit: ang pangunahing class ay nag-load ng Config sa pamamagitan ng reflection
fun getConfig(): AppConfig = when (BuildConfig.BUILD_TYPE) {
"debug" -> DebugConfig
else -> ReleaseConfig
}
Mga madalas itanong
Oo, gumawa ng custom na Build Type tulad ng debugMinified na may initWith debug at paganahin ang minification: debugMinified { initWith debug; minification true }. Ito ay kapaki-pakinabang para sa pagsubok ng ProGuard rules nang hindi binuo ang buong release version.
Patakbuhin ang apksigner mula sa Android SDK: apksigner verify --print-certs app-release.apk. Kung ang certificate ay tumutugma sa na-upload sa Google Play Console — tama ang signature. Maaari ring suriin sa pamamagitan ng jarsigner para sa mga lumang format.
matchingFallbacks ay tumutukoy kung aling Build Type ng library ang gagamitin kung wala itong kinakailangang uri. Halimbawa, kung ang app ay may uri na “staging”, at ang library ay may “release” lamang, ginagamit ng AGP ang release para sa library. Tinutukoy bilang listahan: matchingFallbacks = ["release", "debug"].
Sa ProGuard rules, gamitin ang -keep para sa mga class ng library. Halimbawa: -keep class com.some.library.** { *; }. Para ganap na i-disable ang minification para sa lahat ng library, itakda ang -dontobfuscate at -dontoptimize sa proguard-rules.pro.
Ang Build Type mismo ay hindi nagbabago ng minSdk o targetSdk. Ngunit maaari mong itakda ang minSdk para sa isang partikular na Build Type: debug { minSdk 21 }. Ito ay kapaki-pakinabang para sa mga debug build — maaari mong suportahan lamang ang API 21+ para mapabilis ang build, habang ang release ay binuo sa minSdk 26.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din