מידע על תהליכי Zygote

Zygote הוא תהליך במערכת ההפעלה Android שמשמש כשורש של כל תהליכי המערכת והאפליקציות עם אותו ממשק בינארי של אפליקציה (ABI).

במכשירים מודרניים, כמו Pixel 7 ואילך, יש תהליך Zygote של 64 ביט. בנוסף, יש את WebView Zygote ל-ABI הראשי, שהוא Zygote מיוחד שמכיל ספריות ומשאבים ספציפיים לתהליכים שמפעילים רכיבי WebView.

אלה המשימות שה-Zygote מבצע:

  1. הדימון init יוצר את תהליך Zygote כשמערכת ההפעלה של Android מאותחלת. במערכות מסוימות עם ארכיטקטורה כפולה, נוצרים שני תהליכי Zygote (אחד של 64 ביט ואחד של 32 ביט). הדף הזה מכיל מידע על מערכות עם ארכיטקטורה יחידה בלבד.

  2. ל-Zygote יש אפשרות ליצור באופן מיידי תהליכים שנקראים תהליכי אפליקציה לא מיוחדים (USAP), או להמתין ליצירת תהליכים לפי הצורך של האפליקציות. צריך להפעיל את האפשרות הראשונה באמצעות מאפיין מערכת או באמצעות פקודה של Android Debug Bridge. מידע נוסף על הגדרת Zygote ליצירת תהליכים באופן מיידי זמין במאמר הפעלת מאגר של תהליכי אפליקציות לא ייעודיים .

    • אם המאגר של USAP מופעל במכשיר:

      1. שרת המערכת משתמש ביציאה של דומיין Unix כדי להתחבר ל-USAP זמין ממאגר. שרת המערכת מבקש שה-USAP יוגדר מראש לשימוש באפליקציה על ידי שינוי המזהה (PID), ה-cgroup והמידע האחר של התהליך.
      2. כשה-USAP מסיים את ההגדרה המוקדמת, הוא משיב לשרת המערכת עם ה-PID.
      3. כשאפליקציה תופסת את אחד מ-USAP האלה, הוא כבר לא חלק מהמאגר. כשהבריכה מגיעה ל-USAP אחד או פחות, ה-Zygote מאכלס אותה ב-USAP חדשים.
    • אם ה-Zygote יוצר תהליכים באמצעות הערכה עצלה:

      1. שרת המערכת מקבל פקודה על כך שאפליקציה זקוקה לתהליך.
      2. שרת המערכת משתמש ביציאה של דומיין Unix כדי לשלוח פקודה ל-Zygote המתאים.
      3. Zygote יוצר צאצא של התהליך ומשנה את ה-PID, את ה-cgroup ומידע אחר.
      4. בסיום התהליך, הוא שולח את ה-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 או כשלים של IO

ל-Zygote יש דרישות ספציפיות לגבי תקינות של מתארי קבצים בגבולות תהליכים. כשמתוארי קבצים נמצאים בזמן הפיצול אבל לא ברשימה המורשית, אנחנו משתמשים בקריאה למערכת dup אל /dev/null כדי למנוע שימוש לא מכוון במתארי קבצים שנשמרו במטמון כדי לגשת לקבצים שנפתחו לאחרונה.

אם מבצעים שינויים במסגרת שכוללים ניסיון לטעון משאבים ל-Zygote, ומקבלים דחיות של SELinux או כשלים ב-IO:

  • למאפייני קובץ ללא שם, צריך לכלול את מאפייני הקובץ בוקטור fds_to_ignore כשקוראים ל-Restat.

  • למאפייני קובץ עם שם:

    1. עורכים את WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp.
    2. מוסיפים את הנתיב לרשימת ההיתרים של קבצים פתוחים.