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

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

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

งานที่ Zygote ดำเนินการมีดังนี้

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

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

    • หากเปิดใช้พูล USAP ในอุปกรณ์ ให้ทำดังนี้

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

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

เปิดใช้พูล 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. เพิ่มเส้นทางไปยังรายการที่อนุญาตสำหรับไฟล์ที่เปิดอยู่