שימוש בהגדרות התצורה הבאות כבסיס לליבה (kernel) של Android
הגדרה אישית. ההגדרות מאורגנות ב-.cfg
קבצים ל-android-base
,
android-base-ARCH
, וגם
android-recommended
:
- האפשרויות של
android-base
מפעילות את תכונות הליבה ב-Android צריך להיות מוגדר כפי שנקבע על ידי כל המכשירים. - אפשרויות של
android-base-ARCH
מאפשרות את הליבה תכונות Android וצריך להגדיר אותן כפי שצוין על ידי כל המכשירים של של הארכיטקטורה ARCH. לא לכל הארכיטקטורות יש קובץ תואם של אפשרויות שספציפיות לארכיטקטורה. אם בארכיטקטורה אין מסוים, אין לו תצורת ליבה (kernel) נוספת שספציפית לארכיטקטורה הדרישות ל-Android. android-recommended
האפשרויות האלה מאפשרות גישה מתקדמת ל-Android ותכונות אופציונליות עבור מכשירים.
קובצי התצורה האלה ממוקמים
kernel/configs
מאגר משתמשים בקבוצת קובצי התצורה שתואמת לגרסה של
בליבה (kernel) שבה אתם משתמשים.
לפרטים על אמצעי בקרה שכבר ננקטו כדי לחזק את הליבה (kernel) מכשירים, ראה מערכת אבטחת ליבה (kernel). פרטים על ההגדרות הנדרשות זמינים במאמר מסמך הגדרת תאימות ל-Android (CDD).
יצירת הגדרת ליבה (kernel)
במכשירים בפורמט defconfig
מינימליסטי, צריך להשתמש במאפיין
סקריפט merge_config.sh
בעץ הליבה כדי להפעיל אפשרויות:
ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg
הפעולה הזו יוצרת קובץ .config
שבו אפשר להשתמש כדי לשמור קובץ חדש
defconfig
או ליצור ליבה (kernel) חדשה עם תכונות של Android
מופעל.
דרישות נוספות להגדרת ליבה (kernel)
במקרים מסוימים, מנהל הפלטפורמה יכול לבחור מתוך מספר ליבה (kernel) כדי לעמוד בתלות של Android. יחסי תלות כאלה לא יכולים מבוטאת בקובצי המקטעים של תצורת הליבה (שתוארו למעלה), כי הפורמט של הקבצים האלה לא תומך בביטויים לוגיים. ב-Android מגרסה 9 גבוהה יותר, חבילה לבדיקת תאימות (CTS) ו חבילת הבדיקה של הספק (VTS) מאמתת הדרישות הבאות מתקיימות:
CONFIG_OF=y
אוCONFIG_ACPI=y
- ליבות 4.4 ו-4.9 יש
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
או שהם כוללים גם אתCONFIG_MEMCG=y
וגם אתCONFIG_MEMCG_SWAP=y
CONFIG_DEBUG_RODATA=y
אוCONFIG_STRICT_KERNEL_RWX=y
CONFIG_DEBUG_SET_MODULE_RONX=y
אוCONFIG_STRICT_MODULE_RWX=y
- ל-ARM64 בלבד:
CONFIG_ARM64_SW_TTBR0_PAN=y
אוCONFIG_ARM64_PAN=y
בנוסף, צריך להגדיר את האפשרות CONFIG_INET_UDP_DIAG
כ-
y
ל-4.9 ליבות ב-Android 9 ואילך.
הפעלת האפשרויות למצב אירוח USB
לאודיו במצב אירוח USB, מפעילים את האפשרויות הבאות:
CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y # CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver
ל-MIDI במצב מארח USB, צריך להפעיל את האפשרות הבאה:
CONFIG_SND_USB_MIDI=y
Seccomp BPF עם TSYNC
Secure Computing Berkeley Packet Filter (Seccomp BPF) הוא אבטחת ליבה שמאפשרת ליצור ארגזי חול (Sandbox) שמגדירים את ההקשר שעשוי להוביל לקריאות מערכת. סנכרון השרשור (TSYNC) מאפשרת להשתמש ב-Seccomp BPF מתוכנות עם ריבוי שרשורים. הזה היכולת מוגבלת לארכיטקטורות עם תמיכה ב-Seccomp ב-upstream (ARM, ARM64 , x86 ו-x86_64).
דימון (daemon) ל-Android בזמן אמת
Android 10 כולל את הדימון (daemon) ל-Android Live-lock
(llkd
), שמטרתו לזהות ולצמצם מבוי סתום של ליבה (kernel).
לקבלת פרטים על השימוש בllkd
, אפשר לעיין במאמר
דימון (daemon) ל-Android בזמן אמת.
vDSO32 ב-ARM64
אובייקט וירטואלי משותף דינמי (vDSO) הוא חלופה לקריאות מערכת אשר,
אם משתמשים בהם ומגדירים אותם בצורה נכונה, הם יכולים להפחית את עלויות המחזוריות. במכשירי Android
בגרסה 10 נוספה תמיכה ב-vDSO32 בליבות של 64 ביט (Android
כבר יש תמיכה ב-vDSO64 בליבות של 64 ביט וב-vDSO32 בליבות של 32 ביט). באמצעות
vDSO32 (CONFIG_VDSO_COMPAT
) בארכיטקטורת ARM64 מספק
עלייה של 0.4 אחוזים בחיי הסוללה ושיפורים נוספים בביצועים.
קהילת Linux פועלת באופן פעיל על
איחוד vDSO
בארכיטקטורות שונות. אפשר להגדיר vDSO בליבה (kernel) של Linux על ידי הפעלה של
vDSO32 עם CONFIG_COMPAT
ועם
CONFIG_CROSS_COMPILE_COMPAT_VDSO
עם שלישיית המהדר של Arm32.
צוות Android Kernel ביצע החזרה של גרסאות ישנות יותר של סדרת התיקונים של vDSO
במכשירי Pixel, כך שאפשר למצוא דוגמאות בגרסאות build של ליבה (kernel) של Pixel
(נתיב LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
,
הפניה אל CROSS_COMPILE_ARM32
, וגם
CONFIG_CROSS_COMPILE_ARM32
תצורה).
הגדרה של נפח RAM נמוך
כוונון הליבה ו-ActivityManager כדי לצמצם דרישה ישירה
דרישה ישירה מתרחשת כאשר תהליך או הליבה (kernel) מנסים להקצות דף
של הזיכרון (באופן ישיר או בגלל כשל בדף חדש) והליבה (kernel)
נוצלו כל הזיכרון הפנוי. לשם כך נדרשת הליבה כדי לחסום את ההקצאה
בזמן שמפנה דף. כתוצאה מכך בדרך כלל נדרש קלט/פלט (I/O) של הדיסק
דף מלוכלך בגיבוי קובץ או צריך להמתין עד ש-lowmemorykiller
יפסיק
תהליך האימות. כתוצאה מכך, עלולים להופיע קלט/פלט (I/O) נוסף בכל שרשור, כולל שרשור בממשק המשתמש.
כדי למנוע שימוש ישיר, בליבה יש סימני מים שמפעילים
kswapd
או דרישה מחדש ברקע. זהו שרשור שמטרתו
חופשיים, כך שבפעם הבאה שיקצה שרשור אמיתי, הוא יוכל להצליח במהירות.
סף ברירת המחדל להפעלת בקשה חוזרת ברקע הוא נמוך למדי, 2MB במכשיר עם 2GB ו-636KB במכשיר עם נפח 512MB. ליבה (kernel) דורש רק כמה מגה-בייט של זיכרון ברקע. כלומר כל תהליך שמקצה במהירות יותר מכמה מגה-בייט להשיג תגובה ישירה (direct reclaim).
תמיכה בתוכנת ליבה (kernel) מתווספת בהסתעפות הליבה של Android-3.4 כ
patch 92189d47f66c67e5fd92eafaa287e153197a454f (הוספת עוד kbytes בחינם
ניתן לכוונון"). בחירת התיקון הזה בליבה (kernel) של המכשיר מאפשרת
ActivityManager
כדי להורות לליבה (kernel) לנסות לשמור שלושה במסך מלא
32 מאגרי bpp ללא זיכרון.
אפשר להגדיר את ערכי הסף האלה באמצעות הפקודה config.xml
.
<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable in the kernel (if it exists). A high value increases the amount of memory that the kernel tries to keep free, reducing allocation time and causing the lowmemorykiller to kill earlier. A low value allows more memory to be used by processes but may cause more allocations to block waiting on disk I/O or lowmemorykiller. Overrides the default value chosen by ActivityManager based on screen size. 0 prevents keeping any extra memory over what the kernel keeps by default. -1 keeps the default. --> <integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes tunable in the kernel (if it exists). 0 uses the default value chosen by ActivityManager. A positive value increases the amount of memory that the kernel tries to keep free, reducing allocation time and causing the lowmemorykiller to kill earlier. A negative value allows more memory to be used by processes but may cause more allocations to block waiting on disk I/O or lowmemorykiller. Directly added to the default value chosen by ActivityManager based on screen size. --> <integer name="config_extraFreeKbytesAdjust">0</integer>
כוונון LowMemoryKiller
ActivityManager
מגדיר את ערכי הסף של
LowMemoryKiller
כדי לעמוד בציפיות של מערך העבודה
דפים בגיבוי קבצים (דפים שנשמרו במטמון) שנדרשים כדי להריץ את התהליכים בכל רמת עדיפות
ברמת הקטגוריה. אם למכשיר יש דרישות גבוהות עבור ערכת העבודה, למשל
אם ממשק המשתמש של הספק דורש עוד זיכרון או אם נוספו עוד שירותים,
שאפשר להגדיל את סף החיוב.
אפשר לצמצם את ערכי הסף אם נשמר יותר מדי זיכרון דפים בגיבוי קבצים, כך שתהליכי רקע נמחקים לפני זמן רב עומס דיסקים יתרחש מכיוון שהמטמון קטן מדי.
<!-- Device configuration setting the minfree tunable in the lowmemorykiller in the kernel. A high value causes the lowmemorykiller to fire earlier, keeping more memory in the file cache and preventing I/O thrashing, but allowing fewer processes to stay in memory. A low value keeps more processes in memory but may cause thrashing if set too low. Overrides the default value chosen by ActivityManager based on screen size and total memory for the largest lowmemorykiller bucket, and scaled proportionally to the smaller buckets. -1 keeps the default. --> <integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the lowmemorykiller in the kernel. A high value causes the lowmemorykiller to fire earlier, keeping more memory in the file cache and preventing I/O thrashing, but allowing fewer processes to stay in memory. A low value keeps more processes in memory but may cause thrashing if set too low. Directly added to the default value chosen by ActivityManager based on screen size and total memory for the largest lowmemorykiller bucket, and scaled proportionally to the smaller buckets. 0 keeps the default. --> <integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>