compileSdkVersion — অ্যাপ্লিকেশন কম্পাইল করার সময় ব্যবহৃত Android SDK সংস্করণ। এই প্যারামিটারটি build.gradle-এ উল্লেখ করা হয় এবং নির্ধারণ করে যে বিল্ড সময়ে ডেভেলপারের জন্য কোন API উপলব্ধ: একটি নির্দিষ্ট API Level থেকে ক্লাস, মেথড, কনস্ট্যান্ট এবং ইন্টারফেস। targetSdkVersion-এর বিপরীতে, compileSdkVersion রানটাইম আচরণকে প্রভাবিত করে না — Android-এর behavioural changes এই প্যারামিটারের উপর নির্ভর করে না। Android Developers-এর মতে, compileSdk কমপক্ষে targetSdk-এর সমান হতে হবে, এবং আদর্শভাবে সর্বশেষ স্থিতিশীল API Level-এর সমান হওয়া উচিত।
মূল পয়েন্ট
compileSdkVersion build.gradle-এ একটি পূর্ণসংখ্যা প্যারামিটার যা নির্দিষ্ট করে কোন Android SDK সংস্করণের বিপরীতে কোড কম্পাইল করতে হবে।当你 android.* বা androidx.* থেকে ক্লাস ব্যবহার করে কোড লেখেন, কম্পাইলার সেগুলিকে নির্দিষ্ট compileSdk সংস্করণে উপলব্ধ API-র বিপরীতে পরীক্ষা করে। যদি কোনো মেথড API 36-এ প্রবর্তিত হয় এবং compileSdk = 35 হয়, তবে কোড কম্পাইল হবে না। যদি compileSdk = 36 হয়, তবে কোড কম্পাইল হবে, কিন্তু API 35 সহ ডিভাইসে পরীক্ষা ছাড়া সেই মেথড কল করলে ক্র্যাশ হবে।
compileSdkVersion Android SDK Platform থেকে লোড হয় যা Android Studio-তে SDK Manager-এর মাধ্যমে ইনস্টল করা হয়। প্রতিটি 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 Level পরীক্ষার জন্য ব্যবহৃত হয়।
// 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) API-তে অ্যাক্সেস প্রদান করে। Android SDK Platform 36 SDK Manager-এ ইনস্টল করা আবশ্যক। "Baklava" নামের সাথে compileSdkPreview অফিসিয়াল প্ল্যাটফর্ম রিলিজের আগে অস্থির API পরীক্ষার জন্য ব্যবহার করা যেতে পারে। রিলিজের পরে, প্রিভিউটি স্থিতিশীল compileSdk = 36 দিয়ে প্রতিস্থাপিত হয়।
build.gradle-এ তিনটি API Level প্যারামিটার — compileSdkVersion, targetSdkVersion এবং minSdkVersion — প্রায়ই বিভ্রান্তিকর। প্রতিটি সামঞ্জস্যের একটি ভিন্ন দিকের জন্য দায়ী, এবং তাদের মান compileSdk >= targetSdk >= minSdk নিয়ম অনুসরণ করতে হবে। minSdk নিম্ন সীমা: এর নীচের ডিভাইসগুলি অ্যাপ্লিকেশন দেখতে পাবে না। targetSdk পরীক্ষার বিন্দু: এই স্তর পর্যন্ত behavioural changes সক্ষম হয়। compileSdk হল সিলিং: এই স্তরের উপরের API কম্পাইলারের জন্য অনুপলব্ধ।
মূল ব্যবহারিক নিয়ম: compileSdk কোনো ডিভাইস পরীক্ষা ছাড়াই বাড়ানো যেতে পারে। এটি একটি নিরাপদ অপারেশন যা কেবল কম্পাইলারকে android.jar-এর একটি নতুন সংস্করণ সরবরাহ করে। একমাত্র ঝুঁকি হল deprecated API যা নতুন প্ল্যাটফর্ম সংস্করণে সরানো হতে পারে, কিন্তু এটি কম্পাইল সময়ে সনাক্ত হয় এবং সহজেই ঠিক করা যায়। অন্যদিকে, targetSdk বাড়ানোর জন্য সম্পূর্ণ QA চক্র প্রয়োজন।
| প্যারামিটার | পরিধি | রানটাইম প্রভাবিত করে | পরীক্ষা প্রয়োজন |
|---|---|---|---|
| compileSdkVersion | কম্পাইলেশন | না | না (শুধু deprecated পরীক্ষা) |
| targetSdkVersion | রানটাইম | হ্যাঁ — behavioural changes | হ্যাঁ — সম্পূর্ণ QA চক্র |
| minSdkVersion | ইনস্টলেশন | না | না (তবে কভারেজ প্রভাবিত করে) |
compileSdk কেন targetSdk-এর চেয়ে বেশি হতে পারে? কল্পনা করুন Android 16 (API 36) নতুন API নিয়ে প্রকাশিত হয়েছে যা আপনি কোডে ব্যবহার করতে চান, কিন্তু আপনি এখনও API 36-এর behavioural changes পরীক্ষা করেননি। আপনি compileSdk = 36 (নতুন API উপলব্ধ), targetSdk = 35 (API 36-এর behavioural changes নিষ্ক্রিয়) সেট করেন। কোড কম্পাইল হবে, SDK_INT পরীক্ষার অধীনে নতুন মেথড ব্যবহার করবে, এবং API 36-এর behavioural changes অ্যাপ্লিকেশন ভাঙবে না কারণ targetSdk = 35।
compileSdk = 36, targetSdk = 36, minSdk = 26 — সর্বশেষ API এবং behavioural changes-এর সাথে সম্পূর্ণ সামঞ্জস্য, 85% ডিভাইস কভার করে। compileSdk = 36, targetSdk = 34, minSdk = 26 — নতুন API উপলব্ধ, behavioural changes শুধু API 34 পর্যন্ত। compileSdk = 35, targetSdk = 36 — ভুল: compileSdk targetSdk-এর চেয়ে কম, API 36 অনুপলব্ধ যখন 36-এর behavioural changes সক্রিয়।
compileSdkVersion আপডেট করা Android প্রকল্পে সবচেয়ে সহজ এবং নিরাপদ অপারেশনগুলির মধ্যে একটি। targetSdk-এর বিপরীতে, এটির behavioural changes-এর ব্যাপক পরীক্ষার প্রয়োজন নেই। তবে, কম্পাইলেশন ত্রুটি এবং deprecated সতর্কতা এড়াতে কয়েকটি ধাপ অনুসরণ করতে হবে।
ধাপ 1 — নতুন প্ল্যাটফর্ম ইনস্টল করুন Android Studio-তে SDK Manager-এর মাধ্যমে: Tools → SDK Manager → SDK Platforms → নতুন API Level নির্বাচন করুন। আপনি প্ল্যাটফর্ম ইনস্টল না করলে, Gradle এটি স্বয়ংক্রিয়ভাবে ডাউনলোড করার চেষ্টা করবে, তবে এটি প্রথম বিল্ড ধীর করতে পারে। ধাপ 2 — build.gradle-এ compileSdk নতুন মানে পরিবর্তন করুন। ধাপ 3 — বিল্ড করুন (Build → Make Project) এবং কোনো কম্পাইলেশন ত্রুটি ঠিক করুন।
ধাপ 4 — deprecated API পরীক্ষা করুন। compileSdk বাড়ানোর পরে, কিছু মেথড @Deprecated হিসাবে চিহ্নিত হতে পারে যার সাথে "removed in API X" নোট থাকে। Android Studio সেগুলিকে স্ট্রাইকথ্রু দিয়ে হাইলাইট করে এবং সতর্কতা দেখায়। deprecated কলগুলি নতুন বিকল্প দিয়ে প্রতিস্থাপন করুন। যদি বিকল্পটির জন্য minSdk-এর চেয়ে বেশি API Level প্রয়োজন হয়, তবে রানটাইম পরীক্ষা যোগ করুন। ধাপ 5 — নির্ভরতা পরীক্ষা করুন: কিছু লাইব্রেরির compileSdk-এর একটি নির্দিষ্ট সংস্করণের প্রয়োজন হতে পারে। AGP 8.7+ compileSdk = 36 সুপারিশ করে।
// compileSdk বাড়ানোর পর: deprecated API প্রতিস্থাপন
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 {
// আগে: deprecated মেথড (নতুন 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-এ deprecated হতে পারে
}
// পরে: নতুন বিকল্প (যদি উপলব্ধ থাকে)
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") সহ ফলব্যাক ব্যবহার করা হয়।
নতুন API যা compileSdkVersion বাড়ানোর ফলে উপলব্ধ হয়, সরাসরি কল করা যাবে না যদি minSdkVersion সেই API Level-এর চেয়ে কম হয়। রানটাইম পরীক্ষা ছাড়া, অ্যাপ্লিকেশন পুরানো ডিভাইসে AbstractMethodError, NoSuchMethodError বা VerifyError সহ ক্র্যাশ হবে। প্রাথমিক সুরক্ষা প্রক্রিয়া হল Build.VERSION.SDK_INT পরীক্ষা করা, শুধুমাত্র যখন API Level পর্যাপ্ত তখন নতুন API কল করা, এবং পুরানো সংস্করণের জন্য ফলব্যাক প্রদান করা।
AndroidX অনেক নতুন API-র জন্য ব্যাকপোর্ট প্রদান করে, যা কম compileSdk-এর সাথেও আধুনিক মেথড ব্যবহার করতে দেয়। উদাহরণস্বরূপ, androidx.activity:activity-ktx:1.9.3 থেকে Activity Result API API 14 থেকে শুরু হওয়া সমস্ত Android সংস্করণে কাজ করে। AndroidX থেকে NotificationCompat পুরানো API-তে আধুনিক বিজ্ঞপ্তি সক্ষম করে। 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)
}
// ফলব্যাক: পুরানো API-র জন্য ম্যানুয়াল ফর্ম্যাটিং
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 বাড়ানোর সময় সমস্যা তিনটি বিভাগে পড়ে: কম্পাইলেশন ত্রুটি, deprecated সতর্কতা এবং রানটাইম অসামঞ্জস্যতা। কম্পাইলেশন ত্রুটি — মেথড API থেকে সরানো হয় এবং কোড কম্পাইল হয় না। Deprecated সতর্কতা — মেথড @Deprecated চিহ্নিত হয়, কোড সতর্কতা সহ কম্পাইল হয়। রানটাইম অসামঞ্জস্যতা — নতুন API নির্দিষ্ট কার্যকারিতার জন্য প্রয়োজনীয় এবং ডিভাইসে API Level অপর্যাপ্ত হলে ত্রুটি সৃষ্টি করে।
প্রথম সাধারণ সমস্যা — "Cannot resolve symbol X"। এর অর্থ একটি ক্লাস বা মেথড নতুন SDK সংস্করণে পাবলিক API থেকে সরানো হয়েছে। সমাধান: নতুন প্ল্যাটফর্মে একটি বিকল্প খুঁজুন বা AndroidX সমতুল্য ব্যবহার করুন। উদাহরণস্বরূপ, AsyncTaskLoader ক্লাসটি API 28-এ deprecated হয়েছিল এবং নতুন সংস্করণে পাবলিক 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 সংস্করণ। এটি নির্ধারণ করে বিল্ড সময়ে ডেভেলপারের জন্য কোন API উপলব্ধ। compileSdk রানটাইম আচরণ প্রভাবিত করে না — behavioural changes targetSdkVersion দ্বারা পরিচালিত হয়। compileSdk >= targetSdk এবং >= minSdk হতে হবে। compileSdk বাড়ানো নতুন API-তে অ্যাক্সেস দেয় কিন্তু deprecated মেথড এবং AGP সামঞ্জস্য পরীক্ষা প্রয়োজন।
compileSdkVersion কম্পাইলেশন নিয়ন্ত্রণ করে: কোডে কল করার জন্য কোন API উপলব্ধ। targetSdkVersion রানটাইম আচরণ নিয়ন্ত্রণ করে: কোন behavioural changes প্রয়োগ করা হয়। compileSdk targetSdk-এর চেয়ে বেশি হতে পারে — এটি নতুন সংস্করণের behavioural changes সক্রিয় না করে কোডে নতুন API ব্যবহার করতে দেয়। compileSdk সর্বদা >= targetSdk। minSdk সর্বনিম্ন প্যারামিটার, targetSdk মধ্যম, compileSdk সর্বোচ্চ।
2026 সালে, compileSdk = 36 (Android 16, কোডনেম Baklava) সুপারিশ করা হয়। এটি সর্বশেষ Android সংস্করণের সমস্ত API-তে অ্যাক্সেস প্রদান করে। লাইব্রেরি এবং SDK-র জন্য, আপনি ভোক্তাদের আপগ্রেড করতে বাধ্য না করতে compileSdk = 35 বা 34 ব্যবহার করতে পারেন। compileSdk SDK Manager-এর মাধ্যমে ইনস্টল করা এবং AGP সংস্করণ দ্বারা সমর্থিত হতে হবে। AGP 8.7+-এর জন্য compileSdk >= 34 প্রয়োজন।
compileSdk বাড়ানোর পর ত্রুটিগুলি সাধারণত সরানো API-র কারণে হয়: @Deprecated চিহ্নিত এবং সরানো ক্লাস বা মেথড। সমাধান: নতুন SDK-তে একটি বিকল্প খুঁজুন, AndroidX সমতুল্য ব্যবহার করুন, বা @SuppressLint যোগ করুন। দ্বিতীয় কারণ ম্যানিফেস্টে নতুন বাধ্যতামূলক অনুমতি। তৃতীয় হল মেথড স্বাক্ষর পরিবর্তন: ডকুমেন্টেশন পরীক্ষা করুন এবং SDK_INT পরীক্ষা সহ কলগুলি নতুন স্বাক্ষরে আপডেট করুন।
compileSdkVersion targetSdk থেকে স্বাধীনভাবে বাড়ানো যেতে পারে। targetSdk = 34 সহ compileSdk = 36-এর কনফিগারেশন বৈধ: কোড নতুন API দিয়ে কম্পাইল হয়, কিন্তু API 35-36-এর behavioural changes সক্রিয় হয় না। compileSdk বাড়ানো নিরাপদ এবং QA-র প্রয়োজন নেই। targetSdk বাড়ানোর জন্য behavioural changes-এর সম্পূর্ণ পরীক্ষা চক্র প্রয়োজন। compileSdk সর্বশেষ স্থিতিশীল API Level-এ রাখার সুপারিশ করা হয়।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন