Zygote הוא תהליך במערכת ההפעלה Android שפועל כבסיס לכל התהליכים של המערכת והאפליקציות עם אותו ממשק בינארי של אפליקציה (ABI).
במכשירים מודרניים, כמו Pixel 7 ואילך, יש תהליך Zygote של 64 ביט. בנוסף, יש את WebView Zygote עבור ה-ABI הראשי, שהוא Zygote מיוחד שמכיל ספריות ומשאבים ספציפיים לתהליכים שמריצים WebViews.
אלה המשימות שמבצע תהליך ה-Zygote:
הדמון init יוצר את תהליך Zygote כשמערכת ההפעלה Android עוברת אתחול. במערכות מסוימות עם ארכיטקטורה כפולה, נוצרים שני תהליכי Zygote (64 ביט ו-32 ביט). הדף הזה מתייחס רק למערכות עם ארכיטקטורה יחידה.
תהליך Zygote יכול ליצור באופן מיידי תהליכים שנקראים תהליכי אפליקציה לא מיוחדים (USAP) או להמתין ליצירת תהליכים לפי הצורך של האפליקציות. כדי להשתמש באפשרות הראשונה, צריך להפעיל אותה באמצעות מאפיין מערכת או פקודה של ממשק הגישור של Android (ADB). מידע נוסף על הגדרת Zygote ליצירת תהליכים באופן מיידי זמין במאמר בנושא הפעלת מאגר של תהליכי אפליקציות לא ייעודיים .
אם מאגר כתובות ה-USAP מופעל במכשיר:
- שרת המערכת משתמש בשקע דומיין של Unix כדי להתחבר ל-USAP זמין ממאגר. השרת של המערכת מבקש שה-USAP יוגדר מראש לשימוש באפליקציה על ידי שינוי המזהה (PID) של התהליך, קבוצת הבקרה (cgroup) ופרטים אחרים.
- כשה-USAP מסיים את ההגדרה מראש, הוא משיב לשרת המערכת עם ה-PID.
- כשאפליקציה תופסת אחת מכתובות ה-USAP האלה, כתובת ה-USAP כבר לא חלק מהמאגר. כשהמאגר מגיע ל-USAP אחד או פחות, תהליך ה-Zygote ממלא מחדש את המאגר ב-USAP חדשים.
אם תהליך Zygote יוצר תהליכים באמצעות הערכה עצלה:
- שרת המערכת מקבל פקודה שאפליקציה צריכה תהליך.
- שרת המערכת משתמש בשקע דומיין של Unix כדי לשלוח פקודה ל-Zygote המתאים.
- תהליך ה-Zygote מתפצל ומשנה את ה-PID, את ה-cgroup ומידע אחר.
- בסיום התהליך, ה-PID נשלח חזרה אל Zygote, ומשם הוא מועבר חזרה אל שרת המערכת.
הפעלת מאגר USAP
כדי להפעיל את השימוש במאגר USAP, מבצעים אחת מהפעולות הבאות:
מגדירים את מאפיין המערכת
dalvik.vm.usap_pool_enabledלערךtrueב-/build/make/target/product/runtime_libart.mk.מריצים את הפקודה הבאה:
adb shell am broadcast -a \"com.google.android.gms.phenotype.FLAG_OVERRIDE\" --es package \"com.google.android.platform.runtime_native\" --es user \"\*\" --esa flags \"usap_pool_enabled\" --esa values \"true\" --esa types \"string\" com.google.android.gms
כשהתכונה הזו מופעלת, כל תהליך Zygote שומר על מאגר של תהליכים מסועפים שמבצעים את החלקים בתהליך הפעלת האפליקציה שלא תלויים באפליקציה.
פתרון בעיות ב-Zygote
בקטע הזה מפורטים פתרונות לבעיות שקשורות ל-Zygote.
תהליך Zygote קורס
אם המכשיר לא מופעל מחדש בצורה תקינה ויומני הרישום או דוחות הקריסה מציגים בעיות ב-Zygote, סביר להניח שביצעתם שינוי לאחרונה שגורם לקריסה של initd או של שרת המערכת. תיקון הקוד אמור לפתור את הבעיה.
דחיות של SELinux או כשלים בקלט/פלט
תהליך Zygote מקפיד על היגיינת מתאר הקובץ בגבולות התהליך. אם יש מתארים של קבצים בזמן הפיצול אבל הם לא ברשימת ההיתרים, אנחנו משתמשים בקריאת המערכת dup כדי /dev/null ולמנוע שימוש לא מכוון במתארים של קבצים שנשמרו במטמון כדי לגשת לקבצים שנפתחו לאחרונה.
אם אתם מבצעים שינויים במסגרת שכוללים ניסיון לטעון משאבים ל-Zygote, ואתם מקבלים דחיות של SELinux או כשלים בקלט/פלט:
לתיאורי קבצים ללא שם, צריך לכלול את תיאורי הקבצים בווקטור
fds_to_ignoreכשקוראים ל-Restat.למתארים של קבצים שצוינו:
- עריכה של
WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp. - מוסיפים את הנתיב לרשימת ההיתרים של קבצים פתוחים.
- עריכה של