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

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

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

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

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

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

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

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

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

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

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

  • למתארים של קבצים שצוינו:

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