גרסת האפליקציה

ניהול גרסאות הוא רכיב קריטי באסטרטגיית השדרוג והתחזוקה של האפליקציה. הגרסאות חשובות מהסיבות הבאות:

  • המשתמשים צריכים לקבל מידע ספציפי על גרסת האפליקציה שמותקנת במכשירים שלהם ועל גרסאות השדרוג שזמינות להתקנה.
  • אפליקציות אחרות – כולל אפליקציות אחרות שאתם מפרסמים כחלק מחבילה – צריכות לשלוח שאילתה למערכת כדי לקבל את גרסת האפליקציה שלכם, כדי לקבוע את התאימות ולזהות תלות.
  • יכול להיות ששירותים שבהם אתם מפרסמים את האפליקציות שלכם יצטרכו גם לשלוח לאפליקציה שאילתה לגבי הגרסה שלה, כדי שיוכלו להציג את הגרסה למשתמשים. יכול להיות ששירות פרסום יצטרך גם לבדוק את גרסת האפליקציה כדי לקבוע את התאימות וליצור קשרים של שדרוג או שדרוג לאחור.

מערכת Android משתמשת בפרטי הגרסה של האפליקציה כדי להגן מפני הורדת גרסה (downgrade). המערכת לא משתמשת במידע על גרסת האפליקציה כדי לאכוף הגבלות על שדרוגים או על תאימות של אפליקציות צד שלישי. האפליקציה שלך צריכה לאכוף את כל ההגבלות על הגרסאות ולעדכן את המשתמשים לגביהן.

מערכת Android אוכפת תאימות של גרסת המערכת, כפי שמצוין בהגדרה minSdk בקובצי ה-build. ההגדרה הזו מאפשרת לאפליקציה לציין את ה-API המינימלי של המערכת שאיתו היא תואמת. מידע נוסף על דרישות API זמין במאמר ציון דרישות של רמת API (גרסת SDK).

הדרישות לגבי ניהול גרסאות משתנות בין פרויקטים שונים. עם זאת, מפתחים רבים רואים בניהול גרסאות סמנטי בסיס טוב לאסטרטגיית ניהול גרסאות.

הגדרת פרטי גרסת האפליקציה

כדי להגדיר את פרטי הגרסה של האפליקציה, צריך להגדיר ערכים להגדרות הגרסה בקובצי ה-build של Gradle:

גרוב

    android {
      namespace 'com.example.testapp'
      compileSdk 33

      defaultConfig {
          applicationId "com.example.testapp"
          minSdk 24
          targetSdk 33
          versionCode 1
          versionName "1.0"
          ...
      }
      ...
    }
    ...
    

Kotlin

    android {
      namespace = "com.example.testapp"
      compileSdk = 33

      defaultConfig {
          applicationId = "com.example.testapp"
          minSdk = 24
          targetSdk = 33
          versionCode = 1
          versionName = "1.0"
          ...
      }
      ...
    }
    ...
      

הגדרות גרסה

מגדירים ערכים לשתי הגדרות הגרסה שזמינות: versionCode ו-versionName.

versionCode
מספר שלם חיובי שמשמש כמספר גרסה פנימי. המספר הזה עוזר לקבוע אם גרסה אחת עדכנית יותר מגרסה אחרת. מספרים גבוהים יותר מציינים גרסאות עדכניות יותר. זה לא מספר הגרסה שמוצג למשתמשים. המספר הזה מוגדר בהגדרה versionName. מערכת Android משתמשת בערך versionCode כדי להגן מפני שדרוגים לאחור. היא מונעת ממשתמשים להתקין APK עם ערך versionCode נמוך יותר מהגרסה שמותקנת כרגע במכשיר שלהם.

הערך הוא מספר שלם חיובי, כדי שאפליקציות אחרות יוכלו להעריך אותו באופן פרוגרמטי – למשל, כדי לבדוק את הקשר בין שדרוג או הורדת גרסה. אפשר להגדיר את הערך לכל מספר שלם חיובי. עם זאת, חשוב לוודא שכל גרסה עוקבת של האפליקציה משתמשת בערך גבוה יותר.

הערה: הערך הגדול ביותר שמותר להזין ב-Google Play עבור versionCode הוא 2,100,000,000.

אי אפשר להעלות קובץ APK לחנות Play עם versionCode שכבר השתמשתם בו בגרסה קודמת.

