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

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

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

אלה המשימות שמבצע תהליך הזיגוטה:

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

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

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

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

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

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

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

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

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