build.gradle Gradle پر Android پروجیکٹ کی مرکزی بلڈ فائل ہے جس میں ایپلیکیشن کو کمپائل، پیکج اور سائن کرنے کی ہدایات شامل ہیں۔ پروجیکٹ کے ہر ماڈیول کا اپنا build.gradle ہوتا ہے: ایک پروجیکٹ کی سطح پر (project-level) اور ایک ہر ماڈیول کے لیے (module-level)۔ Google Android Developers, 2025 کے مطابق، صحیح build.gradle کنفیگریشن بلڈ کو 40% تک تیز کرتی ہے اور انحصار کے تنازعات کو ختم کرتی ہے۔ نحو دو زبانوں کو سپورٹ کرتا ہے: Groovy (build.gradle) اور Kotlin DSL (build.gradle.kts)۔
اہم نکات
build.gradle Groovy (.gradle ایکسٹینشن) یا Kotlin (.gradle.kts) زبان میں لکھا گیا ایک بلڈ سکرپٹ ہے جو Android ایپلیکیشن کمپائلیشن کے تمام پہلوؤں کا انتظام کرتا ہے۔ Gradle ایک خودکار بلڈ سسٹم ہے جسے Google نے 2013 میں Android کے معیار کے طور پر اپنایا تھا۔ build.gradle بیان کرتا ہے: کون سے پلگ ان لاگو ہیں (Android، Kotlin، لائبریریاں)، کون سے انحصار منسلک ہیں، SDK کے کون سے ورژن استعمال ہوئے ہیں، ایپلیکیشن پر دستخط کیسے کریں اور کہاں شائع کریں۔
بلڈ کے عمل میں تین مراحل شامل ہیں: Initialization (ماڈیول کی دریافت)، Configuration (build.gradle سکرپٹس کا نفاذ)، Execution (ٹاسکس کا نفاذ)۔ build.gradle Configuration مرحلے کے دوران چلتا ہے، جب Gradle ٹاسک گراف بناتا ہے۔ اس مقام پر Build Variants کا تعین کیا جاتا ہے، انحصار کا حساب لگایا جاتا ہے اور ٹاسکس کنفیگر کی جاتی ہیں۔ اہم: build.gradle کوڈ ہے، صرف کنفیگریشن نہیں۔ اس میں شرائط، لوپس، میتھڈ کالز اور بیرونی سکرپٹس استعمال کی جا سکتی ہیں۔
Gradle فائلیں ماڈیول روٹ (app/build.gradle) اور پروجیکٹ روٹ (build.gradle) میں محفوظ ہوتی ہیں۔ اس کے علاوہ، Gradle apply from کو سپورٹ کرتا ہے — بیرونی Gradle سکرپٹس کو شامل کرنا۔ یہ بار بار چلنے والی منطق کو مشترکہ سیٹنگز والی فائلوں میں نکالنے کی اجازت دیتا ہے۔ Convention Plugins (AGP 7+) کی آمد کے ساتھ، apply from کو متروک سمجھا جاتا ہے — Convention Plugins ماڈیولز کے درمیان کنفیگریشن کے دوبارہ استعمال کا ایک ٹائپ سیف اور کمپوزایبل طریقہ فراہم کرتے ہیں۔
2013 سے، build.gradle کے نحو میں اہم تبدیلیاں آئی ہیں: متحرک کنفیگریشنز والے Groovy سے لے کر کمپائل ٹائم چیک والے Kotlin DSL تک۔ AGP ورژن 1.0 سے 8.7 (2025) تک تیار ہوا ہے۔ اہم سنگ میل: AGP 3.0 (Java 8 desugar، نیا variant API)، AGP 4.0 (view binding، Java 11)، AGP 7.0 (ڈیفالٹ طور پر Kotlin DSL، Java 11 کم از کم)، AGP 8.0 (non-transitive R classes، Kotlin میں بلڈ کنفیگ)، AGP 8.7 (kapt کی بجائے KSP، تیز کنفیگریشن)۔
Project-level build.gradle (جڑ) تمام ماڈیولز کے لیے مشترکہ پلگ ان، ریپازٹریز اور کنفیگریشنز کی وضاحت کرتا ہے۔ مرکزی بلاکس: plugins (Gradle پلگ ان اعلانات)، repositories (انحصار کے ذرائع: mavenCentral، google، jitpack)۔ جڑ build.gradle میں عام طور پر android بلاک نہیں ہوتا — یہ ماڈیولز میں ظاہر ہوتا ہے۔ Project-level میں تمام ذیلی پروجیکٹس کی مشترکہ کنفیگریشن کے لیے subprojects بلاک بھی ہو سکتا ہے، اگرچہ Convention Plugins بہتر ہیں۔
Module-level build.gradle (مثال کے طور پر، app/build.gradle) ایک مخصوص ماڈیول کی وضاحت کرتا ہے۔ اگر ماڈیول ایک ایپلیکیشن ہے، تو یہ com.android.application پلگ ان لاگو کرتا ہے۔ اگر لائبریری ہے — com.android.library۔ Module-level پر مشتمل ہے: android بلاک (compileSdk، defaultConfig، buildTypes، productFlavors)، dependencies بلاک (ماڈیول انحصار) اور اختیاری طور پر ٹیسٹ اور پیکجنگ کنفیگریشن کے بلاکس۔ Module-level project-level کے بعد چلتا ہے اور مشترکہ سیٹنگز کو اوور رائڈ کر سکتا ہے۔
AGP 8.0 سے شروع کرتے ہوئے، جڑ build.gradle مرکزی انحصار ورژن مینجمنٹ کے لیے version catalogs (libs.versions.toml) استعمال کر سکتا ہے۔ version catalog gradle/ ڈائریکٹری میں ایک فائل ہے جس میں ورژن، لائبریریاں اور پلگ ان شامل ہیں۔ build.gradle میں انحصار libs کے ذریعے منسلک ہوتے ہیں: implementation(libs.retrofit)۔ version catalogs نئے پروجیکٹس کے لیے لازمی ہیں اور تین یا زیادہ ماڈیولز والے تمام پروجیکٹس کے لیے تجویز کردہ ہیں۔
// settings.gradle.kts — پروجیکٹ جڑ
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
// build.gradle.kts (project-level)
plugins {
id("com.android.application") version "8.7.0" apply false
id("org.jetbrains.kotlin.android") version "2.0.21" apply false
}
// app/build.gradle.kts (module-level)
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("com.google.devtools.ksp")
}
android {
namespace = "com.example.myapp"
compileSdk = 35
defaultConfig {
applicationId = "com.example.myapp"
minSdk = 26
targetSdk = 35
versionCode = 1
versionName = "1.0.0"
}
}
Groovy ایک متحرک JVM زبان ہے جو Gradle کا اصل نحو تھی۔ Groovy سکرپٹس (.gradle) متحرک ٹائپنگ استعمال کرتی ہیں: آپ ٹائپ چھوڑ سکتے ہیں، کوٹیشن مارکس کے ساتھ یا بغیر سٹرنگ استعمال کر سکتے ہیں، ایسے میتھڈ کال کر سکتے ہیں جو کمپائل ٹائم پر موجود نہیں ہیں۔ Groovy کی لچک ہی اس کی خامی ہے: IDE سکرپٹ کے چلنے تک نحو اور ٹائپس کی تصدیق نہیں کر سکتا، جس کی وجہ سے غلط پیرامیٹر ناموں یا ٹائپس کی وجہ سے رن ٹائم خرابیاں پیدا ہوتی ہیں۔
Kotlin DSL (.gradle.kts) Kotlin کی جامد ٹائپنگ استعمال کرتا ہے۔ IDE ٹائپس کی تصدیق کرتا ہے، آٹوکمپلیٹ کے ذریعے دستیاب پیرامیٹرز تجویز کرتا ہے اور ترمیم کے وقت خرابیوں کو نمایاں کرتا ہے۔ Kotlin DSL Configuration مرحلے میں سست ہے (.kts فائلوں کو بائٹ کوڈ میں کمپائل کرنے کی وجہ سے)، لیکن Google مسلسل کارکردگی بہتر کرتا ہے: AGP 8.5+ Gradle Configuration Cache اور Caching Kotlin DSL compilation استعمال کرتا ہے، فرق کو 1-2 سیکنڈ تک کم کرتا ہے۔
Google تمام نئے پروجیکٹس کے لیے Kotlin DSL اور موجودہ پروجیکٹس کی بتدریج منتقلی کی تجویز کرتا ہے۔ Groovy سے Kotlin DSL میں منتقلی سیدھی ہے: کوٹیشن مارکس کو قوسین سے بدل دیا جاتا ہے، ٹائپس شامل کی جاتی ہیں، آپریٹرز کو فنکشنز میں تبدیل کیا جاتا ہے۔ زیادہ تر لائبریریاں اپنی دستاویزات میں Kotlin DSL مثالیں فراہم کرتی ہیں۔ پیچیدہ معاملات (Custom Plugin، Task Graph) کے لیے، Kotlin DSL ٹائپ سیف API فراہم کرتا ہے اور ان خرابیوں کو روکتا ہے جو Groovy میں صرف رن ٹائم پر دریافت ہوتی ہیں۔ Version catalogs (libs.versions.toml) دونوں نحویوں کے ساتھ یکساں کام کرتے ہیں۔
| خصوصیت | Groovy (.gradle) | Kotlin DSL (.gradle.kts) |
|---|---|---|
| ٹائپنگ | متحرک | جامد |
| IDE سپورٹ | محدود | مکمل (آٹوکمپلیٹ، ٹائپس) |
| کنفیگریشن کی رفتار | تیز (کوئی کمپائلیشن نہیں) | سست (.kts کمپائلیشن) |
| خرابیاں | رن ٹائم | کمپائل ٹائم |
| تجویز | صرف پرانے پروجیکٹس | نئے پروجیکٹس اور منتقلی |
android بلاک module-level build.gradle کا مرکزی عنصر ہے۔ اس کے اندر کنفیگر کیا جاتا ہے: namespace (R اور BuildConfig کے لیے)، compileSdk، defaultConfig، buildTypes، productFlavors، sourceSets، compileOptions، packaging، bundle۔ android بلاک کے تمام پیرامیٹرز صرف Android ماڈیولز پر لاگو ہوتے ہیں۔ اگر ماڈیول ایک لائبریری ہے، تو application کی بجائے لائبریری پلگ ان استعمال کیا جاتا ہے، اور android بلاک میں applicationId موجود نہیں ہوتا۔
compileSdk SDK کا وہ ورژن ہے جس کے ساتھ کوڈ کمپائل کیا جاتا ہے۔ یہ تازہ ترین Android API کے برابر ہونا چاہیے (تحریر کے وقت — 35)۔ minSdk سپورٹ کے لیے کم از کم API ورژن ہے۔ targetSdk وہ ورژن ہے جسے ایپلیکیشن ہدف بناتی ہے (اس ورژن کے رویے کی تبدیلیاں لاگو ہوتی ہیں)۔ compileSdk اور targetSdk کے درمیان فرق: compileSdk دستیاب APIs کا تعین کرتا ہے، targetSdk رن ٹائم رویے کا تعین کرتا ہے۔ تجویز: compileSdk = تازہ ترین، targetSdk = تازہ ترین - 1 (نئی تبدیلیوں کے مطابقت کی جانچ کے لیے)۔
compileOptions Java مطابقت سیٹ کرتا ہے: sourceCompatibility اور targetCompatibility۔ AGP 8+ کو کمپائلیشن کے لیے Java 17+ کی ضرورت ہے۔ packaging لائبریریوں سے فائل شامل کرنے کا انتظام کرتا ہے: META-INF تنازعات حل کرنے کے لیے exclude، merge، pickFirst۔ buildFeatures ViewBinding، DataBinding، Compose کو فعال/غیر فعال کرتا ہے۔ aaptOptions وسائل کی پروسیسنگ کو کنفیگر کرتا ہے: ignoreAssetsPattern، cruncherEnabled۔ android بلاک کا ہر عنصر بلڈ کے ایک مخصوص پہلو کو بہتر بناتا ہے۔
android {
namespace = "com.example.myapp"
compileSdk = 35
buildToolsVersion = "35.0.0"
defaultConfig {
applicationId = "com.example.myapp"
minSdk = 26
targetSdk = 35
versionCode = 5
versionName = "2.3.1"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
getByName("debug") { isDebuggable = true }
getByName("release") {
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"))
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
buildFeatures {
viewBinding = true
compose = true
}
}
build.gradle میں انحصار وہ لائبریریاں اور ماڈیولز ہیں جو پروجیکٹ سے منسلک ہوتے ہیں۔ dependencies بلاک android بلاک کے برابر کی سطح پر ہوتا ہے۔ Gradle کئی کنفیگریشنز کو سپورٹ کرتا ہے: implementation (لائبریری اس ماڈیول میں دستیاب ہے، منتقلی نہیں ہے)، api (لائبریری منحصر ماڈیولز کے لیے منتقلی طور پر دستیاب ہے)، compileOnly (صرف کمپائلیشن کے لیے، APK میں شامل نہیں)، runtimeOnly (صرف رن ٹائم میں)، annotationProcessor / ksp (تشریحی پروسیسرز)، testImplementation (صرف ٹیسٹ کے لیے)، androidTestImplementation (صرف آلاتی ٹیسٹ کے لیے)۔
AGP 8.0 سے شروع کرتے ہوئے، Non-Transitive R classes — ہر لائبریری کا اپنا R کلاس ہوتا ہے، جو وسائل کے تنازعات کو روکتا ہے۔ dependencies بلاک میں صحیح کنفیگریشنز کا استعمال کرنا ضروری ہے: implementation منتقلی انحصار کو ظاہر نہیں کرتا، جو بلڈ کو تیز کرتا ہے۔ api انہیں ظاہر کرتا ہے — جب کوئی لائبریری کسی دوسری لائبریری سے ٹائپ برآمد کرتی ہے تو استعمال کیا جاتا ہے (مثال کے طور پر، Retrofit اپنی عوامی API میں OkHttp ٹائپ استعمال کرتا ہے)۔
ورژن مینجمنٹ کے لیے BOM (Bill of Materials) استعمال کرنے کی تجویز کی جاتی ہے — ایک بلڈ فائل جو مطابقت رکھنے والے لائبریری ورژنز کی وضاحت کرتی ہے۔ Firebase BOM: implementation(platform("com.google.firebase:firebase-bom:33.0.0"))۔ BOM منسلک کرنے کے بعد، آپ ورژن کے بغیر صرف لائبریری کا نام بتا سکتے ہیں — BOM خود بخود ایک مطابقت رکھنے والا ورژن منتخب کرے گا۔ یہ مختلف لائبریریوں کے منتقلی انحصار کے درمیان تنازعات کو ختم کرتا ہے۔ BOM Firebase، Compose، Kotlin، Ktor، AndroidX کے لیے دستیاب ہیں۔
dependencies {
// BOM — ورژن مینجمنٹ
implementation(platform("androidx.compose:compose-bom:2024.12.01"))
implementation(platform("com.google.firebase:firebase-bom:33.0.0"))
// AndroidX اور Compose
implementation("androidx.core:core-ktx")
implementation("androidx.lifecycle:lifecycle-runtime-ktx")
implementation("androidx.activity:activity-compose")
implementation("androidx.compose.ui:ui")
// Network
implementation("com.squareup.retrofit2:retrofit:2.11.0")
implementation("com.squareup.okhttp3:okhttp:4.12.0")
// Firebase (BOM کے ورژن)
implementation("com.google.firebase:firebase-firestore")
implementation("com.google.firebase:firebase-crashlytics")
// ٹیسٹنگ
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.2.1")
}
ملٹی ماڈیول پروجیکٹس میں، ہر ماڈیول کا اپنا build.gradle ہوتا ہے۔ ایک ماڈیول کو دوسرے سے منسلک کرنے کے لیے implementation(project(":module-name")) نحو استعمال کیا جاتا ہے۔ Gradle خود بخود ماڈیول کو دوبارہ بناتا ہے اگر اس کی کنفیگریشن تبدیل ہو گئی ہو۔ ملٹی ماڈیول آرکیٹیکچر بلڈ ٹائم کو بہتر بناتا ہے (اضافہ بلڈ، متوازی کاری) اور فیچر ماڈیولز، کور ماڈیولز اور لائبریریوں کے درمیان ذمہ داریاں تقسیم کرتا ہے۔
ملٹی ماڈیول پروجیکٹس کا کلیدی مسئلہ کنفیگریشن ڈپلیکیشن ہے۔ اگر 10 ماڈیولز میں ایک ہی minSdk، compileSdk اور Compose انحصار ہیں، تو یہ مختلف build.gradle فائلوں میں 10 کاپیاں ہیں۔ حل Convention Plugins (پہلے buildSrc) ہے۔ Convention Plugin ایک Gradle پلگ ان ہے جو Kotlin میں لکھا گیا ہے اور ماڈیولز پر لاگو ہوتا ہے: plugins { id("myapp.android.library") }۔ پلگ ان میں مشترکہ کنفیگریشن ہوتی ہے، اور تبدیلیاں فوری طور پر تمام ماڈیولز پر لاگو ہوتی ہیں۔
Convention Plugins کو منظم کرنے کے لیے پروجیکٹ کی جڑ میں build-logic/ ڈائریکٹری استعمال ہوتی ہے۔ اس میں settings.gradle میں includeBuild اور Kotlin پلگ ان شامل ہیں۔ Convention Plugins کو پروجیکٹس کے درمیان دوبارہ استعمال کے لیے maven ریپازٹری میں شائع کیا جا سکتا ہے۔ Google ملٹی ماڈیول پروجیکٹس کے معیار کے طور پر Convention Plugins کی تجویز کرتا ہے، جو subprojects { } اور apply from کی جگہ لیتا ہے۔ Convention Plugins پر سوئچ کرنے سے ماڈیول کا build.gradle 10-15 لائنوں تک کم ہو جاتا ہے۔
// build-logic/src/main/kotlin/AndroidLibraryConventionPlugin.kt
class AndroidLibraryConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
with(target) {
with(plugins) {
apply("com.android.library")
apply("org.jetbrains.kotlin.android")
}
extensions.configure<CommonExtension<*, *, *, *>> {
compileSdk = 35
defaultConfig { minSdk = 26 }
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
}
}
}
// module/build.gradle.kts — Convention Plugin کے بعد
plugins {
id("myapp.android.library")
}
dependencies {
implementation(project(":core:network"))
}
اکثر پوچھے گئے سوالات
Kotlin DSL (.gradle.kts) Google کی سرکاری تجویز ہے۔ جامد ٹائپنگ خرابیوں کو روکتی ہے، IDE آٹوکمپلیٹ فراہم کرتا ہے۔ Groovy (.gradle) سپورٹ کیا جاتا ہے، لیکن Gradle اور AGP کی نئی خصوصیات بنیادی طور پر Kotlin DSL پر ٹیسٹ کی جاتی ہیں۔
namespace جنریٹڈ کلاسز (R.java، BuildConfig) کے لیے پیکیج کی وضاحت کرتا ہے۔ پہلے namespace AndroidManifest.xml میں سیٹ کیا جاتا تھا۔ AGP 7+ سے شروع کرتے ہوئے، namespace صرف build.gradle میں بتایا جاتا ہے۔ قدر applicationId سے ملنی چاہیے (یا اگر applicationIdSuffix استعمال ہوتا ہے تو مختلف ہو سکتی ہے)۔
Gradle Configuration Cache (org.gradle.configuration-cache=true) کو فعال کریں، Build Cache (org.gradle.caching=true) استعمال کریں، kapt کی بجائے KSP پر جائیں، ملٹی ماڈیول پروجیکٹ کو تقسیم کریں اور Convention Plugins استعمال کریں۔ نیز غیر ضروری product flavors کو بند کریں: ڈیبگ میں صرف ایک flavor بنائیں۔
implementation: انحصار صرف ماڈیول کے اندر دکھائی دیتا ہے۔ منحصر ماڈیولز کو منتقلی کلاسز تک رسائی نہیں ملتی۔ api: انحصار بیرونی طور پر ظاہر کیا جاتا ہے۔ api استعمال کریں جب انحصار کی ٹائپ ماڈیول کے عوامی API میں استعمال ہوتی ہیں (مثال کے طور پر، Retrofit OkHttp ٹائپ برآمد کرتا ہے)۔ implementation بلڈ کو تیز کرتا ہے — Gradle implementation انحصار تبدیل ہونے پر منحصر ماڈیولز کو دوبارہ نہیں بناتا۔
build.gradle Android کی مخصوص فائل ہے۔ iOS کے لیے Xcode project (.xcodeproj) اور Swift Package Manager (Package.swift) استعمال کیا جاتا ہے۔ تاہم، کراس پلیٹ فارم ٹولز (Kotlin Multiplatform, Flutter, React Native) موجود ہیں جہاں build.gradle Android حصہ بنانے کے لیے استعمال ہوتا ہے۔ KMP میں، build.gradle Android ہدف کو کنفیگر کرتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں