درباره فرآیندهای زیگوت

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

در دستگاه‌های مدرن، مانند پیکسل ۷ و بالاتر، یک فرآیند ۶۴ بیتی Zygote وجود دارد. علاوه بر این، WebView Zygote برای ABI اصلی وجود دارد که یک Zygote تخصصی است که شامل کتابخانه‌ها و منابع خاص برای فرآیندهایی است که WebViews را اجرا می‌کنند.

وظایفی که زیگوت انجام می‌دهد به شرح زیر است:

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

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

    • اگر مجموعه‌ی USAP روی دستگاه شما فعال باشد:

      1. سرور سیستم از یک سوکت دامنه یونیکس برای اتصال به یک USAP موجود از یک مخزن استفاده می‌کند. سرور سیستم با تغییر شناسه فرآیند (PID)، گروه c و سایر اطلاعات، درخواست می‌کند که USAP برای استفاده برنامه از پیش پیکربندی شده باشد.
      2. وقتی تنظیمات اولیه‌ی USAP تمام شد، با PID به سرور سیستم پاسخ می‌دهد.
      3. وقتی یک برنامه یکی از این USAPها را اشغال می‌کند، آن USAP دیگر بخشی از مجموعه نیست. وقتی مجموعه به یک یا تعداد کمتری USAP در مجموعه برسد، Zygote مجموعه را با USAPهای جدید دوباره پر می‌کند.
    • اگر Zygote شما با استفاده از ارزیابی تنبل ، پردازش‌هایی را تولید می‌کند:

      1. سرور سیستم دستوری مبنی بر نیاز یک برنامه به یک فرآیند دریافت می‌کند.
      2. سرور سیستم از یک سوکت دامنه یونیکس برای ارسال دستور به Zygote مناسب استفاده می‌کند.
      3. زیگوت فرآیند را منشعب می‌کند و 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 نشان می‌دهند، احتمالاً به این دلیل است که شما اخیراً تغییری ایجاد کرده‌اید که باعث خرابی initd یا سرور سیستم می‌شود. اصلاح کد شما باید مشکل را برطرف کند.

رد درخواست‌های SELinux یا خطاهای IO

Zygote به طور خاص به بهداشت توصیف‌گر فایل در سراسر مرزهای فرآیند توجه دارد. هنگامی که توصیف‌گرهای فایل در زمان انشعاب وجود دارند اما در لیست مجاز نیستند، ما از یک فراخوانی سیستمی dup به /dev/null استفاده می‌کنیم تا از استفاده ناخواسته توصیف‌گرهای فایل ذخیره شده برای دسترسی به فایل‌های تازه باز شده جلوگیری کنیم.

اگر در حال ایجاد تغییرات چارچوبی هستید که شامل تلاش برای بارگذاری منابع در Zygote می‌شود، و با رد درخواست SELinux یا خرابی IO مواجه می‌شوید:

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

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

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