لمحة عن عمليات Zygote

Zygote هي عملية في نظام التشغيل Android تعمل كجذر لجميع عمليات النظام والتطبيقات التي تستخدم واجهة التطبيق الثنائية نفسها (ABI).

على الأجهزة الحديثة، مثل Pixel 7 والإصدارات الأحدث، تتوفّر عملية Zygote ذات 64 بت. بالإضافة إلى ذلك، هناك WebView Zygote لواجهة ABI الأساسية، وهي Zygote متخصّصة تحتوي على مكتبات وموارد خاصة بالعمليات التي تشغّل WebViews.

في ما يلي المهام التي ينفّذها Zygote:

  1. يبدأ البرنامج الخفي init عملية Zygote عند تهيئة نظام التشغيل Android. في بعض الأنظمة ذات البنية المزدوجة، يتم إنشاء عمليتَي Zygote (إحداهما 64 بت والأخرى 32 بت). تتضمّن هذه الصفحة أنظمة ذات بنية أساسية واحدة فقط.

  2. يمكن لـ Zygote إنشاء عمليات على الفور تُعرف باسم عمليات التطبيقات غير المتخصصة (USAP) أو الانتظار لإنشاء العمليات حسب حاجة التطبيقات. يجب تفعيل الخيار السابق من خلال إحدى خصائص النظام أو أمر Android debug bridge. لمزيد من المعلومات حول ضبط Zygote لإنشاء العمليات على الفور، راجِع تفعيل مجموعة عمليات التطبيقات غير المتخصصة .

    • في حال تفعيل مجموعة USAP على جهازك:

      1. يستخدم خادم النظام مقبس نطاق Unix للاتصال بـ USAP متاح من مجموعة. يطلب خادم النظام أن يتم ضبط USAP مسبقًا لاستخدام التطبيق من خلال تغيير معرّف العملية (PID) ومجموعة التحكّم (cgroup) وغيرها من المعلومات.
      2. عندما تنتهي خدمة USAP من عملية الضبط المسبق، سترد على خادم النظام باستخدام رقم تعريف العملية (PID).
      3. عندما يشغل تطبيق إحدى هذه المساحات، لن تعود هذه المساحة جزءًا من المجموعة. عندما يصل عدد USAP في المجموعة إلى واحد أو أقل، يعيد 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 أو أخطاء الإدخال/الإخراج

يحرص Zygote على الحفاظ على سلامة واصفات الملفات في جميع حدود العمليات. عندما تكون واصفات الملفات متوفّرة في وقت إنشاء نسخة طبق الأصل ولكنها غير مدرَجة في القائمة المسموح بها، نستخدم طلب نظام dup لإجراء /dev/null من أجل منع استخدام واصفات الملفات المخزّنة مؤقتًا بشكل غير مقصود للوصول إلى الملفات التي تم فتحها حديثًا.

إذا كنت تجري تغييرات على إطار العمل تتضمّن محاولة تحميل موارد في Zygote، وتتلقّى رفضًا من SELinux أو أخطاء إدخال/إخراج، اتّبِع الخطوات التالية:

  • بالنسبة إلى واصفات الملفات التي ليس لها أسماء، أدرِج واصفات الملفات في المتّجه fds_to_ignore عند استدعاء Restat.

  • بالنسبة إلى واصفات الملفات المسماة:

    1. تعديل "WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp".
    2. أضِف المسار إلى القائمة المسموح بها للملفات المفتوحة.