आर्ट टीआई

Android 8.0 और उसके बाद के वर्शन में, ART टूलिंग इंटरफ़ेस (ART TI) जानकारी कुछ रनटाइम इंटरनल होती हैं और इसकी मदद से प्रोफ़ाइलर और डीबगर, ऐप्लिकेशन का रनटाइम व्यवहार. इसका इस्तेमाल लागू करने के लिए किया जा सकता है बेहतरीन परफ़ॉर्मेंस के लिए, बेहतरीन टूल दिए गए हैं. नेटिव एजेंट.

रनटाइम इंटर्नल ऐसे एजेंट को दिखाए जाते हैं जिन्हें रनटाइम प्रोसेस में लोड किया जाता है. ये डायरेक्ट कॉल और कॉलबैक की मदद से, एआरटी से संपर्क करते हैं. रनटाइम एक से ज़्यादा एजेंट की मदद करता है, ताकि अलग-अलग ऑर्थोगोनल-प्रोफ़ाइलिंग से जुड़ी समस्याएं पैदा हो सकें अलग हो जाएगा. या तो एजेंट को रनटाइम शुरू होने पर दिया जा सकता है (जब dalvikvm या app_process शुरू किया गया है या अटैच किया गया है पहले से चल रही प्रोसेस है.

क्योंकि ऐप्लिकेशन और रनटाइम के व्यवहार को इंस्ट्रुमेंट करने और उसमें बदलाव करने की सुविधा ART TI में दो सुरक्षा उपायों को शामिल किया गया है, जो बहुत ही ताकतवर हैं:

  • सबसे पहले, एजेंट इंटरफ़ेस, JVMTI को दिखाने वाले कोड को रनटाइम प्लगिन का इस्तेमाल नहीं किया जाता, न कि रनटाइम का मुख्य कॉम्पोनेंट. प्लगिन लोड हो रहा है ताकि एजेंट को कोई भी इंटरफ़ेस ढूंढने से रोका जा सके अंक.
  • दूसरा, ActivityManager क्लास और रनटाइम प्रोसेस, दोनों में सिर्फ़ एजेंट को ये काम करने की अनुमति मिलती है डीबग करने लायक ऐप्लिकेशन में अटैच करें. डीबग किए जा सकने वाले ऐप्लिकेशन साइन-ऑफ़ कर दिए गए हैं अपने डेवलपर को उनका विश्लेषण करना होगा और इंस्ट्रुमेंट का इस्तेमाल करना होगा. साथ ही, उन्हें असली उपयोगकर्ता. Google Play Store, डीबग करने लायक ऐप्लिकेशन के डिस्ट्रिब्यूशन की अनुमति नहीं देता दिखाई देता है. इससे यह पक्का होता है कि सामान्य ऐप्लिकेशन (इनमें मुख्य कॉम्पोनेंट भी शामिल हैं) ऐसा कॉन्टेंट जिसमें बदलाव या हेर-फेर किया गया हो.

डिज़ाइन

इंस्ट्रुमेंट वाले ऐप्लिकेशन का सामान्य फ़्लो और इंटरकनेक्शन इसमें दिखाया जाता है पहली इमेज.

इंस्ट्रुमेंट वाले ऐप्लिकेशन में फ़्लो और इंटरकनेक्शन
पहली इमेज. फ़्लो और इंस्ट्रुमेंट वाले ऐप्लिकेशन का इंटरकनेक्शन

ART प्लगिन libopenjdkjvmti, ART TI दिखाता है, जो इन्हें प्लैटफ़ॉर्म की ज़रूरतों और शर्तों को पूरा करने के लिए डिज़ाइन किया गया है:

  • वर्ग पुनर्परिभाषा Dex फ़ाइलों पर आधारित है, जिसमें केवल का उपयोग करें.
  • इंस्ट्रुमेंटेशन और रीडेफ़िनिशन के लिए Java-भाषा एपीआई सार्वजनिक किए गए हैं.

ART TI, Android Studio प्रोफ़ाइलर के साथ भी काम करती है.

एजेंट को लोड करें या अटैच करें

रनटाइम शुरू होने पर किसी एजेंट को अटैच करने के लिए, इस निर्देश का इस्तेमाल करके, JVMTI प्लगिन और दिया गया एजेंट:

dalvikvm -Xplugin:libopenjdkjvmti.so -agentpath:/path/to/agent/libagent.so …

रनटाइम के दौरान एजेंट के लोड होने पर, सुरक्षा के कोई उपाय नहीं किए गए हैं शुरू होता है, तो ध्यान रखें कि मैन्युअल रूप से शुरू किया गया रनटाइम सुरक्षा उपायों के बिना बदलाव किया जा सकता है. (इसकी मदद से एआरटी टेस्टिंग की जा सकती है.)

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

पहले से चल रहे ऐप्लिकेशन में एजेंट को अटैच करने के लिए, इसका इस्तेमाल करें आदेश:

adb shell cmd activity attach-agent [process]
/path/to/agent/libagent.so[=agent-options]

अगर जेवीएमटीआई प्लगिन अब तक लोड नहीं हुआ है, तो एजेंट को अटैच करने से दोनों पेज लोड हो जाते हैं और एजेंट लाइब्रेरी को ऐक्सेस करने की कोशिश करते हैं.

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

एजेंट की जगह की जानकारी

रनटाइम में एजेंट को मौजूदा प्रोसेस में लोड करना ज़रूरी होता है, ताकि एजेंट आप उनसे सीधे तौर पर जुड़ सकते हैं और कम्यूनिकेट कर सकते हैं. एआरटी अपने-आप में एक है उस जगह के बारे में जानकारी जहां से एजेंट आता है. स्ट्रिंग का इस्तेमाल किया जाता है dlopen कॉल के लिए. फ़ाइल सिस्टम की अनुमतियां और SELinux नीतियां वास्तविक लोडिंग को प्रतिबंधित करता है.

डीबग करने लायक ऐप्लिकेशन की मदद से चलाए जा सकने वाले एजेंट डिलीवर करने के लिए, यह तरीका अपनाएं:

  • एजेंट को ऐप्लिकेशन के APK की लाइब्रेरी डायरेक्ट्री में जोड़ें.
  • एजेंट को ऐप्लिकेशन के डेटा में कॉपी करने के लिए, run-as का इस्तेमाल करें डायरेक्ट्री.

API

यह तरीका android.os.Debug में जोड़ा गया है.

/**
     * Attach a library as a jvmti agent to the current runtime, with the given classloader
     * determining the library search path.
     * Note: agents may only be attached to debuggable apps. Otherwise, this function will
     * throw a SecurityException.
     *
     * @param library the library containing the agent.
     * @param options the options passed to the agent.
     * @param classLoader the classloader determining the library search path.
     *
     * @throws IOException if the agent could not be attached.
     * @throws a SecurityException if the app is not debuggable.
     */
    public static void attachJvmtiAgent(@NonNull String library, @Nullable String options,
            @Nullable ClassLoader classLoader) throws IOException {

Android के अन्य एपीआई

अटैच-एजेंट निर्देश सभी को दिखता है. इस निर्देश में एक JVMTI अटैच किया जाता है एजेंट को दी जा रही प्रोसेस को पूरा करने के लिए:

adb shell 'am attach-agent com.example.android.displayingbitmaps
\'/data/data/com.example.android.displayingbitmaps/code_cache/libfieldnulls.so=Ljava/lang/Class;.name:Ljava/lang/String;\''

am start -P और am start-profiler/stop-profiler निर्देश, अटैच-एजेंट कमांड की तरह ही होते हैं.

जेवीएमटीआई

यह सुविधा, एजेंट (नेटिव कोड) को JVMTI API की जानकारी देती है. सबसे ज़रूरी क्षमताओं में शामिल हैं:

  • क्लास को फिर से तय करना.
  • ऑब्जेक्ट असाइन करने और कचरा इकट्ठा करने की गतिविधि ट्रैक की जा रही है.
  • इस ऑब्जेक्ट हैं.
  • Java कॉल स्टैक की जांच की जा रही है.
  • सभी थ्रेड को निलंबित कर दिया जाएगा और उन्हें फिर से शुरू किया जा सकेगा.

अलग-अलग वर्शन में, अलग-अलग सुविधाएं उपलब्ध हो सकती हैं Android.

इनके साथ काम करता है

इस सुविधा के लिए रनटाइम की मुख्य सुविधा चाहिए, जो सिर्फ़ Android 8.0 पर उपलब्ध हो और भी कई नतीजों पर मिलेंगे. लागू करने के लिए, डिवाइस मैन्युफ़ैक्चरर को कोई बदलाव करने की ज़रूरत नहीं होगी यह सुविधा. यह एओएसपी का हिस्सा है.

पुष्टि करें

CTS, Android 8 और उसके बाद के वर्शन पर इनकी जांच करता है:

  • यह जांच करता है कि एजेंट, डीबग किए जा सकने वाले ऐप्लिकेशन में अटैच करते हैं और डीबग नहीं किए जा सकने वाले ऐप्लिकेशन.
  • लागू किए गए सभी JVMTI एपीआई की जांच करता है
  • जांच करता है कि एजेंट का बाइनरी इंटरफ़ेस स्थिर है

Android 9 और इसके बाद के वर्शन में, अतिरिक्त टेस्ट जोड़े गए हैं. इनमें ये शामिल हैं सीटीएस टेस्ट का इस्तेमाल करता है.