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

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

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

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

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

जेआईटी कंपाइलेशन

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

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

    जेआईटी डीमन
    तीसरी इमेज. JIT डीमन गतिविधियां.

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

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

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

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