ניהול גרסאות הוא רכיב קריטי באסטרטגיית השדרוג והתחזוקה של האפליקציה. הגרסאות חשובות מהסיבות הבאות:
- המשתמשים צריכים לקבל מידע ספציפי על גרסת האפליקציה שמותקנת במכשירים שלהם ועל גרסאות השדרוג שזמינות להתקנה.
- אפליקציות אחרות – כולל אפליקציות אחרות שאתם מפרסמים כחלק מחבילה – צריכות לשלוח שאילתה למערכת כדי לקבל את גרסת האפליקציה שלכם, כדי לקבוע את התאימות ולזהות תלות.
- יכול להיות ששירותים שבהם אתם מפרסמים את האפליקציות שלכם יצטרכו גם לשלוח לאפליקציה שאילתה לגבי הגרסה שלה, כדי שיוכלו להציג את הגרסה למשתמשים. יכול להיות ששירות פרסום יצטרך גם לבדוק את גרסת האפליקציה כדי לקבוע את התאימות וליצור קשרים של שדרוג או שדרוג לאחור.
מערכת 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.