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

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

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

ज़ाइगोट ये काम करता है:

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

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

    • अगर आपके डिवाइस पर USAP पूल चालू है, तो:

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

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

USAP पूल चालू करना

USAP पूल का इस्तेमाल करने के लिए, इनमें से कोई एक काम करें:

  • /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 क्रैश हो रहा है

अगर आपका डिवाइस ठीक से रीबूट नहीं होता और आपके लॉग या क्रैश रिपोर्ट में Zygote से जुड़ी समस्याएं दिखती हैं, तो हो सकता है कि आपने हाल ही में कोई ऐसा बदलाव किया हो जिसकी वजह से initd या सिस्टम सर्वर क्रैश हो गया हो. कोड में बदलाव करने से समस्या ठीक हो जाएगी.

SELinux से जुड़ी गड़बड़ियां या इनपुट/आउटपुट से जुड़ी गड़बड़ियां

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

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

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

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

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