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

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

على الأجهزة الحديثة، مثل Pixel 7 والإصدارات الأحدث، تتوفّر عملية Zygote ذات 64 بت. بالإضافة إلى ذلك، هناك WebView Zygote لواجهة التطبيق الثنائية الأساسية، وهي 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 هذه، لن تعود وحدة USAP جزءًا من المجموعة. عندما يصل عدد 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. أضِف المسار إلى القائمة المسموح بها للملفات المفتوحة.