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

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

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

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

הטמעה

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

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

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

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

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

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

  1. מגדירים את מכונת הפיתוח כדי לבצע build של הליבה.
  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 או את CONFIG_INCREMENTAL_FS=m בתחתית הקובץ defconfig. ב-Android 11 בלבד. כדי לראות דוגמה, אפשר ללחוץ על אחד מהקישורים הבאים:
  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 Rules.
  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 – דוגמה אפשר לראות ב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 להתקנות סטרימינג של משחקי Play. כדי לשפר את חוויית המשתמש, נדרשים התכונות והאופטימיזציות החדשות של IncFS גרסה 2.
  • גרסה 1 תומכת בסטרימינג של משחקים, אבל הביצועים שלה פחות טובים והיא צורכת יותר סוללה, מעבד וזיכרון RAM בהשוואה לגרסה 2.
  • גרסה 2 מספקת חוויית משתמש משופרת לסטרימינג, עם אנימציות חלקות של התקדמות, דיווח מדויק על השימוש בנפח הדיסק ומניעת הפרעות לסטרימינג של אפליקציות של צד שלישי.

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

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

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

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

ההגדרה של מודול שאפשר לטעון הוצאה משימוש ב-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 קיים.
  • יוצרים מפתח חתימה לניפוי באגים.
  • חותמים על ה-APK בפורמט חתימה v4 מהתיקייהbuild-tools.
    ./apksigner sign --ks debug.keystore game.apk
  • מתקינים את ה-APK במכשיר מהתיקייה platform-tools.
    ./adb install game.apk
דוגמה להתקנה
איור 1: דוגמה להתקנה

איפה אפשר למצוא את הבדיקות האלה