הגדרת הליבה

שימוש בהגדרות התצורה הבאות כבסיס לליבה (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>