Android रनटाइम और Dalvik

Android रनटाइम (ART), मैनेज किया जाने वाला रनटाइम है. इसका इस्तेमाल, Android पर ऐप्लिकेशन और कुछ सिस्टम सेवाओं के लिए किया जाता है. ART और इससे पहले इस्तेमाल होने वाला Dalvik, मूल रूप से खास तौर पर Android प्रोजेक्ट के लिए बनाए गए थे. ART, रनटाइम के तौर पर Dalvik के रन किए जा सकने वाले (DEX) फ़ॉर्मैट और DEX बाइटकोड स्पेसिफ़िकेशन को लागू करता है.

ART और Dalvik, DEX बाइटकोड चलाने वाले साथ काम करने वाले रनटाइम हैं. इसलिए, Dalvik के लिए डेवलप किए गए ऐप्लिकेशन, ART के साथ काम करने चाहिए. हालांकि, Dalvik पर काम करने वाली कुछ तकनीकें, ART पर काम नहीं करतीं. सबसे ज़रूरी समस्याओं के बारे में जानकारी पाने के लिए, Android Runtime (ART) पर ऐप्लिकेशन के व्यवहार की पुष्टि करना लेख पढ़ें.

एआरटी की सुविधाएं

यहां ART की कुछ मुख्य सुविधाओं के बारे में बताया गया है.

पहले से कंपाइल करना (एएओटी)

ART में, ऐडवांस ऑफ़ टाइम (AOT) कंपाइलेशन की सुविधा है. इससे ऐप्लिकेशन की परफ़ॉर्मेंस बेहतर हो सकती है. ART में, इंस्टॉल के समय पुष्टि करने की प्रोसेस, Dalvik की तुलना में ज़्यादा सख्त होती है.

इंस्टॉल के समय, ART डिवाइस पर मौजूद dex2oat टूल का इस्तेमाल करके ऐप्लिकेशन को कॉम्पाइल करता है. यह सुविधा, DEX फ़ाइलों को इनपुट के तौर पर स्वीकार करती है और टारगेट डिवाइस के लिए, एक कंपाइल किया गया ऐप्लिकेशन एक्ज़ीक्यूटेबल जनरेट करती है. यह टूल, सभी मान्य DEX फ़ाइलों को आसानी से संकलित कर सकता है. हालांकि, प्रोसेस के बाद इस्तेमाल होने वाले कुछ टूल, अमान्य फ़ाइलें बनाते हैं. ये फ़ाइलें Dalvik पर काम कर सकती हैं, लेकिन ART पर उन्हें कंपाइल नहीं किया जा सकता. ज़्यादा जानकारी के लिए, Garbage Collection से जुड़ी समस्याओं को हल करना लेख पढ़ें.

गार्बेज कलेक्शन की सुविधा को बेहतर बनाया गया

गै़रबेज कलेक्शन (जीसी) में ज़्यादा संसाधनों की ज़रूरत होती है. इससे ऐप्लिकेशन की परफ़ॉर्मेंस पर असर पड़ सकता है. साथ ही, डिसप्ले में रुकावट आ सकती है, यूज़र इंटरफ़ेस (यूआई) की परफ़ॉर्मेंस खराब हो सकती है, और अन्य समस्याएं आ सकती हैं. ART, कई तरीकों से कचरे को इकट्ठा करने की सुविधा को बेहतर बनाता है:

  • ज़्यादातर मामलों में, एक ही जीसी रोक के साथ एक साथ चलने वाला डिज़ाइन
  • बैकग्राउंड में मेमोरी के इस्तेमाल और फ़्रैगमेंटेशन को कम करने के लिए, एक साथ कॉपी करना
  • जीसी के रुकने की अवधि, हेप साइज़ पर निर्भर नहीं करती
  • हाल ही में एलोकेट किए गए और कम समय तक चलने वाले ऑब्जेक्ट को हटाने के लिए, कम कुल जीसी समय वाला कलेक्टर
  • गारबेज कलेक्शन की सुविधा को बेहतर बनाया गया है. इससे एक साथ कई गारबेज कलेक्शन ज़्यादा समय पर किए जा सकते हैं. इससे सामान्य इस्तेमाल के उदाहरणों में GC_FOR_ALLOC इवेंट बहुत कम होते हैं

डेवलपमेंट और डीबग करने की सुविधा में सुधार

ART में ऐप्लिकेशन डेवलपमेंट और डीबग करने की सुविधाएं मौजूद हैं.

सैंपलिंग प्रोफ़ाइलर के लिए सहायता

