מערכת קבצים מצטברת

מודול הליבה של מערכת הקבצים המצטברת (IncFS) שהוצג ב-Android 11 מאפשר למערכת ההפעלה של Android לקבל סטרימינג של חבילות APK דרך Android Debug Bridge‏ (ADB).

מודול הליבה הזה, שהוא עצמאי, יוצר מערכת קבצים וירטואלית חדשה שממוקמת מעל מערכת הקבצים הקיימת של Android. השינוי הזה משלים את השינויים במסגרת וב-SDK, שמאפשרים למפתחי אפליקציות ומשחקים לפרוס קובצי APK גדולים דרך ADB במכשיר שפועל עם Android בגרסה 11 ואילך.

השינוי בליבה מאפשר להשתמש בפורמט החדש APK Signature Scheme v4, תומך בשינויים במסגרת של Android ב-Android Package Manager, בשירותי מערכת חדשים ובשינויים ב-ADB.

הטמעה

כדי להטמיע את IncFS, יצרני ציוד מקורי (OEM) ויצרני SoC צריכים להוסיף מנהל ליבה חדש לגרסאות ה-build של מכשירי Android.

ב-Android 11 בלבד, אם מנהל הליבה נוצר כמודול, הוא נטען על פי דרישה. אם לא מותקנות אפליקציות באמצעות התקנה מצטברת של ADB, הנהג של הליבה לא נטען במכשיר.

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

מנהל הליבה הוא חלק ממערכת גדולה יותר שמאפשרת התקנות של חבילות APK בסטרימינג. יצרני ציוד מקורי (OEM) וספקים לא צריכים להשתמש בקוד המדויק של IncFS שסופק בהטמעות לדוגמה. עם זאת, כדי להבטיח חוויה עקבית במכשירים שונים, צריך לוודא שההטמעה של ה-API כוללת מערכת קבצים עם פונקציונליות של קריאת קבצים ופונקציות של קריאה וכתיבה בספריות, כפי שמוגדר במסמכי העזרה של Userspace interface for Incremental FS.

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

בהמשך מפורטים השינויים הנדרשים להטמעה:

  1. מגדירים את מכונת הפיתוח כדי ליצור את הליבה.
  2. מטרגטים את הליבה המשותפת מההסתעפות common-android-mainline.
    repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
    repo sync
  3. מוודאים שהשינויים הבאים הנדרשים ל-IncFS נמצאים ב-checkout של ההסתעפות:
  4. מוסיפים את הערך CONFIG_INCREMENTAL_FS=y או, ל-Android 11 בלבד, את הערך CONFIG_INCREMENTAL_FS=m לתחתית הקובץ defconfig. כדי לראות דוגמה, אפשר ללחוץ על אחד מהקישורים הבאים:
  5. יצירת הליבה
  6. הטמעת הליבה בגרסת build של קובץ האימג' של מכשיר Android.
  7. במכשיר Android היעד, מוסיפים לקובץ device.mk את אחת מהשורות הבאות של מאפייני המערכת הספציפיים לספק (אופציונלי במכשירים שהושקו עם Android 12 ואילך):
  8. כשמשתמשים ב-CONFIG_INCREMENTAL_FS=y, צריך לצרף לקובץ אחד מהפרטים הבאים:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=yes

    כשמשתמשים ב-CONFIG_INCREMENTAL_FS=m (ב-Android 11 בלבד), צריך לצרף לקובץ אחד מהקובצים הבאים:

    • PRODUCT_PROPERTY_OVERRIDES += \
    • ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
  9. קבצים לדוגמה של device.mk למהדורת Android ול-Pixel 4.
  10. ב-Android 11 בלבד: אם אתם משתמשים ב-CONFIG_INCREMENTAL_FS=m, מוסיפים כללי SE Linux.
  11. יוצרים קובץ vold.te ומוסיפים אותו לתיקייה /system/sepolicy/vendor במכשיר עם התוכן הבא:

    • vold.te

    מאפשרים לו לטעון את מנהל מערכת הקבצים המצטבר:

    • allow vold self:capability sys_module;
    • allow vold vendor_incremental_module:file r_file_perms;
    • allow vold vendor_incremental_module:system module_load;

    מוסיפים את כללי SE Linux הבאים לקובץ file.te הקיים שנמצא בתיקייה /system/sepolicy/vendor:

    • קובץ file.te – דוגמה מופיעה בקובץ file.te הזה.
    • מנהל מערכת קבצים מצטבר
    • type vendor_incremental_module, vendor_file_type, file_type;

    מוסיפים את כללי SE Linux הבאים לקובץ file_contents הקיים שנמצא בתיקייה /system/sepolicy/vendor:

    • קובץ file_contents – דוגמה מופיעה בקובץ file_contents הזה.
    • # Incremental file system driver
    • /vendor/lib/modules/incrementalfs\.ko
    • u:object_r:vendor_incremental_module:s0

