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