एआरटी समय के हिसाब से कंपाइलर लागू करना

Android Runtime (ART) में, कोड की प्रोफ़ाइलिंग के साथ-साथ जस्ट-इन-टाइम (JIT) कंपाइलर शामिल होता है. यह कंपाइलर, Android ऐप्लिकेशन के चलने के दौरान उनकी परफ़ॉर्मेंस को लगातार बेहतर बनाता रहता है. JIT कंपाइलर, ART के मौजूदा ऐंड-ऑफ़-टाइम (एओटी) कंपाइलर के साथ काम करता है. साथ ही, यह रनटाइम परफ़ॉर्मेंस को बेहतर बनाता है, स्टोरेज स्पेस बचाता है, और ऐप्लिकेशन और सिस्टम अपडेट करने की प्रोसेस को तेज़ करता है. यह एओटी कंपाइलर को भी बेहतर बनाता है. इससे ऐप्लिकेशन अपने-आप अपडेट होने या ओटीए (ओवर-द-एयर) अपडेट के दौरान ऐप्लिकेशन को फिर से कंपाइल करने पर, सिस्टम की स्पीड कम नहीं होती.

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

जेआईटी आर्किटेक्चर

जेआईटी आर्किटेक्चर
पहली इमेज. JIT आर्किटेक्चर.

JIT कंपाइलेशन

JIT कंपाइलेशन में ये गतिविधियां शामिल होती हैं:

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

    JIT डीमन
    तीसरी इमेज. JIT डीमॉन की गतिविधियां.

Google Play सेवा, एक ऐसा उदाहरण है जिसका इस्तेमाल अन्य ऐप्लिकेशन करते हैं. ये ऐप्लिकेशन, शेयर की गई लाइब्रेरी की तरह काम करते हैं.

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

जेआईटी आर्किटेक्चर
चौथी इमेज. जेआईटी डेटा फ़्लो.
  • प्रोफ़ाइलिंग की जानकारी, कोड कैश मेमोरी में सेव की जाती है. साथ ही, मेमोरी पर ज़्यादा दबाव पड़ने पर, इसे ट्रैश किया जा सकता है.
    • इस बात की कोई गारंटी नहीं है कि ऐप्लिकेशन के बैकग्राउंड में होने पर लिए गए स्नैपशॉट में पूरा डेटा (यानी, वह सब कुछ जो JITed था) शामिल होगा.
    • यह पक्का करने की कोशिश नहीं की जाती कि सब कुछ रिकॉर्ड किया गया है, क्योंकि इससे रनटाइम परफ़ॉर्मेंस पर असर पड़ सकता है.
  • तरीके तीन अलग-अलग स्थितियों में हो सकते हैं:
    • इंटरप्रेट किया गया (dex कोड)
    • JIT कंपाइल किया गया
    • AOT कंपाइल किया गया
    अगर 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 को बंद करने के लिए, ये कमांड चलाएं:

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
    

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

Android 13 या इससे पहले के वर्शन पर

लोकल प्रोफ़ाइल डेटा मिटाने और कंपाइल किया गया कोड हटाने के लिए, यह कमांड चलाएं:

adb shell pm compile --reset 

Android 14 या इसके बाद के वर्शन पर

सिर्फ़ स्थानीय प्रोफ़ाइल का डेटा मिटाने के लिए:

adb shell pm art clear-app-profiles 

ध्यान दें: Android 13 या इससे पहले के वर्शन के लिए इस्तेमाल की जाने वाली कमांड के उलट, यह कमांड ऐप्लिकेशन के साथ इंस्टॉल किए गए बाहरी प्रोफ़ाइल डेटा (`.dm`) को मिटाती नहीं है.

लोकल प्रोफ़ाइल का डेटा मिटाने और लोकल प्रोफ़ाइल के डेटा से जनरेट किए गए कंपाइल किए गए कोड को हटाने के लिए (यानी कि इंस्टॉल की गई स्थिति पर रीसेट करने के लिए), यह कमांड चलाएं:

adb shell pm compile --reset 

ध्यान दें: इस कमांड से, ऐप्लिकेशन के साथ इंस्टॉल किया गया, बाहरी प्रोफ़ाइल डेटा (`.dm`) से जनरेट किया गया कंपाइल किया गया कोड नहीं हटता.

कंपाइल किए गए सभी कोड को हटाने के लिए, यह निर्देश चलाएं:

adb shell cmd package compile -m verify -f 

ध्यान दें: इस निर्देश से, लोकल प्रोफ़ाइल का डेटा सेव रहता है.