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

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

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

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

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

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

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

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

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

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

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

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

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

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

ART प्रोफ़ाइल, लोड की गई हर 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 सहायता पेज या सोर्स कोड देखें.