एआरटी जस्ट-इन-टाइम कंपाइलर लागू करें

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

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

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

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

जेआईटी संकलन

JIT संकलन में निम्नलिखित गतिविधियाँ शामिल हैं:

प्रोफ़ाइल-निर्देशित COMP
चित्र 2. प्रोफ़ाइल-निर्देशित संकलन।
  1. उपयोगकर्ता ऐप चलाता है, जो फिर .dex फ़ाइल को लोड करने के लिए ART को ट्रिगर करता है।
    • यदि .oat फ़ाइल ( .dex फ़ाइल के लिए AOT बाइनरी) उपलब्ध है, तो ART इसका सीधे उपयोग करता है। हालाँकि .oat फ़ाइलें नियमित रूप से उत्पन्न होती हैं, उनमें हमेशा संकलित कोड (AOT बाइनरी) नहीं होता है।
    • यदि .oat फ़ाइल में संकलित कोड नहीं है, तो ART .dex फ़ाइल को निष्पादित करने के लिए JIT और दुभाषिया के माध्यम से चलता है।
  2. JIT किसी भी एप्लिकेशन के लिए सक्षम है जो 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
    
  • पूर्ण:
    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