מידע על תהליכי 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 זמין ממאגר. שרת המערכת מבקש שה-USP יוגדר מראש לשימוש באפליקציות, על ידי שינוי של מזהה התהליך (PID), ה-cgroup ומידע אחר.
      2. כשה-USAP מסיים את ההגדרה מראש, הוא משיב לשרת המערכת עם ה-PID.
      3. כשאפליקציה מסוימת נמצאת באחד מהמקורות האלה, ה-USP לא משויך יותר למאגר. כשהבריכה מגיעה ל-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, סביר להניח שביצעתם לאחרונה שינוי שגרם לקריסה של שרת המערכת או תיקון הקוד אמור לפתור את הבעיה.

דחיות של SELinux או כשלים ב-IO

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

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

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

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

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