เกี่ยวกับกระบวนการ Zygote

Zygote เป็นกระบวนการในระบบปฏิบัติการ Android ที่ทำหน้าที่เป็นรูทของกระบวนการทั้งหมดของระบบและแอปที่มีอินเทอร์เฟซไบนารีของแอปพลิเคชัน (ABI) เดียวกัน

ในอุปกรณ์รุ่นใหม่ เช่น Pixel 7 ขึ้นไป จะมีกระบวนการ Zygote แบบ 64 บิต นอกจากนี้ ยังมี WebView Zygote สำหรับ ABI หลัก ซึ่งเป็น Zygote เฉพาะ ที่มีไลบรารีและทรัพยากรเฉพาะสำหรับกระบวนการที่เรียกใช้ WebView

โดย Zygote จะดำเนินการต่อไปนี้

  1. Init Daemon จะสร้างกระบวนการ Zygote เมื่อระบบปฏิบัติการ Android เริ่มต้น ในระบบสถาปัตยกรรมคู่บางระบบ จะมีการสร้างกระบวนการ Zygote 2 รายการ (64 บิตและ 32 บิต) หน้านี้ครอบคลุมเฉพาะระบบสถาปัตยกรรมเดียว

  2. Zygote สามารถสร้างกระบวนการที่เรียกว่ากระบวนการแอปที่ไม่เฉพาะเจาะจง (USAP) ได้ทันที หรือรอสร้างกระบวนการตามที่แอปพลิเคชันต้องการ ต้องเปิดใช้ตัวเลือกแรกผ่านพร็อพเพอร์ตี้ของระบบหรือคำสั่ง Android Debug Bridge ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่า Zygote ให้สร้างกระบวนการทันทีได้ที่เปิดใช้พูลกระบวนการของแอปที่ไม่ได้ปรับแต่ง

    • หากเปิดใช้กลุ่ม USAP ในอุปกรณ์

      1. เซิร์ฟเวอร์ระบบใช้ Unix Domain Socket เพื่อเชื่อมต่อกับ USAP ที่พร้อมใช้งานจากพูล เซิร์ฟเวอร์ระบบจะขอ ให้กำหนดค่า USAP ล่วงหน้าสำหรับการใช้งานแอปพลิเคชันโดยการเปลี่ยน รหัส (PID), cgroup และข้อมูลอื่นๆ ของกระบวนการ
      2. เมื่อ USAP กำหนดค่าล่วงหน้าเสร็จแล้ว จะตอบกลับ เซิร์ฟเวอร์ระบบด้วย PID
      3. เมื่อแอปพลิเคชันใช้ USAP อย่างใดอย่างหนึ่ง USAP นั้นจะไม่ถือเป็นส่วนหนึ่งของพูลอีกต่อไป เมื่อพูลมี USAP เหลือ 1 รายการหรือน้อยกว่านั้น Zygote จะเติม USAP ใหม่ลงในพูล
    • หาก Zygote สร้างกระบวนการโดยใช้การประเมินแบบเลื่อน ให้ทำดังนี้

      1. เซิร์ฟเวอร์ระบบจะได้รับคำสั่งว่าแอปต้องการกระบวนการ
      2. เซิร์ฟเวอร์ระบบใช้ Unix Domain Socket เพื่อส่งคำสั่งไปยัง 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. เพิ่มเส้นทางไปยังรายการที่อนุญาตสำหรับไฟล์ที่เปิด