अब तक, डेवलपर Traceview टूल (ऐप्लिकेशन के एक्सीक्यूशन को ट्रैक करने के लिए डिज़ाइन किया गया) का इस्तेमाल, प्रोफ़ाइलर के तौर पर करते रहे हैं. Traceview से काम की जानकारी मिलती है. हालांकि, Dalvik पर इसके नतीजों पर हर तरीके के कॉल के ओवरहेड का असर पड़ा है. साथ ही, इस टूल के इस्तेमाल से रन टाइम परफ़ॉर्मेंस पर काफ़ी असर पड़ता है.

ART, सैंपलिंग प्रोफ़ाइलर के लिए सहायता जोड़ता है. इसमें ये सीमाएं नहीं होती हैं. इससे, ऐप्लिकेशन के चलने की ज़्यादा सटीक जानकारी मिलती है. साथ ही, ऐप्लिकेशन की परफ़ॉर्मेंस पर भी कोई असर नहीं पड़ता. KitKat रिलीज़ में, Dalvik के लिए Traceview में सैंपलिंग की सुविधा जोड़ी गई थी.

डीबगिंग की ज़्यादा सुविधाओं के लिए सहायता

ART, डीबग करने के कई नए विकल्पों के साथ काम करता है. खास तौर पर, मॉनिटर और गारबेज कलेक्शन से जुड़ी सुविधाओं के लिए. उदाहरण के लिए:

  • देखें कि स्टैक ट्रेस में कौनसे लॉक हैं. इसके बाद, उस थ्रेड पर जाएं जिसमें लॉक है.
  • किसी क्लास के कितने लाइव इंस्टेंस हैं, यह पूछें. साथ ही, इंस्टेंस देखने के लिए कहें और देखें कि किसी ऑब्जेक्ट को कौनसे रेफ़रंस लाइव रख रहे हैं.
  • किसी खास इंस्टेंस के लिए इवेंट (जैसे, ब्रेकपॉइंट) फ़िल्टर करें.
  • किसी मेथड के बाहर निकलने पर, उससे मिली वैल्यू देखें. इसके लिए, “method-exit” इवेंट का इस्तेमाल करें.
  • किसी खास फ़ील्ड को ऐक्सेस करने और/या उसमें बदलाव करने पर, प्रोग्राम के चलने को रोकने के लिए, फ़ील्ड वॉचपॉइंट सेट करें.

अपवादों और क्रैश रिपोर्ट में, गड़बड़ी की बेहतर जानकारी

रनटाइम एक्ससेप्शन होने पर, ART आपको ज़्यादा से ज़्यादा जानकारी और कॉन्टेक्स्ट देता है. एआरटी, java.lang.ClassCastException, java.lang.ClassNotFoundException, और java.lang.NullPointerException के लिए, अपवाद की ज़्यादा जानकारी देता है. (Dalvik के बाद के वर्शन में, java.lang.ArrayIndexOutOfBoundsException और java.lang.ArrayStoreException के लिए अपवाद की ज़्यादा जानकारी दी गई है. इसमें अब ऐरे का साइज़ और आउट-ऑफ़-बाउंड ऑफ़सेट शामिल है. ART भी ऐसा ही करता है.)

उदाहरण के लिए, java.lang.NullPointerException अब यह जानकारी दिखाता है कि ऐप्लिकेशन, शून्य पॉइंटर का इस्तेमाल करके क्या करने की कोशिश कर रहा था. जैसे, वह ऐप्लिकेशन किस फ़ील्ड में लिखने की कोशिश कर रहा था या वह किस तरीके को कॉल करने की कोशिश कर रहा था. यहां कुछ सामान्य उदाहरण दिए गए हैं:

java.lang.NullPointerException: Attempt to write to field 'int
android.accessibilityservice.AccessibilityServiceInfo.flags' on a null object
reference
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String java.lang.Object.toString()' on a null object reference

ART, ऐप्लिकेशन के नेटिव क्रैश की रिपोर्ट में बेहतर कॉन्टेक्स्ट की जानकारी भी देता है. इसके लिए, वह Java और नेटिव स्टैक, दोनों की जानकारी शामिल करता है.

समस्याओं की शिकायत करना

अगर आपको कोई ऐसी समस्या आती है जो ऐप्लिकेशन के JNI से जुड़ी नहीं है, तो Android Open Source Project के समस्या ट्रैकर की मदद से उसकी शिकायत करें. adb bugreport शामिल करें और अगर उपलब्ध हो, तो Google Play Store में ऐप्लिकेशन का लिंक दें. अगर ऐसा नहीं है, तो अगर हो सके, तो वह APK अटैच करें जिसमें समस्या दिख रही है.