Zygote เป็นกระบวนการในระบบปฏิบัติการ Android ที่ทำหน้าที่เป็นรูทของกระบวนการทั้งหมดของระบบและแอปที่มีอินเทอร์เฟซไบนารีของแอปพลิเคชัน (ABI) เดียวกัน
ในอุปกรณ์สมัยใหม่ เช่น Pixel 7 ขึ้นไป จะมีกระบวนการ Zygote แบบ 64 บิต นอกจากนี้ยังมี WebView Zygote สำหรับ ABI หลัก ซึ่งเป็น Zygote เฉพาะทางที่มีไลบรารีและทรัพยากรสำหรับกระบวนการที่เรียกใช้ WebView โดยเฉพาะ
งานที่ Zygote ดำเนินการมีดังนี้
เดรัม init จะสร้างกระบวนการ Zygote เมื่อระบบปฏิบัติการ Android เริ่มต้น ในระบบแบบ 2 สถาปัตยกรรมบางระบบ ระบบจะสร้างกระบวนการ Zygote 2 รายการ (64 บิตและ 32 บิต) หน้านี้ครอบคลุมเฉพาะระบบสถาปัตยกรรมแบบเดี่ยว
Zygote สามารถสร้างกระบวนการที่เรียกว่าโปรเซสแอปแบบไม่เชี่ยวชาญ (USAP) ได้ทันทีหรือรอสร้างกระบวนการตามที่แอปพลิเคชันต้องการ โดยต้องเปิดใช้ตัวเลือกแรกผ่านพร็อพเพอร์ตี้ของระบบหรือคําสั่ง Android Debug Bridge ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่า Zygote ให้สร้างกระบวนการทันทีได้ที่หัวข้อเปิดใช้พูลกระบวนการแอปที่ไม่เฉพาะเจาะจง
หากเปิดใช้พูล USAP ในอุปกรณ์ ให้ทำดังนี้
- เซิร์ฟเวอร์ระบบใช้ซ็อกเก็ตโดเมน Unix เพื่อเชื่อมต่อกับ USAP ที่พร้อมใช้งานจากพูล เซิร์ฟเวอร์ระบบจะขอให้กําหนดค่า USAP ล่วงหน้าสําหรับการใช้งานแอปพลิเคชันโดยเปลี่ยนรหัส (PID) ของกระบวนการ, cgroup และข้อมูลอื่นๆ
- เมื่อกำหนดค่า USAP ล่วงหน้าแล้ว ระบบจะตอบกลับไปยังเซิร์ฟเวอร์ระบบด้วย PID
- เมื่อแอปพลิเคชันใช้ USAP รายการใดรายการหนึ่งเหล่านี้ USAP ดังกล่าวจะไม่อยู่ในพูลอีกต่อไป เมื่อกลุ่มมี USAP เหลือน้อยกว่าหรือเท่ากับ 1 รายการ Zygote จะเพิ่ม USAP ใหม่ลงในกลุ่ม
หาก Zygote สร้างกระบวนการโดยใช้การประเมินแบบเลื่อนเวลา
- เซิร์ฟเวอร์ระบบได้รับคําสั่งว่าแอปจําเป็นต้องดำเนินการ
- เซิร์ฟเวอร์ระบบใช้ซ็อกเก็ตโดเมน Unix เพื่อส่งคำสั่งไปยัง Zygote ที่เหมาะสม
- Zygote จะแยกกระบวนการและเปลี่ยน PID, cgroup และข้อมูลอื่นๆ
- เมื่อการประมวลผลเสร็จสมบูรณ์ ระบบจะส่ง 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
สําหรับตัวระบุไฟล์ที่มีชื่อ ให้ทำดังนี้
- แก้ไข
WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp
- เพิ่มเส้นทางไปยังรายการที่อนุญาตสำหรับไฟล์ที่เปิดอยู่
- แก้ไข