compileSdkVersion — ایپلیکیشن کو کمپائل کرتے وقت استعمال ہونے والا Android SDK ورژن۔ یہ پیرامیٹر build.gradle میں مخصوص کیا جاتا ہے اور یہ طے کرتا ہے کہ ڈیولپر کے لیے بلڈ کے وقت کون سی APIs دستیاب ہیں: ایک مخصوص API Level سے کلاسز، طریقے، مستقل اور انٹرفیس۔ targetSdkVersion کے برعکس، compileSdkVersion رن ٹائم رویے کو متاثر نہیں کرتا — Android کی رویاتی تبدیلیاں اس پیرامیٹر پر منحصر نہیں ہوتیں۔ Android Developers کے مطابق، compileSdk کم از کم targetSdk کے برابر ہونا چاہیے، اور مثالی طور پر تازہ ترین مستحکم API Level کے برابر ہونا چاہیے۔
اہم نکات
compileSdkVersion build.gradle میں ایک عددی پیرامیٹر ہے جو بتاتا ہے کہ کوڈ کو Android SDK کے کس ورژن کے خلاف کمپائل کرنا ہے۔ جب آپ android.* یا androidx.* سے کلاسز استعمال کرتے ہوئے کوڈ لکھتے ہیں تو کمپائلر ان کا موازنہ مخصوص compileSdk ورژن میں دستیاب APIs سے کرتا ہے۔ اگر کوئی طریقہ API 36 میں متعارف کرایا گیا تھا اور compileSdk = 35 ہے تو کوڈ کمپائل نہیں ہوگا۔ اگر compileSdk = 36 ہے تو کوڈ کمپائل ہوگا، لیکن API 35 والے آلے پر بغیر جانچ کے اس طریقے کو کال کرنا کریش کا سبب بنے گا۔
compileSdkVersion Android Studio میں SDK Manager کے ذریعے نصب کردہ Android SDK Platform سے لوڈ ہوتا ہے۔ ہر API Level کا اپنا پلیٹ فارم ہوتا ہے: android-21، android-29، android-34، android-35، android-36۔ پلیٹ فارم میں android.jar ہوتا ہے — کلاسز، طریقوں اور مستقلات کا ایک سیٹ جو Kotlin/Java کمپائلر استعمال کرتا ہے۔ اگر پلیٹ فارم نصب نہیں ہے تو Gradle پہلے بلڈ پر sdkmanager کے ذریعے خود بخود ڈاؤن لوڈ کرے گا۔
AGP (Android Gradle Plugin) ورژن 8.7+ Kotlin DSL میں android- سابقہ کے بغیر compileSdk = 36 کے ذریعے compileSdk کو عدد کے طور پر بتانے کی سفارش کرتا ہے۔ compileSdk کو Groovy DSL میں compileSdkVersion 36 کے ذریعے یا پری ریلیز SDK ورژنز (ڈیولپر پیش نظارہ) کے لیے compileSdkPreview کے ذریعے بھی سیٹ کیا جا سکتا ہے۔ compileSdkPreview سرکاری ریلیز سے پہلے آنے والی API Levels کی جانچ کے لیے استعمال ہوتا ہے۔
// build.gradle.kts — compileSdkVersion ترتیب
android {
namespace = "com.example.myapp"
// compileSdk = 36 — تازہ ترین مستحکم API Level (Android 16)
compileSdk = 36
defaultConfig {
applicationId = "com.example.myapp"
minSdk = 26
targetSdk = 36
versionCode = 1
versionName = "1.0.0"
}
}
// متبادل: پیش نظارہ ورژنز کے لیے compileSdkPreview
// compileSdkPreview = "Baklava"مثال میں، compileSdk = 36 تمام Android 16 (Baklava) APIs تک رسائی فراہم کرتا ہے۔ Android SDK Platform 36 SDK Manager میں نصب ہونا چاہیے۔ "Baklava" نام کے ساتھ compileSdkPreview سرکاری پلیٹ فارم ریلیز سے پہلے غیر مستحکم APIs کی جانچ کے لیے استعمال کیا جا سکتا ہے۔ ریلیز کے بعد، پیش نظارہ کو مستحکم compileSdk = 36 سے تبدیل کر دیا جاتا ہے۔
build.gradle میں تین API Level پیرامیٹرز — compileSdkVersion، targetSdkVersion اور minSdkVersion — اکثر الجھ جاتے ہیں۔ ہر ایک مطابقت کے مختلف پہلو کے لیے ذمہ دار ہے، اور ان کی قدروں کو compileSdk >= targetSdk >= minSdk کے اصول پر عمل کرنا چاہیے۔ minSdk نچلی حد ہے: اس سے نیچے کے آلات ایپلیکیشن نہیں دیکھیں گے۔ targetSdk جانچ کا نقطہ ہے: رویاتی تبدیلیاں اس سطح تک فعال ہوتی ہیں۔ compileSdk چھت ہے: اس سطح سے اوپر کی APIs کمپائلر کے لیے دستیاب نہیں ہیں۔
اہم عملی اصول: compileSdk کو کسی آلے کی جانچ کے بغیر بڑھایا جا سکتا ہے۔ یہ ایک محفوظ عمل ہے جو صرف کمپائلر کو android.jar کا نیا ورژن فراہم کرتا ہے۔ واحد خطرہ فرسودہ APIs ہیں جو نئے پلیٹ فارم ورژن میں ہٹا دیے جا سکتے ہیں، لیکن یہ کمپائل وقت پر پتہ چل جاتا ہے اور آسانی سے ٹھیک ہو جاتا ہے۔ دوسری طرف، targetSdk بڑھانے کے لیے مکمل QA سائیکل کی ضرورت ہوتی ہے۔
| پیرامیٹر | دائرہ کار | رن ٹائم کو متاثر کرتا ہے | جانچ درکار ہے |
|---|---|---|---|
| compileSdkVersion | کمپائلیشن | نہیں | نہیں (صرف فرسودہ کی جانچ) |
| targetSdkVersion | رن ٹائم | ہاں — رویاتی تبدیلیاں | ہاں — مکمل QA سائیکل |
| minSdkVersion | انسٹالیشن | نہیں | نہیں (لیکن کوریج کو متاثر کرتا ہے) |
compileSdk targetSdk سے زیادہ کیوں ہو سکتا ہے؟ تصور کریں کہ Android 16 (API 36) نئی APIs کے ساتھ جاری کیا گیا جو آپ کوڈ میں استعمال کرنا چاہتے ہیں، لیکن آپ نے API 36 کی رویاتی تبدیلیوں کی جانچ نہیں کی۔ آپ compileSdk = 36 (نئی APIs دستیاب)، targetSdk = 35 (API 36 کی رویاتی تبدیلیاں غیر فعال) سیٹ کرتے ہیں۔ کوڈ کمپائل ہوگا، SDK_INT جانچوں کے تحت نئے طریقے استعمال کرے گا، اور API 36 کی رویاتی تبدیلیاں ایپلیکیشن کو نہیں توڑیں گی کیونکہ targetSdk = 35 ہے۔
compileSdk = 36, targetSdk = 36, minSdk = 26 — تازہ ترین APIs اور رویاتی تبدیلیوں کے ساتھ مکمل مطابقت، 85% آلات کا احاطہ۔ compileSdk = 36, targetSdk = 34, minSdk = 26 — نئی APIs دستیاب، رویاتی تبدیلیاں صرف API 34 تک۔ compileSdk = 35, targetSdk = 36 — غلط: compileSdk targetSdk سے کم ہے، API 36 دستیاب نہیں جبکہ 36 کی رویاتی تبدیلیاں فعال ہیں۔
compileSdkVersion کو اپ ڈیٹ کرنا Android پروجیکٹ میں سب سے آسان اور محفوظ عملوں میں سے ایک ہے۔ targetSdk کے برعکس، اسے رویاتی تبدیلیوں کی وسیع جانچ کی ضرورت نہیں ہے۔ تاہم، کمپائلیشن کی غلطیوں اور فرسودہ انتباہات سے بچنے کے لیے کچھ اقدامات پر عمل کرنا ضروری ہے۔
مرحلہ 1 — Android Studio میں SDK Manager کے ذریعے نیا پلیٹ فارم انسٹال کریں: Tools → SDK Manager → SDK Platforms → نیا API Level منتخب کریں۔ اگر آپ پلیٹ فارم انسٹال نہیں کرتے ہیں تو Gradle خود بخود ڈاؤن لوڈ کرنے کی کوشش کرے گا، لیکن اس سے پہلا بلڈ سست ہو سکتا ہے۔ مرحلہ 2 — build.gradle میں compileSdk کو نئی قدر میں تبدیل کریں۔ مرحلہ 3 — بلڈ کریں (Build → Make Project) اور کسی بھی کمپائلیشن غلطی کو ٹھیک کریں۔
مرحلہ 4 — فرسودہ APIs کی جانچ کریں۔ compileSdk بڑھانے کے بعد، کچھ طریقے "removed in API X" نوٹ کے ساتھ @Deprecated کے طور پر نشان زد ہو سکتے ہیں۔ Android Studio انہیں اسٹرائیک تھرو کے ساتھ نمایاں کرتا ہے اور انتباہ دکھاتا ہے۔ فرسودہ کالز کو نئے متبادل سے تبدیل کریں۔ اگر متبادل کے لیے minSdk سے زیادہ API Level درکار ہے تو رن ٹائم جانچ شامل کریں۔ مرحلہ 5 — انحصار چیک کریں: کچھ لائبریریاں compileSdk کے مخصوص ورژن کی متقاضی ہو سکتی ہیں۔ AGP 8.7+ compileSdk = 36 تجویز کرتا ہے۔
// compileSdk بڑھانے کے بعد: فرسودہ APIs کو تبدیل کرنا
import android.os.Build
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES
import android.os.Process
import android.app.ActivityManager
class CompileSdkMigration {
// پہلے: فرسودہ طریقہ (نئی API میں ہٹایا جا سکتا ہے)
@Suppress("DEPRECATION")
fun getMemoryClassOld(context: android.content.Context): Int {
val am = context.getSystemService(
android.content.Context.ACTIVITY_SERVICE
) as ActivityManager
return am.memoryClass // API 36 میں فرسودہ ہو سکتا ہے
}
// بعد میں: نیا متبادل (اگر دستیاب ہو)
fun getMemoryClassNew(context: android.content.Context): Int {
if (VERSION.SDK_INT >= VERSION_CODES.BAKLAVA) {
// compileSdk 36 سے نئی API
val am = context.getSystemService(
android.content.Context.ACTIVITY_SERVICE
) as ActivityManager
return am.getMemoryClassSafe() // نئی API کی مثال
}
@Suppress("DEPRECATION")
return context.getSystemService(
android.content.Context.ACTIVITY_SERVICE
) as ActivityManager
.memoryClass
}
}CompileSdkMigration کلاس درست منتقلی کا نمونہ دکھاتی ہے۔ پرانا طریقہ memoryClass نئی API میں ہٹایا جا سکتا ہے — کمپائلر غلطی دے گا۔ نیا متبادل getMemoryClassSafe صرف API 36+ پر دستیاب ہے، لہذا اسے SDK_INT >= BAKLAVA جانچ کے تحت کال کیا جاتا ہے۔ پرانے آلات کے لیے @Suppress("DEPRECATION") کے ساتھ فال بیک استعمال کیا جاتا ہے۔
نئی APIs جو compileSdkVersion بڑھانے سے دستیاب ہوتی ہیں، براہ راست نہیں بلائی جا سکتیں اگر minSdkVersion اس API Level سے کم ہو۔ رن ٹائم جانچ کے بغیر، ایپلیکیشن پرانے آلات پر AbstractMethodError، NoSuchMethodError یا VerifyError کے ساتھ کریش ہو جائے گی۔ بنیادی حفاظتی طریقہ کار Build.VERSION.SDK_INT کو جانچنا، صرف اس وقت نئی API کو کال کرنا جب API Level کافی ہو، اور پرانے ورژنز کے لیے فال بیک فراہم کرنا ہے۔
AndroidX بہت سی نئی APIs کے لیے بیک پورٹ فراہم کرتا ہے، جو کم compileSdk کے ساتھ بھی جدید طریقوں کے استعمال کی اجازت دیتا ہے۔ مثال کے طور پر، androidx.activity:activity-ktx:1.9.3 سے Activity Result API API 14 سے شروع ہونے والے تمام Android ورژنز پر کام کرتا ہے۔ AndroidX سے NotificationCompat پرانی APIs پر جدید اطلاعات کو قابل بناتا ہے۔ PhotoPicker API 34+ سے شروع ہو کر ActivityResultContracts.PickVisualMedia کے ذریعے دستیاب ہے۔
// compileSdk 36 اور minSdk 26 کے ساتھ نئی API کا محفوظ کال
import android.os.Build
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES
import android.graphics.Color
class NewApiHelper {
// API 36+: رنگ کے ساتھ کام کرنے کا نیا طریقہ
fun formatColor(colorInt: Int): String {
if (VERSION.SDK_INT >= VERSION_CODES.BAKLAVA) {
// compileSdk 36 سے نئی API — API 36+ درکار ہے
return Color.toArgbHexString(colorInt)
}
// فال بیک: پرانی APIs کے لیے دستی فارمیٹنگ
return String.format(
"#%08X", (0xFFFFFFFF toLong() and colorInt.toLong())
)
}
// AndroidX: بیک پورٹ درکار نہیں — SDK_INT جانچ
fun isEdgeToEdgeAvailable(): Boolean {
return VERSION.SDK_INT >= VERSION_CODES.VANILLA_ICE_CREAM
}
}
// Activity میں استعمال
class ColorActivity : android.app.Activity() {
override fun onCreate(savedInstanceState: android.os.Bundle?) {
super.onCreate(savedInstanceState)
val helper = NewApiHelper()
val colorStr = helper.formatColor(0xFF6200EE)
println("Color: $colorStr")
}
}NewApiHelper کلاس پرانے ورژنز کے لیے فال بیک فارمیٹنگ کے ساتھ نئی API Color.toArgbHexString (فرضی API 36) کے محفوظ کال کا مظاہرہ کرتی ہے۔ کلیدی اصول: compileSdk کوڈ میں نئے طریقوں کو کال کرنے کی رسائی دیتا ہے، لیکن رن ٹائم SDK_INT جانچ پرانے آلات پر کریش سے بچاتی ہے۔ SDK_INT جانچ کے بغیر، minSdk 26 اور compileSdk 36 والی ایپ Android 8-15 پر کریش ہو جائے گی۔
Android Gradle Plugin (AGP) Android ایپلیکیشنز کے لیے بنیادی بلڈ ٹول ہے۔ AGP کا ہر ورژن compileSdkVersion کی ایک مخصوص رینج کو سپورٹ کرتا ہے۔ AGP 8.7.x (2026 میں جاری) کو compileSdk >= 34 درکار ہے اور compileSdk = 36 تجویز کرتا ہے۔ AGP 8.5.x compileSdk 33-35 کو سپورٹ کرتا ہے۔ اگر compileSdk AGP کے لیے کم از کم سے کم ہو تو بلڈ غلطی کے ساتھ ناکام ہو جائے گا: "The SDK platform (X) is not supported by this version of the Android Gradle Plugin"۔
NDK (Native Development Kit) بھی compileSdkVersion سے منسلک ہے۔ اگر آپ کا پروجیکٹ NDK کے ذریعے C/C++ میں مقامی کوڈ استعمال کرتا ہے تو compileSdk ہیڈر فائلز اور لائبریریوں کے ورژن کا تعین کرتا ہے۔ NDK r27+ compileSdk 36 تجویز کرتا ہے۔ .so فائلوں والی لائبریریوں کے لیے، compileSdk Application.mk میں APP_MIN_SDK_VERSION کے ذریعے مقامی کوڈ کے لیے کم از کم API Level کو متاثر کرتا ہے۔
| AGP ورژن | کم از کم compileSdk | تجویز کردہ compileSdk | نوٹس |
|---|---|---|---|
| 8.3.x | 33 | 34 | Android 14 سپورٹ |
| 8.5.x | 33 | 35 | Android 15، R8 مکمل موڈ |
| 8.7.x | 34 | 36 | Android 16، Kotlin 2.1 |
| 8.9.x | 35 | 36 | غیر منتقلی R کلاسز |
Gradle (7.6+) اور Kotlin (2.0+) بھی compileSdk مطابقت کو متاثر کرتے ہیں۔ AGP 8.7+ کے لیے Gradle 8.9+ اور Kotlin 2.0+ درکار ہے۔ compileSdk بڑھاتے وقت AGP، Gradle اور Kotlin کو تازہ ترین مستحکم ورژنز میں اپ ڈیٹ کرنے کی سفارش کی جاتی ہے۔ سرکاری Android Gradle Plugin مطابقت جدول میں مطابقت چیک کریں۔
compileSdkVersion بڑھانے پر مسائل تین زمروں میں آتے ہیں: کمپائلیشن غلطیاں، فرسودہ انتباہات اور رن ٹائم عدم مطابقت۔ کمپائلیشن غلطیاں — طریقے API سے ہٹا دیے جاتے ہیں اور کوڈ کمپائل نہیں ہوتا۔ فرسودہ انتباہات — طریقے @Deprecated نشان زد ہوتے ہیں، کوڈ انتباہات کے ساتھ کمپائل ہوتا ہے۔ رن ٹائم عدم مطابقت — نئی APIs مخصوص فعالیت کے لیے ضروری ہوتی ہیں اور آلے پر API Level ناکافی ہونے پر غلطیاں پیدا کرتی ہیں۔
پہلا عام مسئلہ — "Cannot resolve symbol X"۔ اس کا مطلب ہے کہ کوئی کلاس یا طریقہ نئے SDK ورژن میں عوامی API سے ہٹا دیا گیا ہے۔ حل: نئے پلیٹ فارم میں کوئی متبادل تلاش کریں یا AndroidX مساوی استعمال کریں۔ مثال کے طور پر، AsyncTaskLoader کلاس API 28 میں فرسودہ ہوئی اور نئے ورژنز میں عوامی API سے ہٹا دی گئی۔ متبادلات میں Kotlin Coroutines یا WorkManager شامل ہیں۔
دوسرا مسئلہ — طریقہ کے دستخط میں تبدیلی۔ نئے API ورژن میں، کوئی طریقہ اپنے پیرامیٹرز کی تعداد یا اقسام تبدیل کر سکتا ہے۔ Kotlin/Java کمپائلر غلطی دیتا ہے: "None of the following functions can be called with the arguments supplied"۔ حل: نئے دستخط سے ملنے کے لیے طریقہ کال کو اپ ڈیٹ کریں یا پرانے آلات کے لیے پرانے دستخط کال کے ساتھ SDK_INT جانچ شامل کریں۔
// compileSdk بڑھانے پر مسائل کا حل
import android.os.Build
import android.os.Build.VERSION
import android.os.Build.VERSION_CODES
import android.content.pm.PackageManager
class CompileSdkProblemFixer {
// مسئلہ: طریقہ hasSystemFeature نے API 36 میں دستخط تبدیل کر دیا
fun hasCamera(pm: PackageManager): Boolean {
return if (VERSION.SDK_INT >= VERSION_CODES.BAKLAVA) {
// نیا دستخط: hasSystemFeature(String, FeatureType)
pm.hasSystemFeature(
PackageManager.FEATURE_CAMERA,
PackageManager.FEATURE_TYPE_BACK
)
} else {
// پرانا دستخط: hasSystemFeature(String)
@Suppress("DEPRECATION")
pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)
}
}
// مسئلہ: کلاس ہٹا دی گئی، AndroidX مساوی استعمال کریں
fun loadFragment(manager: androidx.fragment.app.FragmentManager) {
// android.app.FragmentManager (ہٹا دیا گیا) کے بجائے استعمال کریں
// androidx.fragment.app.FragmentManager
val fragment = CustomFragment()
manager.beginTransaction()
.replace(android.R.id.content, fragment)
.commit()
}
}CompileSdkProblemFixer کلاس عام مسائل حل کرتی ہے: hasSystemFeature کے تبدیل شدہ دستخط (API 36 میں فرضی تبدیلی) طریقہ کے صحیح ورژن کو کال کرنے والی SDK_INT جانچ کے ذریعے سنبھالے جاتے ہیں۔ ہٹائی گئی کلاس android.app.FragmentManager کو اس کے AndroidX مساوی سے تبدیل کیا جاتا ہے۔ پرانی کالز کے لیے جہاں کوئی متبادل نہیں ہے، @Suppress("DEPRECATION") اسے برقرار رکھنے کی وجہ بتانے والے تبصرے کے ساتھ استعمال کیا جاتا ہے۔
اکثر پوچھے گئے سوالات
compileSdkVersion کوڈ کو کمپائل کرنے کے لیے استعمال ہونے والا Android SDK ورژن ہے۔ یہ بلڈ کے وقت ڈیولپر کے لیے دستیاب APIs کا تعین کرتا ہے۔ compileSdk رن ٹائم رویے کو متاثر نہیں کرتا — رویاتی تبدیلیاں targetSdkVersion کے ذریعے منظم کی جاتی ہیں۔ compileSdk >= targetSdk اور >= minSdk ہونا چاہیے۔ compileSdk بڑھانا نئی APIs تک رسائی فراہم کرتا ہے لیکن فرسودہ طریقوں اور AGP مطابقت کی جانچ درکار ہے۔
compileSdkVersion کمپائلیشن کو کنٹرول کرتا ہے: کوڈ میں کال کرنے کے لیے کون سی APIs دستیاب ہیں۔ targetSdkVersion رن ٹائم رویے کو کنٹرول کرتا ہے: کون سی رویاتی تبدیلیاں لاگو ہوتی ہیں۔ compileSdk targetSdk سے زیادہ ہو سکتا ہے — یہ نئے ورژن کی رویاتی تبدیلیوں کو فعال کیے بغیر کوڈ میں نئی APIs استعمال کرنے کی اجازت دیتا ہے۔ compileSdk ہمیشہ >= targetSdk ہوتا ہے۔ minSdk سب سے کم پیرامیٹر، targetSdk درمیانی، compileSdk سب سے زیادہ ہے۔
2026 میں، compileSdk = 36 (Android 16، کوڈ نام Baklava) تجویز کیا جاتا ہے۔ یہ Android کے تازہ ترین ورژن کی تمام APIs تک رسائی فراہم کرتا ہے۔ لائبریریوں اور SDKs کے لیے، آپ صارفین کو اپ گریڈ پر مجبور کرنے سے بچنے کے لیے compileSdk = 35 یا 34 استعمال کر سکتے ہیں۔ compileSdk SDK Manager کے ذریعے نصب اور AGP ورژن کے ذریعے تعاون یافتہ ہونا چاہیے۔ AGP 8.7+ کو compileSdk >= 34 درکار ہے۔
compileSdk بڑھانے کے بعد غلطیاں عام طور پر ہٹائی گئی APIs کی وجہ سے ہوتی ہیں: @Deprecated نشان زد اور ہٹائی گئی کلاسز یا طریقے۔ حل: نئے SDK میں کوئی متبادل تلاش کریں، AndroidX مساوی استعمال کریں، یا @SuppressLint شامل کریں۔ دوسری وجہ مینی فیسٹ میں نئی لازمی اجازتیں ہیں۔ تیسری طریقہ کے دستخط میں تبدیلی ہے: دستاویزات چیک کریں اور SDK_INT جانچ کے ساتھ کالز کو نئے دستخط میں اپ ڈیٹ کریں۔
compileSdkVersion کو targetSdk سے آزادانہ طور پر بڑھایا جا سکتا ہے۔ targetSdk = 34 کے ساتھ compileSdk = 36 کی تشکیل درست ہے: کوڈ نئی APIs کے ساتھ کمپائل ہوتا ہے، لیکن API 35-36 کی رویاتی تبدیلیاں فعال نہیں ہوتیں۔ compileSdk بڑھانا محفوظ ہے اور اسے QA کی ضرورت نہیں ہے۔ targetSdk بڑھانے کے لیے رویاتی تبدیلیوں کے مکمل جانچ سائیکل کی ضرورت ہے۔ compileSdk کو تازہ ترین مستحکم API Level پر رکھنے کی سفارش کی جاتی ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں