برنامه نویسی

minSdk در مقابل targetSdk در مقابل compileSdk

تفاوت بین minSdk، targetSdk و compileSdk در اسکریپت بیلد Gradle شما چیست؟

بیایید نگاهی به چه چیزی داشته باشیم minSdk، targetSdk و compileSdk واقعا به معنی در build.gradle اسکریپت

android {
    compileSdk 32
    defaultConfig {
        /*...*/
        minSdk 21        
        targetSdk 32        
        /*...*/ 
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  • mySdk – حداقل سطح API مورد نیاز برای اجرای برنامه چقدر است؟

  • targetSdk – برنامه در کدام سطح API طراحی و آزمایش شده است؟

  • compileSdk – کدام سطح API توسط Gradle برای کامپایل برنامه شما استفاده می شود؟

mySdk

اگر شما minSdk تنظیم شده است 21، برنامه شما روی هیچ نسخه اندرویدی که زیر سطح API 21 است قابل اجرا نیست. اگر نسخه اندروید (سطح API 20) برنامه شما را نصب کند، با این خطا مواجه می شوید.

نصب با موفقیت انجام نشد. برنامه نصب نشد: INSTALL_FAILED_OLDER_SDK

اگر نسخه اندروید گوشی با آن مطابقت نداشته باشد، فروشگاه Google Play از نصب برنامه نیز توسط کاربر جلوگیری می کند minSdk مورد نیاز برنامه

targetSdk

برنامه در سطح API > targetSdk اجرا می شود

اگر برنامه روی نسخه اندروید (سطح API) اجرا شود که بالاتر از آن است targetSdk، سیستم عامل اندروید سعی خواهد کرد رفتار سازگاری با عقب را اجرا کنید تا رفتار را مطابق با آن انجام دهید targetSdk سطح API.

به عنوان مثال، مجوز برنامه زمان اجرا در سطح API 23 معرفی شده است. قبل از سطح API 23، مجوز برنامه زمان اجرا مورد نیاز نیست.

اگر شما targetSdk تنظیم شده است 22 و برنامه شما بر روی نسخه اندروید (سطح API 23) اجرا می شود، سیستم عامل Android سعی می کند رفتار را مانند سطح API 22 مطابقت دهد. بنابراین، هیچ مجوز زمان اجرا درخواست نمی شود.

اگر شما targetSdk تنظیم شده است 23 و برنامه شما روی نسخه اندروید (سطح API 23 یا بالاتر) اجرا می شود، مجوز زمان اجرا درخواست می شود.

برنامه در سطح API < targetSdk اجرا می شود

در مورد برنامه ای که در نسخه اندروید (سطح API) اجرا می شود که < targetSdk? برنامه بر اساس آن نسخه اندروید (سطح API) رفتار می کند.

اگر شما targetSdk تنظیم شده است 23 و برنامه شما روی نسخه اندروید (سطح API 22) اجرا می شود، مجوز زمان اجرا درخواست نمی شود.

می توانید سعی کنید با این برنامه آزمایشی که مجوز زمان اجرا را درخواست می کند بازی کنید:

compileSdk

اگر برنامه شما از API استفاده می کند که در سطح 26 API معرفی شده است، شما compileSdk باید روی حداقل تنظیم شود 26. اگر آن را تنظیم کنید 25، کامپایل نمی شود.

با فرض minSdk است 21، احتمالاً شما نیز این هشدار/خطا را دریافت می کنید

تماس به سطح 26 API نیاز دارد (دقیقه فعلی 21 است): android.app.NotificationChannel()

همانطور که توسط Android Studio IDE توصیه شده است، می توانید با حاشیه نویسی عملکرد خود، اخطار/خطا را برطرف کنید

@RequiresApi(Build.VERSION_CODES.O)
private fun yourFunction() {
    /*...*/ 
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با این حال، اگر برنامه خود را در نسخه اندروید (< سطح API 26) اجرا کنید، خراب نمی‌شود، اما بی‌صدا از کار می‌افتد. شما متوجه پیام های خطا در logcat خواهید شد. بنابراین، من فکر می کنم اضافه کردن @RequiresApi() عمل بدی است اینجا.

کاری که باید انجام دهید این است که کد بالای برنامه اجرا شده در زیر سطح API 26 را مدیریت کنید.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    /* Code for API level >= 26 */
} else {
   /* code for API level >= 23 and < 26) */
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به عنوان مثال، کانال اعلان فقط برای سطح API 26 مورد نیاز است / موجود است. سپس، باید آن را با Build.VERSION_CODES.O.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

    val notificationChannel = NotificationChannel(
        notificationChannelId,
        "DemoWorker",
        NotificationManager.IMPORTANCE_DEFAULT,
    )

    val notificationManager: NotificationManager? =
        getSystemService(applicationContext, NotificationManager::class.java)

    notificationManager?.createNotificationChannel(notificationChannel)
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این کد از برنامه نمایشی مدیر کار در زیر گرفته شده است:

[Updated – Sept 16, 2022]: من که با استفاده از Build.VERSION_CODES.O اصلا خواندنی نیست هیچ معنایی ندارد زیرا در هر جای دیگری (مثلاً پیام های هشدار از Android Studio، build.gradle) از عدد (یعنی 26) استفاده می کند. من هیچ ایده ای ندارم O نشان دهنده 26 و من نمی توانم آن را حفظ کنم. در عوض، من ترجیح می دهم از مقدار سخت کد شده استفاده کنم 26!

if (Build.VERSION.SDK_INT >= 26) {
    /* Code for API level >= 26 */
} else {
   /* code for API level >= 23 and < 26) */
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

[Updated – Jan 20, 2023]: من هنوز متوجه می شوم که مقدار کد 26 چندان قابل خواندن نیست. بنابراین من این را ایجاد کردم BuildUtils کتابخانه اندروید اخیراً این را خواناتر می کند.

if (BuildExt.VERSION.isNotificationChannelSupported()) {
    // Create notification channel here
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه

به طور کلی،

minSdk < targetSdk <= compileSdk

اما به صورت ایده آل و عملی،

minSdk < targetSdk == compileSdk == آخرین نسخه SDK

استفاده نکنید @RequiresApi() و رفتار نسخه های مختلف API را در کد مدیریت کنید.


در ابتدا در https://vtsen.hashnode.dev منتشر شده است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا