מאפייני הגרסה של Android SDK

אפליקציות ל-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, המאקרו הזה תמיד מוגדר.