Zygote प्रोसेस के बारे में जानकारी

ज़ायगोट, Android ऑपरेटिंग सिस्टम में एक प्रोसेस है. यह एक ही ऐप्लिकेशन बाइनरी इंटरफ़ेस (एबीआई) के साथ, सिस्टम और ऐप्लिकेशन की सभी प्रोसेस के रूट के तौर पर काम करती है.

Pixel 7 और उसके बाद के वर्शन वाले मॉडर्न डिवाइसों पर, 64-बिट Zygote प्रोसेस होती है. इसके अलावा, मुख्य एबीआई के लिए WebView Zygote होता है. यह एक खास तरह का Zygote होता है. इसमें ऐसी प्रोसेस के लिए खास तौर पर तैयार की गई लाइब्रेरी और संसाधन होते हैं जो WebViews को चलाते हैं.

Zygote ये काम करता है:

  1. Android OS के शुरू होने पर, init डीमन Zygote प्रोसेस को स्पॉन करता है. कुछ ड्यूअल आर्किटेक्चर सिस्टम पर, दो Zygote प्रोसेस (एक 64-बिट और दूसरी 32-बिट) शुरू होती हैं. इस पेज पर, सिर्फ़ सिंगल आर्किटेक्चर सिस्टम के बारे में बताया गया है.

  2. Zygote, अनस्पेशलाइज़्ड ऐप्लिकेशन प्रोसेस (यूएसएपी) नाम की प्रोसेस को तुरंत शुरू कर सकता है. इसके अलावा, यह ऐप्लिकेशन की ज़रूरत के हिसाब से प्रोसेस शुरू करने के लिए इंतज़ार भी कर सकता है. पहले विकल्प को सिस्टम प्रॉपर्टी या Android डीबग ब्रिज कमांड के ज़रिए चालू किया जाना चाहिए. प्रोसेस को तुरंत स्पॉन करने के लिए, Zygote को कॉन्फ़िगर करने के बारे में ज़्यादा जानने के लिए, ऐप्लिकेशन की सामान्य प्रोसेस के पूल को चालू करना लेख पढ़ें.

    • अगर आपके डिवाइस पर यूएसएपी पूल की सुविधा चालू है, तो:

      1. सिस्टम सर्वर, पूल में मौजूद यूएसएपी से कनेक्ट करने के लिए, Unix डोमेन सॉकेट का इस्तेमाल करता है. सिस्टम सर्वर, यूएसएपी से अनुरोध करता है कि वह ऐप्लिकेशन के इस्तेमाल के लिए पहले से कॉन्फ़िगर हो. इसके लिए, वह प्रोसेस के आईडी (पीआईडी), सीग्रुप, और अन्य जानकारी में बदलाव करता है.
      2. जब यूएसएपी पहले से कॉन्फ़िगर हो जाता है, तो यह सिस्टम सर्वर को पीआईडी का जवाब देता है.
      3. जब कोई ऐप्लिकेशन इनमें से किसी यूएसएपी का इस्तेमाल करता है, तो वह यूएसएपी पूल का हिस्सा नहीं रहता. जब पूल में एक या इससे कम यूएसएपी बचते हैं, तो ज़ायगोट पूल में नए यूएसएपी जोड़ता है.
    • अगर आपका Zygote, लेज़ी इवैलुएशन का इस्तेमाल करके प्रोसेस शुरू करता है, तो:

      1. सिस्टम सर्वर को यह निर्देश मिलता है कि किसी ऐप्लिकेशन को प्रोसेस करने की ज़रूरत है.
      2. सिस्टम सर्वर, Unix डोमेन सॉकेट का इस्तेमाल करके, सही Zygote को कमांड भेजता है.
      3. Zygote, प्रोसेस को फ़ोर्क करता है और PID, cgroup, और अन्य जानकारी बदलता है.
      4. प्रोसेस पूरी होने पर, यह PID को वापस Zygote को भेजता है. इसके बाद, Zygote इसे वापस सिस्टम सर्वर को भेजता है.

यूएसएपी पूल चालू करें

यूएसएपी पूल का इस्तेमाल करने की सुविधा चालू करने के लिए, इनमें से कोई एक काम करें:

  • /build/make/target/product/runtime_libart.mk में, dalvik.vm.usap_pool_enabled सिस्टम प्रॉपर्टी को 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 से जुड़ी समस्याएं दिखती हैं, तो ऐसा हाल ही में किए गए किसी बदलाव की वजह से हो सकता है. इस बदलाव की वजह से, initd या सिस्टम सर्वर क्रैश हो जाता है. कोड में बदलाव करने से, समस्या ठीक हो जाएगी.

SELinux की अनुमतियां न मिलना या इनपुट/आउटपुट में गड़बड़ियां होना

Zygote, प्रोसेस की सीमाओं के बीच फ़ाइल डिस्क्रिप्टर की स्वच्छता के बारे में खास जानकारी देता है. जब फ़ोर्क के समय फ़ाइल डिस्क्रिप्टर मौजूद होते हैं, लेकिन अनुमति वाली सूची में नहीं होते हैं, तो हम /dev/null के लिए dup सिस्टम कॉल का इस्तेमाल करते हैं. इससे, कैश किए गए फ़ाइल डिस्क्रिप्टर का इस्तेमाल, नई फ़ाइलों को ऐक्सेस करने के लिए अनजाने में नहीं किया जा सकेगा.

अगर फ़्रेमवर्क में ऐसे बदलाव किए जा रहे हैं जिनमें Zygote में संसाधन लोड करने की कोशिश करना शामिल है और आपको SELinux से जुड़ी गड़बड़ियां या IO से जुड़ी गड़बड़ियां मिल रही हैं, तो:

  • बिना नाम वाले फ़ाइल डिस्क्रिप्टर के लिए, fds_to_ignore को कॉल करते समय, fds_to_ignore वेक्टर में फ़ाइल डिस्क्रिप्टर शामिल करें.Restat

  • नाम वाले फ़ाइल डिस्क्रिप्टर के लिए:

    1. WORKING_DIRECTORY/frameworks/base/core/jni/fd_utils.cpp में बदलाव करें.
    2. खुली हुई फ़ाइलों के लिए, अनुमति वाली सूची में पाथ जोड़ें.