เกี่ยวกับกระบวนการ 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 ซึ่งจะส่งกลับไปยังเซิร์ฟเวอร์ระบบ

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