درباره فرایندهای Zygote

زیگوت فرایندی در سیستم‌عامل Android است که به‌عنوان ریشه همه فرایندهای سیستم و برنامه با رابط باینری برنامه (ABI) یکسان عمل می‌کند.

در دستگاه‌های مدرن، مانند Pixel 7 و مدل‌های جدیدتر، فرایند Zygote‏ ۶۴ بیتی وجود دارد. علاوه‌براین، WebView Zygote برای ABI اصلی وجود دارد که یک Zygote تخصصی است که حاوی کتابخانه‌ها و منابع مختص فرایندهایی است که WebView را اجرا می‌کنند.

در اینجا تکالیفی که Zygote انجام می‌دهد آمده است:

  1. وقتی سیستم‌عامل Android مقداردهی اولیه می‌شود، کارگزار init فرایند Zygote را ایجاد می‌کند. در برخی‌از سیستم‌های معماری دوگانه، دو فرایند Zygote (یک ۶۴ بیتی و یک ۳۲ بیتی) ایجاد می‌شود. این صفحه فقط سیستم‌های تک‌معماری را پوشش می‌دهد.

  2. Zygote می‌تواند فوراً فرایندهایی به‌نام فرایندهای برنامه غیرتخصصی (USAP) ایجاد کند یا منتظر بماند تا فرایندها را براساس نیاز برنامه‌ها ایجاد کند. گزینه اول باید ازطریق ویژگی سیستم یا فرمان پل اشکال‌زدایی Android فعال شود. برای اطلاعات بیشتر درباره پیکربندی Zygote برای ایجاد فوری فرایندها، به فعال کردن استخر فرایندهای برنامه غیرتخصصی مراجعه کنید.

    • اگر USAP pool در دستگاهتان فعال باشد:

      1. سرور سیستم از سوکت دامنه Unix برای اتصال به USAP دردسترس از استخر استفاده می‌کند. کارساز سیستم درخواست می‌کند که USAP ازقبل برای استفاده برنامه با تغییر شناسه فرایند (PID)، گروه کنترل، و اطلاعات دیگر پیکربندی شود.
      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 را در /build/make/target/product/runtime_libart.mk روی true تنظیم کنید.

  • فرمان زیر را اجرا کنید:

    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 یا خطاهای ورودی/خروجی مواجه می‌شوید:

  • برای توصیف‌گرهای فایل بدون نام، توصیف‌گرهای فایل را هنگام فراخوانی Restat در بردار fds_to_ignore اضافه کنید.

  • برای توصیف‌گرهای فایل نام‌گذاری‌شده:

    1. ویرایش WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp.
    2. مسیر را به فهرست مجاز برای فایل‌های باز اضافه کنید.