ART जस्ट-इन-टाइम (JIT) कंपाइलर लागू करना

एंड्रॉइड रनटाइम (एआरटी) में कोड प्रोफाइलिंग के साथ जस्ट-इन-टाइम (जेआईटी) कंपाइलर शामिल होता है जो एंड्रॉइड एप्लिकेशन के चलने के साथ-साथ उनके प्रदर्शन में लगातार सुधार करता है। जेआईटी कंपाइलर एआरटी के वर्तमान समय से पहले (एओटी) कंपाइलर का पूरक है और रनटाइम प्रदर्शन में सुधार करता है, स्टोरेज स्पेस बचाता है, और एप्लिकेशन और सिस्टम अपडेट को गति देता है। यह स्वचालित एप्लिकेशन अपडेट या ओवर-द-एयर (OTA) अपडेट के दौरान एप्लिकेशन के पुन: संकलन के दौरान सिस्टम मंदी से बचकर AOT कंपाइलर में भी सुधार करता है।

हालांकि जेआईटी और एओटी अनुकूलन के समान सेट के साथ एक ही कंपाइलर का उपयोग करते हैं, उत्पन्न कोड समान नहीं हो सकता है। JIT रनटाइम प्रकार की जानकारी का उपयोग करता है, बेहतर इनलाइनिंग कर सकता है, और स्टैक रिप्लेसमेंट (OSR) संकलन को संभव बनाता है, जो सभी थोड़ा अलग कोड उत्पन्न करते हैं।

जेआईटी वास्तुकला

जेआईटी वास्तुकला
चित्रा 1. जेआईटी वास्तुकला।

जेआईटी संकलन

जेआईटी संकलन में निम्नलिखित गतिविधियां शामिल हैं:

प्रोफ़ाइल-निर्देशित COMP
चित्र 2. प्रोफाइल-निर्देशित संकलन।
  1. उपयोगकर्ता ऐप चलाता है, जो तब एआरटी को .dex फ़ाइल लोड करने के लिए ट्रिगर करता है।
    • यदि .oat फ़ाइल ( .dex फ़ाइल के लिए AOT बाइनरी) उपलब्ध है, तो ART इसका सीधे उपयोग करता है। यद्यपि .oat फ़ाइलें नियमित रूप से उत्पन्न होती हैं, उनमें हमेशा संकलित कोड (AOT बाइनरी) नहीं होता है।
    • यदि .oat फ़ाइल में संकलित कोड नहीं है, तो ART .dex फ़ाइल को निष्पादित करने के लिए JIT और दुभाषिया के माध्यम से चलता है।
  2. जेआईटी किसी भी एप्लिकेशन के लिए सक्षम है जो speed संकलन फ़िल्टर के अनुसार संकलित नहीं है (जो कहता है "ऐप से जितना हो सके संकलित करें")।
  3. JIT प्रोफ़ाइल डेटा को सिस्टम निर्देशिका में एक फ़ाइल में डंप किया जाता है जिसे केवल एप्लिकेशन ही एक्सेस कर सकता है।
  4. AOT संकलन ( dex2oat ) डेमॉन उस फ़ाइल को उसके संकलन को चलाने के लिए पार्स करता है।

    जेआईटी डेमॉन
    चित्रा 3. जेआईटी डेमॉन गतिविधियां।

Google Play सेवा अन्य अनुप्रयोगों द्वारा उपयोग किया जाने वाला एक उदाहरण है जो साझा पुस्तकालयों के समान व्यवहार करता है।

जेआईटी वर्कफ़्लो

जेआईटी वास्तुकला
चित्रा 4. जेआईटी डेटा प्रवाह।
  • प्रोफाइलिंग जानकारी को कोड कैश में संग्रहीत किया जाता है और मेमोरी दबाव में कचरा संग्रहण के अधीन किया जाता है।
    • इस बात की कोई गारंटी नहीं है कि जब एप्लिकेशन पृष्ठभूमि में था तो स्नैपशॉट में पूरा डेटा होगा (यानी, वह सब कुछ जो JITed था)।
    • यह सुनिश्चित करने का कोई प्रयास नहीं है कि सब कुछ रिकॉर्ड किया गया है (क्योंकि यह रनटाइम प्रदर्शन को प्रभावित कर सकता है)।
  • तरीके तीन अलग-अलग राज्यों में हो सकते हैं:
    • व्याख्या (डेक्स कोड)
    • जेआईटी संकलित
    • एओटी संकलित
    यदि JIT और AOT दोनों कोड मौजूद हैं (उदाहरण के लिए बार-बार डी-ऑप्टिमाइज़ेशन के कारण), तो JITed कोड को प्राथमिकता दी जाती है।
  • अग्रभूमि ऐप के प्रदर्शन को प्रभावित किए बिना JIT को चलाने के लिए मेमोरी की आवश्यकता संबंधित ऐप पर निर्भर करती है। बड़े ऐप्स को छोटे ऐप्स की तुलना में अधिक मेमोरी की आवश्यकता होती है। सामान्य तौर पर, बड़े ऐप्स लगभग 4 एमबी स्थिर होते हैं।

JIT लॉगिंग चालू करना

JIT लॉगिंग चालू करने के लिए, निम्नलिखित कमांड चलाएँ:

adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start

JIT . को अक्षम करना

JIT को अक्षम करने के लिए, निम्न कमांड चलाएँ:

adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start

जबरदस्ती संकलन

संकलन को बाध्य करने के लिए, निम्नलिखित चलाएँ:

adb shell cmd package compile

एक विशिष्ट पैकेज को बलपूर्वक संकलित करने के लिए सामान्य उपयोग के मामले:

  • प्रोफाइल-आधारित:
    adb shell cmd package compile -m speed-profile -f my-package
    
    4
  • पूर्ण:
    adb shell cmd package compile -m speed -f my-package
    

सभी पैकेजों को संकलित करने के लिए सामान्य उपयोग के मामले:

  • प्रोफाइल-आधारित:
    adb shell cmd package compile -m speed-profile -f -a
    
  • पूर्ण:
    adb shell cmd package compile -m speed -f -a
    

प्रोफ़ाइल डेटा साफ़ करना

प्रोफ़ाइल डेटा साफ़ करने और संकलित कोड निकालने के लिए, निम्नलिखित चलाएँ:

  • एक पैकेज के लिए:
    adb shell cmd package compile --reset my-package
    
  • सभी पैकेजों के लिए:
    adb shell cmd package compile --reset -a