הערה: במקרים מסוימים, יכול להיות שתרצו להעלות גרסה של האפליקציה עם versionCode נמוך יותר מהגרסה האחרונה. לדוגמה, אם אתם מפרסמים כמה קובצי APK, יכול להיות שהגדרתם מראש versionCode טווחים לקובצי APK ספציפיים. מידע נוסף על הקצאת ערכי versionCode לכמה קובצי APK זמין במאמר הקצאת קודי גרסה.

בדרך כלל, כשמשיקים את הגרסה הראשונה של האפליקציה, הערך של versionCode מוגדר כ-1, ואז מגדילים את הערך באופן מונוטוני עם כל השקה, בלי קשר אם ההשקה היא השקה ראשית או משנית. כלומר, הערך versionCode לא בהכרח דומה לגרסת האפליקציה שמוצגת למשתמש. אפליקציות ושירותי פרסום לא צריכים להציג את ערך הגרסה הזה למשתמשים.

versionName

מחרוזת שמשמשת כמספר הגרסה שמוצג למשתמשים. אפשר לציין את ההגדרה הזו כמחרוזת גולמית או כהפניה למשאב מחרוזת.

הערך הוא מחרוזת, כך שאפשר לתאר את גרסת האפליקציה כמחרוזת <major>.<minor>.<point> או כמזהה גרסה מוחלט או יחסי מכל סוג אחר. הערך versionName הוא הערך היחיד שמוצג למשתמשים.

הגדרת ערכי גרסה

אפשר להגדיר ערכי ברירת מחדל להגדרות האלה על ידי הכללתן בחסימה defaultConfig {}, שמוטמעת בתוך החסימה android {} של קובץ build.gradle או build.gradle.kts של המודול. אחר כך תוכלו לשנות את ערכי ברירת המחדל האלה בגרסאות שונות של האפליקציה, על ידי הגדרת ערכים נפרדים לסוגי build או לטעמים שונים של מוצרים. בקובץ הבא מוצגות ההגדרות של versionCode ו-versionName בקטע defaultConfig {}, וגם הקטע productFlavors {}.

הערכים האלה משולבים בקובץ המניפסט של האפליקציה במהלך תהליך הבנייה.

גרוב

    android {
        ...
        defaultConfig {
            ...
            versionCode 2
            versionName "1.1"
        }
        productFlavors {
            demo {
                ...
                versionName "1.1-demo"
            }
            full {
                ...
            }
        }
    }
    

Kotlin

    android {
        ...
        defaultConfig {
            ...
            versionCode = 2
            versionName = "1.1"
        }
        productFlavors {
            create("demo") {
                ...
                versionName = "1.1-demo"
            }
            create("full") {
                ...
            }
        }
    }
    

בדוגמה הזו, בבלוק defaultConfig {}, הערך versionCode מציין שחבילת ה-APK הנוכחית מכילה את הגרסה השנייה של האפליקציה, והמחרוזת versionName מציינת שהיא תוצג למשתמשים כגרסה 1.1. הקובץ הזה מגדיר גם שני טעמים של מוצרים, 'הדגמה' ו'מלא'. מכיוון שגרסת המוצר demo מגדירה את versionName כ-1.1-demo, הגרסה demo של האפליקציה משתמשת ב-versionName הזה במקום בערך ברירת המחדל. בלוק טעם המוצר 'full' לא מגדיר את versionName, ולכן הוא משתמש בערך ברירת המחדל '1.1'.

הערה: אם האפליקציה מגדירה את גרסת האפליקציה ישירות ברכיב <manifest>, ערכי הגרסה בקובץ ה-build של Gradle מבטלים את ההגדרות במניפסט. בנוסף, הגדרת ההגדרות האלה בקובצי ה-build של Gradle מאפשרת לציין ערכים שונים לגרסאות שונות של האפליקציה. כדי להגדיר את הגרסה בצורה גמישה יותר וכדי למנוע החלפה פוטנציאלית כשממזגים את המניפסט, צריך להסיר את המאפיינים האלה מרכיב <manifest> ולהגדיר את הגרסה בקובצי ה-build של Gradle.

‫Android framework מספק API שמאפשר לכם לשלוח שאילתה למערכת כדי לקבל מידע על הגרסה של האפליקציה. כדי לקבל מידע על הגרסה, צריך להשתמש ב-method‏ PackageManager.getPackageInfo(java.lang.String, int).

