बूट इमेज प्रोफ़ाइल

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

बूट प्रोफ़ाइल की जानकारी पाना

बूट इमेज प्रोफ़ाइलें, उन ऐप्लिकेशन की प्रोफ़ाइलों से मिलती हैं जिन्हें अहम उपयोगकर्ता गतिविधियों (सीयूजे) के दौरान एक्ज़ीक्यूट किया जाता है. किसी डिवाइस के कॉन्फ़िगरेशन में, ART, बूट क्लासपाथ के उन तरीकों और क्लास को कैप्चर करता है जिनका इस्तेमाल ऐप्लिकेशन करते हैं. यह काम, JIT प्रोफ़ाइल के हिस्से के तौर पर किया जाता है. इसके बाद, ART उस जानकारी को ऐप्लिकेशन प्रोफ़ाइल (उदाहरण के लिए, /data/misc/profiles/cur/0/com.android.chrome/primary.prof) में रिकॉर्ड करता है. यहां इसे बूट क्लासपाथ Dalvik EXecutable (DEX) फ़ाइल से इंडेक्स किया जाता है. ART प्रोफ़ाइल फ़ॉर्मैट देखें.

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

डिवाइस पर मौजूद सभी ऐप्लिकेशन प्रोफ़ाइलों से बूट क्लासपाथ की जानकारी इकट्ठा करने के लिए, adb shell cmd package snapshot-profile android कमांड चलाएँ. आपके पास एग्रीगेट की गई जानकारी का इस्तेमाल, प्रोसेसिंग और तरीके/क्लास के चुनाव के आधार के तौर पर करने का विकल्प होता है. इसके लिए, आपको अलग-अलग प्रोफ़ाइलों को मैन्युअल तरीके से एग्रीगेट करने की ज़रूरत नहीं होती. हालांकि, अगर चाहें, तो ऐसा किया जा सकता है.

बूट इमेज प्रोफ़ाइल

पहली इमेज. बूट इमेज प्रोफ़ाइल पाने की प्रोसेस

बूट इमेज प्रोफ़ाइल का डेटा

