Android रनटाइम (एआरटी) में, कोड प्रोफ़ाइलिंग के साथ-साथ जस्ट-इन-टाइम (जेआईटी) कंपाइलर शामिल होता है. इससे, Android ऐप्लिकेशन के चलने के दौरान उनकी परफ़ॉर्मेंस लगातार बेहतर होती रहती है. JIT कंपाइलर, ART के मौजूदा ऐंड-ऑफ़-टाइम (एओटी) कंपाइलर के साथ काम करता है. साथ ही, यह रनटाइम परफ़ॉर्मेंस को बेहतर बनाता है, स्टोरेज स्पेस बचाता है, और ऐप्लिकेशन और सिस्टम अपडेट करने की प्रोसेस को तेज़ करता है. यह एओटी कंपाइलर को भी बेहतर बनाता है. इससे ऐप्लिकेशन अपने-आप अपडेट होने या ओटीए (ओवर-द-एयर) अपडेट के दौरान ऐप्लिकेशन को फिर से कंपाइल करने पर, सिस्टम की स्पीड कम नहीं होती.
JIT और AOT, दोनों एक ही कंपाइलर का इस्तेमाल करते हैं और दोनों में ऑप्टिमाइज़ेशन का एक जैसा सेट होता है. हालांकि, जनरेट किया गया कोड एक जैसा नहीं हो सकता. JIT, रनटाइम टाइप की जानकारी का इस्तेमाल करता है. यह बेहतर इनलाइनिंग कर सकता है. साथ ही, यह स्टैक रिप्लेसमेंट (ओएसआर) कंपाइलेशन को भी मुमकिन बनाता है. इन सभी से थोड़ा अलग कोड जनरेट होता है.
जेआईटी आर्किटेक्चर
JIT कंपाइलेशन
JIT कंपाइलेशन में ये गतिविधियां शामिल होती हैं:
- उपयोगकर्ता ऐप्लिकेशन चलाता है. इसके बाद, ART
.dexफ़ाइल को लोड करने के लिए ट्रिगर होता है.- अगर
.oatफ़ाइल (.dexफ़ाइल के लिए AOT बाइनरी) उपलब्ध है, तो ART इसका सीधे तौर पर इस्तेमाल करता है..oatफ़ाइलें नियमित तौर पर जनरेट होती हैं. हालांकि, इनमें हमेशा कंपाइल किया गया कोड (एओटी बाइनरी) शामिल नहीं होता है. - अगर
.oatफ़ाइल में कंपाइल किया गया कोड नहीं है, तो ART,.oatफ़ाइल को एक्ज़ीक्यूट करने के लिए JIT और इंटरप्रेटर का इस्तेमाल करता है..dex
- अगर
- JIT, ऐसे किसी भी ऐप्लिकेशन के लिए चालू होता है जिसे
speedकंपाइलेशन फ़िल्टर के हिसाब से कंपाइल नहीं किया गया है. इस फ़िल्टर में कहा गया है कि "ऐप्लिकेशन से जितना हो सके उतना कंपाइल करें". - JIT प्रोफ़ाइल के डेटा को सिस्टम डायरेक्ट्री में मौजूद किसी फ़ाइल में डंप किया जाता है. इस फ़ाइल को सिर्फ़ ऐप्लिकेशन ऐक्सेस कर सकता है.
- AOT कंपाइलेशन (
dex2oat) डेमॉन, उस फ़ाइल को पार्स करता है, ताकि कंपाइलेशन को ड्राइव किया जा सके.
तीसरी इमेज.
JIT डीमन की गतिविधियां.
Google Play सेवा, एक ऐसा उदाहरण है जिसका इस्तेमाल अन्य ऐप्लिकेशन करते हैं. ये ऐप्लिकेशन, शेयर की गई लाइब्रेरी की तरह काम करते हैं.
जेआईटी वर्कफ़्लो
- प्रोफ़ाइलिंग की जानकारी, कोड कैश मेमोरी में सेव की जाती है. साथ ही, मेमोरी पर ज़्यादा दबाव पड़ने पर, इस जानकारी को मिटाया जा सकता है.
- इस बात की कोई गारंटी नहीं है कि ऐप्लिकेशन के बैकग्राउंड में होने पर लिए गए स्नैपशॉट में पूरा डेटा (यानी, वह सब कुछ जो JITed था) शामिल होगा.
- यह पक्का करने की कोशिश नहीं की जाती कि सब कुछ रिकॉर्ड किया गया है, क्योंकि इससे रनटाइम परफ़ॉर्मेंस पर असर पड़ सकता है.
- तरीके तीन अलग-अलग स्थितियों में हो सकते हैं:
- इंटरप्रेट किया गया (dex कोड)
- JIT कंपाइल किया गया
- AOT कंपाइल किया गया
- फ़ोरग्राउंड ऐप्लिकेशन की परफ़ॉर्मेंस पर असर डाले बिना, JIT को चलाने के लिए मेमोरी की ज़रूरत होती है. यह ज़रूरत, ऐप्लिकेशन पर निर्भर करती है. बड़े ऐप्लिकेशन के लिए, छोटे ऐप्लिकेशन की तुलना में ज़्यादा मेमोरी की ज़रूरत होती है. आम तौर पर, बड़े ऐप्लिकेशन का साइज़ 4 एमबी के आस-पास होता है.
JIT लॉगिंग की सुविधा चालू करना
JIT लॉगिंग चालू करने के लिए, ये कमांड चलाएं:
adb rootadb shell stopadb shell setprop dalvik.vm.extra-opts -verbose:jitadb shell start
जेआईटी बंद करना
JIT को बंद करने के लिए, ये कमांड चलाएं:
adb rootadb shell stopadb shell setprop dalvik.vm.usejit falseadb 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
ध्यान दें: इस कमांड से, लोकल प्रोफ़ाइल का डेटा सेव रहता है.