קובץ Android App Bundle הוא קובץ (עם סיומת הקובץ .aab
) שאתם מעלים ל-Google Play.
חבילות אפליקציות הן קובצי בינארי חתומות שמארגנות את הקוד והמשאבים של האפליקציה למודולים, כפי שמוצג באיור 1. הקוד והמשאבים של כל מודול מאורגנים באופן דומה לאופן שבו הם מאורגנים ב-APK – וזה הגיוני, כי כל אחד מהמודולים האלה יכול להיווצר כ-APK נפרד. לאחר מכן, Google Play משתמשת בחבילת האפליקציות כדי ליצור את חבילות ה-APK השונות שמוצגות למשתמשים, כמו חבילת ה-APK הבסיסית, חבילות ה-APK של התכונות, חבילות ה-APK של ההגדרות וחבילות ה-APK המרובות (במכשירים שלא תומכים בחבילות APK מפוצלות). הספריות בצבע כחול – כמו הספריות drawable/
, values/
ו-lib/
– מייצגות את הקוד והמשאבים שבהם Google Play משתמשת כדי ליצור קובצי APK של הגדרות לכל מודול.
איור 1. התוכן של Android App Bundle עם מודול בסיס אחד, שני מודולים של תכונות ושתי חבילות נכסים.
ברשימה הבאה מוסבר בהרחבה על חלק מהקבצים והספריות בחבילת האפליקציה:
- base/, feature1/ ו-feature2/: כל אחת מהתיקיות ברמת העליונה מייצגת מודול אחר של האפליקציה. המודול הבסיסי של האפליקציה תמיד נמצא בתיקייה
base
של חבילת האפליקציות. עם זאת, הספרייה של כל מודול תכונה מקבלת את השם שצוין במאפייןsplit
במניפסט של המודול. למידע נוסף, אפשר לעיין במאמר בנושא מניפסט של מודול תכונות. - asset_pack_1/ ו-asset_pack_2/: באפליקציות או במשחקים גדולים עם דרישות גרפיות גבוהות, אפשר לפצל את הנכסים לחבילות נכסים. חבילות נכסים הן אידיאליות למשחקים בגלל מגבלות הגודל הגדולות שלהן. אתם יכולים להתאים אישית את האופן והמועד שבו כל חבילת נכסים תוריד למכשיר לפי שלושה אופני הפצה: install-time, fast follow ועל פי דרישה. כל חבילות הנכסים מתארחות ב-Google Play ומשם הן מוצגות. מידע נוסף על הוספת חבילות נכסים לחבילת האפליקציות זמין בסקירה הכללית על Play Asset Delivery.
- BUNDLE-METADATA/: הספרייה הזו כוללת קובצי מטא-נתונים שמכילים מידע שימושי לכלים או לחנויות אפליקציות. קובצי מטא-נתונים כאלה עשויים לכלול מיפויים של ProGuard והרשימה המלאה של קובצי ה-DEX של האפליקציה. הקבצים בספרייה הזו לא ארוזים בחבילות ה-APK של האפליקציה.
- קובצי Module Protocol Buffer (
*.pb
): הקובצים האלה מספקים מטא-נתונים שעוזרים לתאר לחנויות האפליקציות, כמו Google Play, את התוכן של כל מודול באפליקציה. לדוגמה,BundleConfig.pb
מספק מידע על החבילה עצמה, כמו הגרסה של כלי ה-build ששימשו ליצירת חבילת האפליקציות, ו-native.pb
ו-resources.pb
מתארים את הקוד והמשאבים בכל מודול. המידע הזה שימושי כש-Google Play מבצע אופטימיזציה של חבילות APK לתצורות שונות של מכשירים. - manifest/: בניגוד ל-APK, ב-App Bundles הקובץ
AndroidManifest.xml
של כל מודול מאוחסן בספרייה נפרדת. - dex/: בניגוד ל-APK, קובצי ה-DEX של כל מודול נשמרים בספרייה הנפרדת הזו ב-App Bundle.
- res/, lib/ ו-assets/: הספריות האלה זהות לאלה שב-APK טיפוסי. כשאתם מעלים את חבילת האפליקציות, מערכת Google Play בודקת את הספריות האלה ומארזת רק את הקבצים שעומדים בהגדרות של מכשיר היעד, תוך שמירה על נתיבי הקבצים.
root/: הספרייה הזו מאחסנת קבצים שמאוחר יותר מועברים לספריית הבסיס של כל קובץ APK שכולל את המודול שבו נמצאת הספרייה הזו. לדוגמה, ייתכן שהספרייה
base/root/
של חבילת האפליקציות תכלול משאבים מבוססי Java שהאפליקציה טוענת באמצעותClass.getResource()
. הקבצים האלה מועברים מאוחר יותר לספריית השורש של קובץ ה-APK הבסיסי של האפליקציה ושל כל קובץ ה-APK המורכב שנוצר על ידי Google Play. גם הנתיבים בתוך הספרייה הזו נשמרים. כלומר, גם הספריות (והספריות המשנה שלהן) מועברות לשורש של קובץ ה-APK.
סקירה כללית על חבילות APK מפוצלות
רכיב בסיסי בהצגת אפליקציות שעברו אופטימיזציה הוא מנגנון ה-APK המפוצל, שזמין ב-Android מגרסה 5.0 (רמת API 21) ואילך. חבילות APK מפוצלות דומות מאוד לחבילות APK רגילות – הן כוללות קוד בייט DEX מקודד, משאבים ומניפסט של Android. עם זאת, פלטפורמת Android יכולה להתייחס למספר חבילות APK מחולקות שמותקנות כאפליקציה אחת. כלומר, אפשר להתקין כמה חבילות APK מחולקות שיש להן גישה לקוד ולמשאבים משותפים, והן יופיעו כאפליקציה אחת מותקנת במכשיר.
היתרון של חבילות APK מפוצלות הוא היכולת לפצל קובץ APK מונוליתי – כלומר קובץ APK שכולל קוד ומשאבים לכל התכונות וההגדרות של המכשיר שהאפליקציה תומכת בהן – לחבילות קטנות יותר ונפרדות שמותקנות במכשיר של המשתמש לפי הצורך.
לדוגמה, קובץ APK מפוצל אחד עשוי לכלול את הקוד והמשאבים של תכונה נוספת שרק חלק מהמשתמשים שלכם זקוקים לה, ואילו קובץ APK מפוצל אחר כולל משאבים רק לשפה ספציפית או לצפיפות מסך ספציפית. כל אחת מחבילות ה-APK המפוצלות האלה מורידות ומתקנות כשהמשתמש מבקש זאת או כשהמכשיר דורש זאת.
בהמשך מפורטים הסוגים השונים של קובצי APK שיכולים להיות מותקנים יחד במכשיר כדי ליצור את חוויית המשתמש המלאה של האפליקציה. בהמשך הדף תלמדו איך להגדיר את פרויקט האפליקציה כך שיתמוך בקובצי ה-APK האלה.
- APK בסיסי: ה-APK הזה מכיל קוד ומשאבים שכל שאר חבילות ה-APK המפוצלות יכולות לגשת אליהם, והוא מספק את הפונקציונליות הבסיסית של האפליקציה. כשמשתמש מבקש להוריד את האפליקציה, קובץ ה-APK הזה מופיע ראשון להורדה ולהתקנה. הסיבה לכך היא שרק המניפסט של קובץ ה-APK הבסיסי מכיל הצהרה מלאה על השירותים, ספקי התוכן, ההרשאות, דרישות הגרסה של הפלטפורמה והתלות בתכונות המערכת של האפליקציה. Google Play יוצרת את קובץ ה-APK הבסיסי של האפליקציה מהמודול של האפליקציה (או הבסיס) בפרויקט. אם אתם רוצים לצמצם את גודל ההורדה הראשוני של האפליקציה, חשוב לזכור שכל הקוד והמשאבים הכלולים במודול הזה כלולים בחבילת ה-APK הבסיסית של האפליקציה.
- חבילות APK לתצורה: כל אחת מחבילות ה-APK האלה כוללת ספריות ומשאבים מקומיים לדחיסות מסך, לארכיטקטורת מעבד או לשפה ספציפיים. כשמשתמש מוריד את האפליקציה, המכשיר שלו מוריד ומתקין רק את קובצי ה-APK לתצורה שמותאמים למכשיר שלו. כל חבילת APK של תצורה היא תלות בחבילת APK בסיסית או בחבילת APK של מודול תכונה. כלומר, הן מורידות ומתקינות יחד עם קובץ ה-APK שלהן, שעבורו הן מספקות קוד ומשאבים. בניגוד למודולים הבסיסיים ולמודולים של התכונות, לא יוצרים מודול נפרד לחבילות APK של תצורה. אם אתם משתמשים בשיטות רגילות כדי לארגן משאבים חלופיים ספציפיים לתצורה עבור המודולים הבסיסיים והתכונות, Google Play תיצור בשבילכם באופן אוטומטי חבילות APK של הגדרות.
- חבילות APK של מודולים של תכונות: כל אחת מחבילות ה-APK האלה מכילה קוד ומשאבים של תכונה באפליקציה, שפורקה למודולים באמצעות מודולים של תכונות. לאחר מכן תוכלו להתאים אישית את אופן ההורדה של התכונה הזו למכשיר ואת המועד שבו היא תתבצע. לדוגמה, באמצעות Play Core Library, אפשר להתקין תכונות על פי דרישה אחרי התקנת קובץ ה-APK הבסיסי במכשיר, כדי לספק למשתמשים פונקציונליות נוספת. לדוגמה, אפליקציית צ'אט שמורידה ומתקינה את היכולת לצלם ולשלוח תמונות רק כשהמשתמש מבקש להשתמש בפונקציונליות הזו. יכול להיות שמודולים של תכונות לא יהיו זמינים בזמן ההתקנה, לכן כדאי לכלול את כל המשאבים והקודים הנפוצים ב-APK הבסיסי. כלומר, מודול התכונה צריך להניח שרק הקוד והמשאבים של חבילת ה-APK הבסיסית זמינים בזמן ההתקנה. מערכת Google Play יוצרת קובצי APK של מודולים של תכונות לאפליקציה שלכם מהמודולים של התכונות בפרויקט.
נניח שאפליקציה כוללת שלושה מודולים של תכונות ותמיכה במספר הגדרות אישיות של מכשירים. תרשים 1 שבהמשך ממחיש איך עשוי להיראות עץ התלות של קובצי ה-APK השונים של האפליקציה. חשוב לזכור שקובץ ה-APK הבסיסי הוא ראש העץ, וכל שאר קובצי ה-APK תלויים בקובץ ה-APK הבסיסי. (במאמר הפורמט של Android App Bundle מוסבר איך המודולים של חבילות ה-APK האלה מיוצגים ב-Android App Bundle).
איור 1. עץ יחסי התלות של אפליקציה שמוצגת באמצעות חבילות APK מפוצלות
חשוב לזכור שאתם לא צריכים ליצור את חבילות ה-APK האלה בעצמכם – Google Play עושה זאת בשבילכם באמצעות חבילת אפליקציות חתומה אחת שאתם יוצרים באמצעות Android Studio. למידע נוסף על הפורמט של חבילות האפליקציות ועל האופן שבו יוצרים אותן, אפשר לעיין במאמר יצירה, פריסה והעלאה של חבילות אפליקציות ל-Android.
מכשירים עם Android מגרסה 4.4 (API ברמה 19) ומטה
מאחר שמכשירים עם Android מגרסה 4.4 (רמת API 19) ומטה לא תומכים בהורדה ובהתקנה של חבילות APK מפוצלות, במקום זאת Google Play מציגה למכשירים האלה קובץ APK יחיד שנקרא multi-APK, שעובר אופטימיזציה בהתאם לתצורה של המכשיר. כלומר, קובצי APK מרובים מייצגים את חוויית השימוש המלאה באפליקציה, אבל הם לא כוללים קוד ומשאבים מיותרים – כמו קוד ומשאבים שמיועדים לצפיפות מסך ולארכיטקטורות מעבד אחרות.
עם זאת, הם כוללים משאבים לכל השפות שהאפליקציה תומכת בהן. כך, למשל, המשתמשים יכולים לשנות את הגדרת השפה המועדפת של האפליקציה בלי שתצטרכו להוריד קובץ APK אחר עם כמה שפות.
לא ניתן להוריד מודולים של תכונות לפי דרישה במועד מאוחר יותר באפליקציות עם כמה קובצי APK. כדי לכלול מודול תכונות ב-APK הזה, צריך להשבית את On-demand או להפעיל את Fusing בזמן יצירת מודול התכונות.
חשוב לזכור: כשמשתמשים בחבילות אפליקציות, אין צורך ליצור, לחתום, להעלות ולנהל חבילות APK לכל הגדרת מכשיר שהאפליקציה תומכת בה. עדיין צריך ליצור ולהעלות רק חבילת אפליקציות אחת של האפליקציה כולה, ו-Google Play יטפל בשאר. לכן, בין שאתם מתכננים לתמוך במכשירים עם מערכת Android בגרסה 4.4 ומטה ובין שלא, Google Play מספק מנגנון להצגת מודעות גמיש גם לכם וגם למשתמשים שלכם.
שינויים בשפה של המשתמש
בחבילות האפליקציות, המכשירים מורידים רק את הקוד והמשאבים הנדרשים להפעלת האפליקציה. לכן, לגבי משאבי שפה, המכשיר של המשתמש מוריד רק את משאבי השפה של האפליקציה שתואמים לשפה אחת או יותר שנבחרה כרגע בהגדרות המכשיר.
כשמשתמש מחליף את השפה בהגדרות המכשיר, יכול להיות שמערכת Google Play תצטרך להוריד ולהתקין קובצי APK מפוצלים נוספים כדי שהאפליקציה תוצג בשפה החדשה.
Google Play מנסה להוריד את השפות הנוספות מיד אחרי המעבר. אם מכשיר המשתמש במצב אופליין, ההורדה נכשלת או שהמשאבים גדולים מדי, Google Play מנסה שוב להוריד אותם ברקע כשהתנאים במכשיר נוחים יותר. כשהאפליקציה פועלת במכשיר עם Android 9.0 (רמת API 28) ואילך, אם היא נמצאת בחזית במהלך ההתקנה של חבילות ה-APK החדשות עם הפיצול לפי שפות, האפליקציה תושבת.
אם באפליקציה שלכם צריכות להיות זמינות כל השפות בכל שלב, תוכלו להשבית את חלוקת השפות בהגדרות ה-build.
אם האפליקציה שלכם דורשת הורדה של שפות נוספות בנפרד מהשפות שבחר המשתמש בהגדרות המכשיר – למשל, כדי להטמיע בורר שפות באפליקציה – תוכלו להשתמש בספריית Play Core כדי להוריד אותן על פי דרישה.