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