אפליקציות ל-Android יכולות להגדיר כמה מאפיינים של גרסת SDK
קובץ build.gradle
. במסמכי התיעוד של Android build.gradle
מוסבר מה
מאפיינים אלו משפיעים על האפליקציה באופן כללי. במסמך הזה נסביר איך
המאפיינים האלה משפיעים על גרסאות build של NDK.
compileSdkVersion
לנכס הזה אין השפעה על גרסאות build של NDK. זמינות ה-API ל-NDK היא
כפוף ל-minSdkVersion
. הסיבה לכך היא שסמלי C++ במידה רבה
בזמן הטעינה של הספרייה, ולא באופן מדורג בעת הקריאה הראשונית (כפי
שהם ב-Java). שימוש בסמלים שלא זמינים
הפקודה minSdkVersion
תגרום לכך שהספרייה לא תיטען בגרסאות של מערכת ההפעלה
לא כוללים את ממשק ה-API החדש יותר, גם אם לא תתבצע קריאה לממשקי ה-API האלה.
כדי לפתוח אפליקציה חדשה, צריך לבחור את הגרסה העדכנית ביותר. כדי לעדכן אפליקציה קיימת, צריך לעדכן את האפליקציה. לגרסה העדכנית ביותר מתי שנוח לך.
targetSdkVersion
בדומה ל-Java, targetSdkVersion
באפליקציה שלך יכולה לשנות את זמן הריצה
ההתנהגות של קוד נייטיב. שינויים בהתנהגות במערכת הם, כאשר הדבר אפשרי, רק
הוחלו על אפליקציות עם targetSdkVersion
גדול יותר ממערכת ההפעלה או שווה לו
הגרסה שבה בוצע השינוי.
כדי לפתוח אפליקציה חדשה, צריך לבחור את הגרסה העדכנית ביותר. כדי לעדכן אפליקציה קיימת, צריך לעדכן את האפליקציה.
לגרסה העדכנית ביותר מתי שנוח לך (לאחר עדכון compileSdkVersion
).
מפתחי אפליקציות בדרך כלל יודעים את targetSdkVersion
של האפליקציה שלהם, אבל
ה-API שימושי למפתחי ספריות שלא יכולים לדעת איזה targetSdkVersion
שהמשתמשים יבחרו.
בזמן הריצה, אפשר לקבל את ה-targetSdkVersion
שמשמש אפליקציה באמצעות קריאה
android_get_application_target_sdk_version()
. ה-API הזה זמין ב-API
ברמה 24 ואילך. לפונקציה הזו יש את החתימה הבאה:
/**
* Returns the `targetSdkVersion` of the caller, or `__ANDROID_API_FUTURE__` if
* there is no known target SDK version (for code not running in the context of
* an app).
*
* The returned values correspond to the named constants in `<android/api-level.h>`,
* and is equivalent to the AndroidManifest.xml `targetSdkVersion`.
*
* See also android_get_device_api_level().
*
* Available since API level 24.
*/
int android_get_application_target_sdk_version() __INTRODUCED_IN(24);
שינויים אחרים בהתנהגות עשויים להיות תלויים ברמת ה-API של המכשיר. קבלת ה-API
רמת המכשיר שבו האפליקציה פועלת על ידי התקשרות
android_get_device_api_level()
לפונקציה הזו יש את החתימה הבאה:
/**
* Returns the API level of the device we're actually running on, or -1 on failure.
* The returned values correspond to the named constants in `<android/api-level.h>`,
* and is equivalent to the Java `Build.VERSION.SDK_INT` API.
*
* See also android_get_application_target_sdk_version().
*/
int android_get_device_api_level();
גרסה מקסימלית
לנכס הזה אין השפעה על גרסאות build של NDK.
minSdkVersion
ההגדרה minSdkVersion
בקובץ build.gradle
קובעת אילו ממשקי API
זמינה בזמן ה-build (אפשר לעיין ב-compileSdkVersion כדי להבין למה יש הבדל
מ-Java build), והוא קובע את הגרסה המינימלית של מערכת ההפעלה שהקוד שלך
יתאימו ל-.
ה-minSdkVersion
משמש את NDK כדי לקבוע באילו תכונות ניתן להשתמש
בזמן הידור הקוד. לדוגמה, המאפיין הזה קובע איזה FORTIFY
נמצאים בשימוש ב-libc, ועשויים גם לאפשר שיפורי ביצועים או שיפורי גודל
(כמו גיבובים של GNU או RELR) לקבצים הבינאריים שלא תואמים
גרסאות ישנות יותר של Android. גם אם אתם לא משתמשים בממשקי API חדשים, הנכס הזה
עדיין קובע את הגרסה המינימלית של מערכת ההפעלה שנתמכת בקוד שלך.
כשמדובר באפליקציה חדשה, אפשר לעיין בנתוני הפצת המשתמשים בפרויקט החדש של Android Studio
האשף או באתר apilevels.com. בחירת היתרה בין
נתח שוק פוטנציאלי ועלויות תחזוקה. ככל שערך ה-minSdkVersion
נמוך יותר,
ככל שתקדישו יותר זמן לתיקון באגים ישנים ולהוספת התנהגויות חלופיות
לגבי תכונות שעדיין לא הוטמעו.
עבור אפליקציה קיימת, אפשר להעלות את minSdkVersion
אם אין רמות API ישנות
משתלמות יותר בעלויות התחזוקה, או להקטין אותן אם המשתמשים דורשים אותן
שווה את עלויות התחזוקה החדשות. ב-Play Console יש מדדים ספציפיים
של התפלגות המשתמשים באפליקציה.
השדה minSdkVersion
של האפליקציה זמין למעבד המידע המקדים
דרך המאקרו __ANDROID_MIN_SDK_VERSION__
(הקוד הקודם __ANDROID_API__
הוא
זהה, אך מעדיפים את הראשון כי המשמעות שלו ברורה יותר). המאקרו הזה
מוגדר באופן אוטומטי על ידי Clang, כך שלא צריך לכלול כותרת כדי להשתמש בו. עבור
לפיתוח של NDK, המאקרו הזה תמיד מוגדר.