שדרוג של מנהל הליבה

במכשירים שמשודרגים ל-Android 12 עשויה להיות מותקנת גרסה ישנה יותר של מנהל ההתקן IncFS. במכשירים האלה, מומלץ על ידי AOSP לעדכן את מנהל ההתקן IncFS לגרסה הנוכחית (במקרה הזה גרסה 2) מהסיבות הבאות:

  • הגרסה שפורסמה עם Android 11 היא ההטמעה הראשונית של IncFS, שמטרתה רק לתמוך בהתקנה של ADB.
  • ב-Android 12 נעשה שימוש ב-IncFS driver להתקנות בסטרימינג של משחקים ב-Play, שמחייבות את התכונות החדשות ואת האופטימיזציות של IncFS v2 כדי לשפר את חוויית המשתמש.
  • גרסת V1 תומכת בסטרימינג של משחקים, אבל היא גורמת לפגיעה בביצועים ולשימוש גבוה יותר בסוללה, במעבד ובזיכרון RAM בהשוואה לגרסת V2.
  • בגרסה 2 יש חוויית משתמש משופרת בסטרימינג, עם אנימציות חלקות של התקדמות, דיווח מדויק על השימוש במרחב הדיסק ומניעת הפרעה בסטרימינג של אפליקציות צד שלישי.

כדי לשדרג את מנהל ההתקן IncFS בליבה, צריך להחיל את התיקונים הבאים לליבה 4.14 או לליבה 4.19:

לגבי כל שאר הגרסאות בהתאמה אישית של הליבה, צריך להעביר (port) אחת מחבילות התיקונים. הם משפיעים רק על הספרייה fs/incfs וחלים בצורה נקייה על הקוד הקיים של v1.

ממשיכים להשתמש ב-IncFS driver באותו אופן שבו משתמשים בו ב-Android 11 המקורית, ששודרגה עכשיו, כחלק מובנה של קובץ האימג' של הליבה או כמודול נפרד. אין לשנות את ההגדרות של לוח המערכת או של מאפייני המערכת.

במכשירים חדשים שמשתמשים בתמונת ליבה של GKI, מתקבל באופן אוטומטי מנהל IncFS בגרסה האחרונה (v2), שמוגדר כחלק מתמונת הליבה. לא נדרשים שלבים נוספים.

הגדרת המודול שניתן לטעינה הוצאה משימוש ב-Android 12, והיא לא נתמכת במכשירים חדשים. מותר להשתמש בה רק בשדרוגים, או כדי להקפיא את קובץ האימג' של הספק כשהיא כבר נכללה כמודול בליבה המקורית.

הטמעות לדוגמה

אפשר להתייחס להטמעה הזו כחלק מקובץ אימג' של ליבה, או (ב-Android 11 בלבד) כמודול שניתן לטעינה.

מודול שניתן לטעינה (מכשיר Pixel 4) אמולטור Android (כחלק מתמונת הליבה)

אימות ובדיקה

מאמתים את ההטמעה באמצעות בדיקות יחידה של תכונות, בדיקות CTS ובדיקות GTS.

CTS

שימוש בכתובת CtsIncrementalInstallHostTestCases.

GTS

atest GtsIncrementalInstallTestCases:

/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java

בדיקת IncFS

  1. מגדירים סביבת פיתוח.
  2. מבצעים את משימות ההטמעה שמפורטות בקטע 'הטמעה'.
  3. מריצים את הבדיקות הידניות הבאות:
    mmma system/incremental_delivery/incfs/tests
    atest libincfs-test
    atest IncrementalServiceTest
    atest PackageManagerShellCommandTest
    PackageManagerShellCommandIncrementalTest

בדיקת IncFS באמצעות Android SDK‏ (ADB ו-apksigner)

  • מגדירים סביבת פיתוח.
  • מבצעים את משימות ההטמעה שמפורטות בקטע 'הטמעה'.
  • מבצעים אימג' את ה-build במכשיר פיזי או במהדמ.
  • יוצרים קובץ APK קיים או מקבלים אותו.
  • יוצרים מפתח חתימה לצורכי ניפוי באגים.
  • חותמים על קובץ ה-APK בפורמט החתימה v4 מהתיקייהbuild-tools.
    ./apksigner sign --ks debug.keystore game.apk
  • מתקינים את קובץ ה-APK במכשיר מהתיקייה platform-tools.
    ./adb install game.apk
דוגמה להתקנה
איור 1: דוגמה להתקנה

איך מוצאים את המבחנים האלה