با هم بریم ببینیم تفاوت بین این سه تا چیه! حتما میدونید که این پراپرتیها تو زیر هستند:
android/app/build.gradle
- براساس ورژنی که در این قسمت وارد شده برنامه کامپایل میشه، به عنوان مثال شما ورژن ۳۳ رو وارد کردید خب این عدد به این معنیه که شما میتونید از تمام امکانات ورژن ۳۳ استفاده کنید (به علاوهی هر امکاناتی که ورژنهای قبلی دارند).
- چه زمانی به ارور کامپایل میخوریم؟ وقتی شما از featureهای ورژن ۳۳ استفاده کردید ولی تو compileSdkVersion عدد زیر ۳۳ رو وارد کردید.
- این پراپرتی داخل فایل اجرایی apk برنامهی شما نخواهد بود و فقط زمان کامپایل استفاده میشه ولی باید به اخطارهای اون توجه کنید.
- این پراپرتی به گریدل میگه که با چه ورژنی از SDK برنامهی شما رو کامپایل، دیباگ و تست کنه.
- خب میگید ما که اینجاها بزنیم ورژن ۳۳ آیا برنامهی ما روی دستگاههایی که قدیمیتر هستند مثلا ورژن ۳۱ هم اجرا میشند؟ اجرا میشند ولی به شرطی که برنامتون به هیچ کدوم از مسیرهای ورژن ۳۳ استناد نکرده باشه.
- قابلیت forward-compatible داخل اندروید باعث میشه برنامههای قدیمی به راحتی داخل دستگاهی جدید با ورژن اندروید بالاتر اجرا بشن؛ پس بدون نگرانی میتونید این مقدار رو روی آخرین ورژن قرار بدید.
- این ویژگی حداقل ورژن اندرویدی که برنامهی شما قابلیت اجرا شدن روی اون رو داره مشخص میکنه و گوگل پلی استور و بقیهی مارکتها براساس این مقدار میفهمند که دستگاه شما با این برنامه سازگار هست یا نه.
- دقت کنید که این پراپرتی داخل فایل apk برنامهی شما اعمال خواهد شد برخلاف compileSdkVersion.
- پس اگه از ویژگی خاصی که تو ورژنهای بالاتر گنجونده شده استفاده نمیکنید بهتره این مقدار رو روی حداقل بزارید این باعث میشه برنامهی شما روی اکثر گوشیها قابلیت اجرا رو داشته باشند.
این پراپرتی کاری نداره به اینکه برنامهی شما چجور کامپایل شده یا از چه APIی استفاده کردید. targetSdkVersion برنامهی شما رو روی نسخهای که در این پراپرتی مشخص کردید، تست میکنه. این پراپرتی بیشتر شبیه certification یا امضایی میمونه به سیستم عامل اندروید میگه چجور باید برنامه شما رو از نظر ویژگیهای سیستم عامل هندل کنه.
به عنوان مثال، عدد ۱۱ یا بالاتر این اجازه رو به سیستم میده که از تم جدید پیشفرض Holo داخل برنامتون استفاده کنه وقتی که دستگاه اندروید شما ورژنی بالاتر از ۳ داشته باشه.
خود سیستم عامل اندروید وقت اجرا شدن برنامه، ممکنه ظاهر اپ شما رو براساس مقداری که تو این پراپرتی ست کردید، تغییر بده.
به عنوان مثال با انتشار نسخۀ ۶ اندروید (API Level 23) مدل مجوزها به Runtime Permission تغییر کرد. قبل از اون کاربر در زمان نصب برنامه باید همۀ مجوزها را تأیید میکرد تا برنامه نصب میشد ولی حالا برنامه در زمان اجرا تک تک مجوزها را به صورت تفکیک شده از یوزر درخواست میکنه. در چنین شرایطی اگر مقدار targetSdkVersion در برنامۀ شما کمتر از ۲۳ باشد (مثلاً ۲۲). کاربر هنگام اجرای برنامه با درخواست مجوز مواجه نمیشه.
خب حالا ما داخل این پراپرتیها چی ست کنیم بهتره؟
بهتره برای targetSdkVersion آخرین نسخه API رو ست کنید. این باعث میشه برنامهی شما داخل دستگاههای با اندروید جدید با ظاهر خوبی اجرا بشه. اگه targetSdkVersion رو مشخص نکنید اپ برای کامپایل از minSdkVersion استفاده میکنه.
به طور کلی:
minSdkVersion <= targetSdkVersion <= compileSdkVersion
و در حالت ایدهآل:
minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)