תוכלו להשתמש בהגדרות התצורה הבאות כבסיס לתצורת ליבה (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) שבה משתמשים.
פרטים על אמצעי הבקרה שכבר ננקטו כדי לחזק את הליבה במכשירים מפורטים במאמר אבטחת המערכת והליבה. לפרטים על ההגדרות הנדרשות, אפשר לעיין במאמר מסמך הגדרת התאימות של Android (CDD).
יצירת הגדרות הליבה
במכשירים עם פורמט 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
חדש או כדי לקמפל ליבה חדשה עם הפיצ'רים של Android מופעלים.
דרישות נוספות להגדרת ליבה (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 בשידור חי (llkd
), שמיועד לזהות ולצמצם מבוי סתום של ליבה (kernel).
פרטים על השימוש ב-llkd
זמינים במאמר Android live-lock daemon.
vDSO32 ב-ARM64
אובייקט משותף דינמי וירטואלי (vDSO) הוא חלופה לשיחות מערכת, ששימוש נכון בהגדרה שלו יכול להפחית את עלויות המחזור. מערכת Android
10 מוסיפה תמיכה ב-vDSO32 בליבות של 64 ביט (Android כבר תומך ב-vDSO64 בליבות של 64 ביט וב-vDSO32 בליבות של 32 ביט). השימוש ב-vDSO32 (CONFIG_VDSO_COMPAT
) בארכיטקטורת ARM64 מאפשר להאריך את חיי הסוללה ב-0.4% ולשפר את הביצועים בדרכים נוספות.
קהילת Linux פועלת באופן פעיל כדי לאחד את vDSOs בארכיטקטורות שונות. אפשר להגדיר vDSO בליבה (kernel) של Linux על ידי הפעלת vDSO32 עם CONFIG_COMPAT
ו-CONFIG_CROSS_COMPILE_COMPAT_VDSO
עם משולש המהדר של Arm32.
צוות הליבה של Android העביר גרסאות ישנות יותר של סדרת התיקונים של vDSO למכשירי Pixel, כך שאפשר למצוא דוגמאות ב-builds של הליבה של Pixel (LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
נתיב, CROSS_COMPILE_ARM32
הפניה ו-CONFIG_CROSS_COMPILE_ARM32
תצורה).
הגדרה של נפח RAM נמוך
שינוי ההגדרות של הליבה ושל ActivityManager כדי לצמצם את החזרת שטח זיכרון ישירה
משיכת זיכרון ישירה מתרחשת כשתהליך או הליבה מנסים להקצות דף זיכרון (באופן ישיר או בגלל שגיאה בדף חדש) והליבה כבר השתמשה בכל הזיכרון הפנוי שזמין. לשם כך, הליבה צריכה לחסום את ההקצאה בזמן שהיא משחררת דף. כתוצאה מכך, בדרך כלל הקלט/פלט (I/O) של הדיסק צריך למחוק דף מלוכלך שמגובה בקובץ או להמתין עד ש-lowmemorykiller
יפסיק תהליך. הפעולה הזו עלולה לגרום לפעולות קלט/פלט נוספות בכל שרשור, כולל שרשור של ממשק משתמש.
כדי למנוע משיכת זיכרון ישירה, הליבה כוללת סימני מים שמפעילים את kswapd
או משיכת זיכרון ברקע. זהו חוט שמנסה לפנות דפים כדי שבפעם הבאה שחוט אמיתי יקצה, הוא יוכל להצליח במהירות.
ערך הסף שמוגדר כברירת מחדל להפעלת שחזור זיכרון ברקע הוא נמוך למדי, כ-2MB במכשיר בנפח 2GB ו-636KB במכשיר בנפח 512MB. הליבה משתמשת רק בכמה מגה-בייט של זיכרון ברקע. כלומר, כל תהליך שמקצה במהירות יותר מכמה מגה-בייטים יגיע במהירות למצב של משיכת זיכרון ישירה.
תמיכה ב-kernel tunable מתווספת בהסתעפות הליבה של Android-3.4 כתיקון 92189d47f66c67e5fd92eafaa287e153197a454f ("הוספת עוד kbytes בחינם"). הוספת התיקון הזה לליבה של המכשיר מאפשרת ל-ActivityManager
להורות לליבה לנסות לשמור שלושה מאגרי זיכרון פנויים של 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>
Tune 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>