מודול הליבה של מערכת הקבצים המצטברת (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.
בהמשך מפורטים השינויים הנדרשים להטמעה:
- מגדירים את מכונת הפיתוח כדי ליצור את הליבה.
- מטרגטים את הליבה המשותפת מההסתעפות
common-android-mainline
.repo init -u https://android.googlesource.com/kernel/manifest -b common-android-mainline
repo sync
- מוודאים שהשינויים הבאים הנדרשים ל-IncFS נמצאים ב-checkout של ההסתעפות:
- https://android-review.googlesource.com/c/kernel/common/+/1222869/
- https://android-review.googlesource.com/c/kernel/common/+/1222870
- https://android-review.googlesource.com/c/kernel/common/+/1222871
- https://android-review.googlesource.com/q/%2522ANDROID:+Incremental+fs:%2522+branch:android-mainline+status:merg
- מוסיפים את הערך
CONFIG_INCREMENTAL_FS=y
או, ל-Android 11 בלבד, את הערךCONFIG_INCREMENTAL_FS=m
לתחתית הקובץdefconfig
. כדי לראות דוגמה, אפשר ללחוץ על אחד מהקישורים הבאים: - יצירת הליבה
- הטמעת הליבה בגרסת build של קובץ האימג' של מכשיר Android.
- במכשיר Android היעד, מוסיפים לקובץ
device.mk
את אחת מהשורות הבאות של מאפייני המערכת הספציפיים לספק (אופציונלי במכשירים שהושקו עם Android 12 ואילך): PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=yes
PRODUCT_PROPERTY_OVERRIDES += \
ro.incremental.enable=module:/vendor/lib/modules/incrementalfs.ko
- קבצים לדוגמה של
device.mk
למהדורת Android ול-Pixel 4. - ב-Android 11 בלבד: אם אתם משתמשים ב-
CONFIG_INCREMENTAL_FS=m
, מוסיפים כללי SE Linux. 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;
-
קובץ
file.te
– דוגמה מופיעה בקובץfile.te
הזה. - מנהל מערכת קבצים מצטבר
type vendor_incremental_module, vendor_file_type, file_type;
-
קובץ
file_contents
– דוגמה מופיעה בקובץfile_contents
הזה. # Incremental file system driver
/vendor/lib/modules/incrementalfs\.ko
u:object_r:vendor_incremental_module:s0
כשמשתמשים ב-CONFIG_INCREMENTAL_FS=y
, צריך לצרף לקובץ אחד מהפרטים הבאים:
כשמשתמשים ב-CONFIG_INCREMENTAL_FS=m
(ב-Android 11 בלבד), צריך לצרף לקובץ אחד מהקובצים הבאים:
יוצרים קובץ vold.te
ומוסיפים אותו לתיקייה /system/sepolicy/vendor
במכשיר עם התוכן הבא:
מאפשרים לו לטעון את מנהל מערכת הקבצים המצטבר:
מוסיפים את כללי SE Linux הבאים לקובץ file.te
הקיים שנמצא בתיקייה /system/sepolicy/vendor
:
מוסיפים את כללי SE Linux הבאים לקובץ file_contents
הקיים שנמצא בתיקייה /system/sepolicy/vendor
:
שדרוג של מנהל הליבה
במכשירים שמשודרגים ל-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:
- תיקון ל-Kernel 4.14
- תיקון ל-Kernel 4.19
לגבי כל שאר הגרסאות בהתאמה אישית של הליבה, צריך להעביר (port) אחת מחבילות התיקונים. הם משפיעים רק על הספרייה fs/incfs
וחלים בצורה נקייה על הקוד הקיים של v1.
ממשיכים להשתמש ב-IncFS driver באותו אופן שבו משתמשים בו ב-Android 11 המקורית, ששודרגה עכשיו, כחלק מובנה של קובץ האימג' של הליבה או כמודול נפרד. אין לשנות את ההגדרות של לוח המערכת או של מאפייני המערכת.
במכשירים חדשים שמשתמשים בתמונת ליבה של GKI, מתקבל באופן אוטומטי מנהל IncFS בגרסה האחרונה (v2), שמוגדר כחלק מתמונת הליבה. לא נדרשים שלבים נוספים.
הגדרת המודול שניתן לטעינה הוצאה משימוש ב-Android 12, והיא לא נתמכת במכשירים חדשים. מותר להשתמש בה רק בשדרוגים, או כדי להקפיא את קובץ האימג' של הספק כשהיא כבר נכללה כמודול בליבה המקורית.
הטמעות לדוגמה
אפשר להתייחס להטמעה הזו כחלק מקובץ אימג' של ליבה, או (ב-Android 11 בלבד) כמודול שניתן לטעינה.
מודול שניתן לטעינה (מכשיר Pixel 4)- הוספת גרסת build מוכנה מראש של מודול הליבה
- הוספה והפעלה של שינוי של מאפיין מערכת של מודול ליבה במכשיר
- עדכון הכללים של SE Linux
אימות ובדיקה
מאמתים את ההטמעה באמצעות בדיקות יחידה של תכונות, בדיקות CTS ובדיקות GTS.
CTS
שימוש בכתובת
CtsIncrementalInstallHostTestCases
.
GTS
atest GtsIncrementalInstallTestCases
:
/gts-tests/tests/packageinstaller/incremental/src/com/google/android/packageinstaller/incremental/gts/IncrementalInstallerTest.java
בדיקת IncFS
- מגדירים סביבת פיתוח.
- מבצעים את משימות ההטמעה שמפורטות בקטע 'הטמעה'.
- מריצים את הבדיקות הידניות הבאות:
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

איך מוצאים את המבחנים האלה
- /android/kernel/common/tools/testing/selftests/filesystems/incfs/
- /android/system/incremental_delivery/incfs/tests/incfs_test.cpp
- /android/cts/tests/tests/content/src/android/content/pm/cts/PackageManagerShellCommandIncrementalTest.java