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

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

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

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

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

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

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

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

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

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

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

  • पहले से लोड की गई क्लास की सूची. यह तय करता है कि 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 टूल एक से ज़्यादा बूट इमेज प्रोफ़ाइल को एग्रीगेट करने और चुनने की सुविधा देता है, लेकिन यह सिर्फ़ बूट इमेज के उसी वर्शन (बूट क्लासपाथ) के साथ ही काम करता है.

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

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

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

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

  • पहला विकल्प: मैन्युअल तरीके से प्रॉपर्टी सेट अप करें (इसके बाद, डिवाइस फिर से चालू हो जाता है):

    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
      
  • तीसरा विकल्प: डिवाइस कॉन्फ़िगरेशन का इस्तेमाल करके, इन सर्वर-साइड प्रॉपर्टी को सेट करें:

    persist.device_config.runtime_native_boot.profilesystemserver
    persist.device_config.runtime_native_boot.profilebootclasspath`
    

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

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

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

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

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

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

  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 सहायता पेज या सोर्स कोड देखें.