ציון דרישות של רמת API (גרסת SDK)

אם האפליקציה שלכם דורשת גרסה מינימלית ספציפית של פלטפורמת Android, אתם יכולים לציין את דרישת הגרסה הזו כהגדרות של רמת ה-API בקובץ build.gradle או build.gradle.kts של האפליקציה. במהלך תהליך ה-build, ההגדרות האלה משולבות בקובץ המניפסט של האפליקציה. ציון דרישות של רמת API מבטיח שאפשר יהיה להתקין את האפליקציה רק במכשירים שפועלת בהם גרסה תואמת של פלטפורמת Android.

הערה: אם מציינים דרישות של רמת API ישירות בקובץ המניפסט של האפליקציה, ההגדרות התואמות בקובצי ה-build יבטלו את ההגדרות בקובץ המניפסט. בנוסף, הגדרת ההגדרות האלה בקובצי ה-build של Gradle מאפשרת לכם לציין ערכים שונים לגרסאות שונות של האפליקציה. כדי להגדיל את הגמישות ולמנוע החלפה פוטנציאלית כשממזגים את המניפסט, מומלץ להסיר את המאפיינים האלה מרכיב <uses-sdk> ולהגדיר את ההגדרות של רמת ה-API בקובצי ה-build של Gradle.

יש שתי הגדרות ברמת ה-API:

  • minSdk – הגרסה המינימלית של פלטפורמת Android שבה האפליקציה תפעל, שצוינה על ידי מזהה רמת ה-API של הפלטפורמה.
  • targetSdk – רמת ה-API, שקשורה לקבוע <SDK_INT>, שעליו האפליקציה מיועדת לפעול. במקרים מסוימים, זה מאפשר לאפליקציה להשתמש ברכיבי מניפסט או בהתנהגויות שמוגדרים ברמת ה-API של היעד, במקום להיות מוגבלת לשימוש רק באלה שמוגדרים לרמת ה-API המינימלית.
  • אי אפשר לציין שאפליקציה מיועדת לגרסה משנית של SDK או דורשת אותה. כדי לקרוא בבטחה לממשקי API חדשים שנדרשת עבורם גרסה ראשית או משנית של SDK מתקדמת יותר מזו של minSdkVersion, אפשר להגן על בלוק קוד באמצעות בדיקה של גרסה משנית או ראשית באמצעות הקבוע SDK_INT_FULL.

    if (SDK_INT_FULL >= VERSION_CODES_FULL.[MAJOR or MINOR RELEASE]) {
      // Use APIs introduced in a major or minor SDK version
    }

כדי לציין דרישות ברירת מחדל של רמת API בקובץ build.gradle או build.gradle.kts, מוסיפים אחת או יותר מההגדרות של רמת ה-API לבלוק defaultConfig{}, שמוטמע בתוך הבלוק android {}. אפשר גם לשנות את ערכי ברירת המחדל האלה לגרסאות שונות של האפליקציה על ידי הוספת ההגדרות לסוגי build או לטעמי מוצר.

בקובץ הבא מוגדרים ערכי ברירת מחדל של minSdk ו-targetSdk בקטע defaultConfig {}, ומוגדר ערך חלופי של minSdk לטעם אחד של המוצר:

גרוב

android {
    ...
    defaultConfig {
        ...
        minSdk 21
        targetSdk 33
    }
    productFlavors {
        main {
            ...
        }
        afterNougat {
            ...
            minSdk 24
        }
    }
}

Kotlin

android {
    ...
    defaultConfig {
        ...
        minSdk = 21
        targetSdk = 33
    }
    productFlavors {
        create("main") {
            ...
        }
        create("afterNougat") {
            ...
            minSdk = 24
        }
    }
}

כשמתכוננים להתקין את האפליקציה, המערכת בודקת את הערך של ההגדרות האלה ומשווה אותו לגרסת המערכת. אם הערך של minSdk גדול מהגרסה של המערכת, המערכת מונעת את ההתקנה של האפליקציה.

אם לא מציינים את ההגדרות האלה, המערכת מניחה שהאפליקציה תואמת לכל הגרסאות של הפלטפורמה. זה שווה ערך להגדרת minSdk ל-<0x0A> 1.

מידע נוסף מופיע במאמר מהי רמת API? הגדרות של Gradle build מפורטות במאמר הגדרת וריאציות של build.