बूट इमेज प्रोफ़ाइलों में ये फ़ाइलें और डेटा शामिल होता है.

  • बूट क्लासपाथ के लिए प्रोफ़ाइल (frameworks/base/config/boot-image-profile.txt. इससे यह तय होता है कि बूट क्लासपाथ के किन तरीकों को ऑप्टिमाइज़ किया जाता है और बूट .art इमेज में कौनसी क्लास शामिल होती है.

  • प्रीलोड की गई क्लास की सूची. इस कुकी से यह तय होता है कि Zygote में कौनसी क्लास पहले से लोड की गई हैं.

  • सिस्टम सर्वर कॉम्पोनेंट के लिए प्रोफ़ाइल (frameworks/base/services/art-profile). इससे यह तय होता है कि सिस्टम सर्वर के किन तरीकों को ऑप्टिमाइज़/कंपाइल किया जाता है, बूट .art इमेज में कौनसी क्लास शामिल की जाती है, और इससे जुड़े DEX फ़ाइलें कैसे लेआउट की जाती हैं.

एआरटी प्रोफ़ाइल का फ़ॉर्मैट

एआरटी प्रोफ़ाइल, लोड की गई हर DEX फ़ाइल से जानकारी इकट्ठा करती है. इसमें, ऑप्टिमाइज़ करने लायक तरीकों और स्टार्टअप के दौरान इस्तेमाल की गई क्लास के बारे में जानकारी शामिल होती है. बूट इमेज प्रोफ़ाइलिंग चालू होने पर, ART, प्रोफ़ाइल में बूट क्लासपाथ और सिस्टम सर्वर JAR फ़ाइलों को भी शामिल करता है. साथ ही, हर DEX फ़ाइल को उस पैकेज के नाम के साथ एनोटेट करता है जो इसका इस्तेमाल करता है.

उदाहरण के लिए, इस कमांड का इस्तेमाल करके, रॉ बूट इमेज प्रोफ़ाइल डंप करें:

adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof

इससे इस तरह का आउटपुट मिलता है:

=== Dex files  ===
=== profile ===
ProfileInfo [012]

core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
        hot methods: 520[], 611[] …
        startup methods: …
        classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
        hot methods: 520[], 521[]…
        startup methods: …
        classes: …

ऊपर दिए गए उदाहरण में:

  • core-oj.jar का इस्तेमाल com.google.android.ext.services और com.android.systemui करते हैं. हर एंट्री में, core-oj.jar से इस्तेमाल किए गए दो पैकेज की जानकारी दी गई है.

  • दोनों प्रोसेस, DEX इंडेक्स 520 वाले तरीके का इस्तेमाल करती हैं. हालांकि, सिर्फ़ systemui प्रोसेस, DEX इंडेक्स 521 वाले तरीके का इस्तेमाल करती है. यही वजह प्रोफ़ाइल के अन्य सेक्शन (उदाहरण के लिए, स्टार्टअप क्लास) पर भी लागू होती है.

डेटा प्रोसेसिंग के दौरान, इस्तेमाल के आधार पर फ़िल्टर करने के तरीके/क्लास. इसमें सिस्टम-लेवल की प्रोसेस (उदाहरण के लिए, सिस्टम सर्वर या systemui) या उन तरीकों को प्राथमिकता दी जाती है जिनका इस्तेमाल आम तौर पर नहीं किया जाता, लेकिन वे अब भी ज़रूरी हैं (उदाहरण के लिए, कैमरा ऐप्लिकेशन में इस्तेमाल किए जाने वाले तरीके).

प्रोफ़ाइल फ़ॉर्मैट, हर तरीके को कई फ़्लैग (स्टार्टअप, पोस्ट-स्टार्टअप, हॉटनेस, एबीआई) के साथ अंदरूनी तौर पर एनोटेट करता है. यह डंप-ओनली फ़ॉर्मैट में दिखाए गए फ़्लैग से ज़्यादा है. सभी सिग्नल का इस्तेमाल करने के लिए, उपलब्ध स्क्रिप्ट में बदलाव करें.

सुझाव

सबसे अच्छे नतीजे पाने के लिए, इन दिशा-निर्देशों का पालन करें.

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

  • सिस्टम प्रोसेस में इस्तेमाल किए जाने वाले तरीकों/क्लास को चुनने में प्राथमिकता दें. ऐसा हो सकता है कि इन तरीकों/क्लास में ऐसे कोड का इस्तेमाल किया गया हो जिसे अन्य ऐप्लिकेशन अक्सर इस्तेमाल नहीं करते हैं. हालांकि, ऑप्टिमाइज़ेशन के लिए यह कोड अब भी ज़रूरी है.

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

डिवाइसों को कॉन्फ़िगर करना

सिस्टम प्रॉपर्टी के ज़रिए बूट प्रोफ़ाइल कॉन्फ़िगरेशन चालू करने के लिए, इनमें से किसी एक तरीके का इस्तेमाल करें.

  • पहला विकल्प: मैन्युअल तरीके से प्रॉप सेट अप करना (यह रीबूट होने तक काम करता है):

    adb root
    adb shell stop
    adb shell setprop dalvik.vm.profilebootclasspath true
    adb shell setprop dalvik.vm.profilesystemserver true
    adb shell start
  • दूसरा विकल्प: local.prop का इस्तेमाल करें. इससे फ़ाइल मिटाए जाने तक, हमेशा के लिए इफ़ेक्ट लागू हो जाता है. ऐसा करने के लिए:

    1. इस कॉन्टेंट के साथ एक local.prop फ़ाइल बनाएं:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. ये कमांड चलाएं:

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
  • तीसरा विकल्प: डिवाइस कॉन्फ़िगरेशन का इस्तेमाल करके, सर्वर साइड की ये प्रॉपर्टी सेट करें:

    adb shell device_config put runtime_native_boot profilebootclasspath true
    adb shell device_config put runtime_native_boot profilesystemserver true
    

बूट इमेज प्रोफ़ाइलें जनरेट करना

किसी एक डिवाइस पर टेस्टिंग करके, बूट इमेज की बेसिक प्रोफ़ाइल जनरेट करने के लिए, यहां दिए गए निर्देशों का पालन करें.

  1. डिवाइस को सेट अप करें.

    1. डिवाइस कॉन्फ़िगर करना में दिए गए तरीके से डिवाइस को कॉन्फ़िगर करें.

    2. (ज़रूरी नहीं) नई प्रोफ़ाइल फ़ॉर्मैट को अन्य प्रोफ़ाइलों को साफ़ करने और बदलने में समय लगता है. प्रोफ़ाइल कलेक्शन की प्रोसेस को तेज़ करने के लिए, डिवाइस पर मौजूद सभी प्रोफ़ाइलें रीसेट करें.

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
    3. डिवाइस पर CUJ चलाएं.

  2. इस कमांड का इस्तेमाल करके, प्रोफ़ाइल कैप्चर करें:

    adb shell cmd package snapshot-profile android
  3. इस कमांड का इस्तेमाल करके, प्रोफ़ाइल एक्सट्रैक्ट करें:

    adb pull /data/misc/profman/android.prof
  4. नीचे दिए गए निर्देशों का इस्तेमाल करके, बूट क्लासपाथ JAR फ़ाइलों पर जाएं:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
  5. नीचे दी गई profman कमांड का इस्तेमाल करके, बूट इमेज प्रोफ़ाइल जनरेट करें.

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
  6. डेटा का इस्तेमाल करके, उपलब्ध सिलेक्शन थ्रेशोल्ड फ़्लैग का इस्तेमाल करके profman कमांड में बदलाव करें.

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    पूरी सूची देखने के लिए, profman सहायता पेज या सोर्स कोड देखें.