हमारा सुझाव है कि Jetpack Macrobenchmark library का इस्तेमाल करके, प्रोफ़ाइल के नियमों को अपने-आप जनरेट होने की सुविधा चालू करें. इससे मैन्युअल तरीके से काम करने की ज़रूरत कम हो जाएगी और सामान्य स्केलेबिलिटी बढ़ जाएगी. हालांकि, आपके पास अपने ऐप्लिकेशन में प्रोफ़ाइल के नियमों को मैन्युअल तरीके से बनाने और उन्हें मेज़र करने का विकल्प होता है.
प्रोफ़ाइल के नियमों को मैन्युअल तरीके से तय करना
किसी ऐप्लिकेशन या लाइब्रेरी मॉड्यूल में, प्रोफ़ाइल के नियमों को मैन्युअल तरीके से तय किया जा सकता है. इसके लिए, src/main
डायरेक्ट्री में मौजूद baseline-prof.txt
नाम की फ़ाइल बनाएं. यह वही फ़ोल्डर है जिसमें AndroidManifest.xml
फ़ाइल मौजूद है.
फ़ाइल में, हर लाइन के लिए एक नियम तय किया जाता है. हर नियम, ऐप्लिकेशन या लाइब्रेरी में मौजूद उन तरीकों या क्लास के लिए एक पैटर्न दिखाता है जिन्हें ऑप्टिमाइज़ करने की ज़रूरत है.
adb shell profman --dump-classes-and-methods
का इस्तेमाल करते समय, इन नियमों का सिंटैक्स, लोगों के पढ़ने लायक एआरटी प्रोफ़ाइल फ़ॉर्मैट (एचआरएफ़) का सुपरसेट होता है. इसका सिंटैक्स, डिसक्रिप्टर और सिग्नेचर के सिंटैक्स जैसा ही होता है. हालांकि, इसमें वाइल्डकार्ड का इस्तेमाल किया जा सकता है, ताकि नियम लिखने की प्रोसेस को आसान बनाया जा सके.
यहां दिए गए उदाहरण में, Jetpack Compose लाइब्रेरी में शामिल कुछ Baseline Profile के नियम दिखाए गए हैं:
HSPLandroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V
HSPLandroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I
HLandroidx/compose/runtime/ComposerImpl;->validateNodeExpected()V
PLandroidx/compose/runtime/CompositionImpl;->applyChanges()V
HLandroidx/compose/runtime/ComposerKt;->findLocation(Ljava/util/List;I)I
Landroidx/compose/runtime/ComposerImpl;
इस सैंपल Compiler Explorer प्रोजेक्ट में, प्रोफ़ाइल के नियमों में बदलाव करके देखें. ध्यान दें कि Compiler Explorer सिर्फ़ लोगों के पढ़े जा सकने वाले एआरटी प्रोफ़ाइल फ़ॉर्मैट (एचआरएफ़) के साथ काम करता है. इसलिए, वाइल्डकार्ड इस्तेमाल नहीं किए जा सकते.
नियम का सिंटैक्स
ये नियम, तरीकों या क्लास को टारगेट करने के लिए दो में से किसी एक फ़ॉर्म में होते हैं:
[FLAGS][CLASS_DESCRIPTOR]->[METHOD_SIGNATURE]
क्लास के नियम में इस पैटर्न का इस्तेमाल किया जाता है:
[CLASS_DESCRIPTOR]
ज़्यादा जानकारी के लिए, यहां दी गई टेबल देखें:
वाक्य-विन्यास | ब्यौरा |
---|---|
FLAGS |
यह H , S , और P में से एक या उससे ज़्यादा वर्णों को दिखाता है. इससे यह पता चलता है कि स्टार्टअप टाइप के हिसाब से, इस तरीके को Hot , Startup या Post Startup के तौर पर फ़्लैग किया जाना चाहिए या नहीं. H फ़्लैग वाली किसी मेथड का मतलब है कि यह एक "हॉट" मेथड है. इसका मतलब है कि ऐप्लिकेशन के लाइफ़टाइम के दौरान इसे कई बार कॉल किया जाता है. S फ़्लैग वाली किसी मेथड का मतलब है कि इसे स्टार्टअप के दौरान कॉल किया जाता है. P फ़्लैग वाली कोई भी विधि यह दिखाती है कि इसे स्टार्टअप के बाद कॉल किया गया है. इस फ़ाइल में मौजूद क्लास से पता चलता है कि इसका इस्तेमाल स्टार्टअप के दौरान किया जाता है. साथ ही, क्लास लोडिंग की लागत से बचने के लिए, इसे हीप में पहले से असाइन किया जाना चाहिए. ART कंपाइलर, ऑप्टिमाइज़ेशन की कई रणनीतियों का इस्तेमाल करता है. जैसे, इन तरीकों का एओटी कंपाइलेशन और जनरेट की गई एओटी फ़ाइल में लेआउट ऑप्टिमाइज़ेशन करना. |
CLASS_DESCRIPTOR |
टारगेट किए गए तरीके की क्लास के लिए डिस्क्रिप्टर. उदाहरण के लिए, androidx.compose.runtime.SlotTable का डिसक्रिप्टर Landroidx/compose/runtime/SlotTable; है. यहां Dalvik Executable (DEX) फ़ॉर्मैट के हिसाब से, L को पहले जोड़ा गया है. |
METHOD_SIGNATURE |
मेथड का सिग्नेचर. इसमें मेथड का नाम, पैरामीटर टाइप, और रिटर्न टाइप शामिल होते हैं. उदाहरण के लिए:// LayoutNode.kt fun isPlaced():Boolean { // ... } पर LayoutNode का हस्ताक्षर isPlaced()Z है. |
इन पैटर्न में वाइल्डकार्ड हो सकते हैं, ताकि एक ही नियम में कई तरीके या क्लास शामिल हों. Android Studio में नियम के सिंटैक्स का इस्तेमाल करके लिखते समय, सहायता पाने के लिए Android की बेसलाइन प्रोफ़ाइलें प्लगिन देखें.
वाइल्डकार्ड नियम का उदाहरण कुछ ऐसा दिख सकता है:
HSPLandroidx/compose/ui/layout/**->**(**)**
बेसलाइन प्रोफ़ाइल के नियमों में इस्तेमाल किए जा सकने वाले टाइप
बेसलिन प्रोफ़ाइल के नियमों में, यहां दिए गए टाइप इस्तेमाल किए जा सकते हैं. इन टाइप के बारे में ज़्यादा जानने के लिए, Dalvik Executable (DEX) फ़ॉर्मैट देखें.
वर्ण | टाइप | ब्यौरा |
---|---|---|
B |
बाइट | साइन किया गया बाइट |
C |
char | UTF-16 में कोड में बदला गया यूनिकोड कैरेक्टर कोड पॉइंट |
D |
डबल | डबल-प्रिसिशन फ़्लोटिंग पॉइंट वैल्यू |
F |
फ़्लोट | सिंगल-प्रीसिज़न फ़्लोटिंग पॉइंट वैल्यू |
I |
आईएनटी | पूर्णांक |
J |
लंबा | लंबा पूर्णांक |
S |
छोटा | हस्ताक्षर किया गया शॉर्ट वीडियो |
V |
अमान्य | अमान्य |
Z |
बूलियन | सही या गलत |
L (क्लास का नाम) |
संदर्भ | क्लास के नाम का इंस्टेंस |
इसके अलावा, लाइब्रेरी ऐसे नियम तय कर सकती हैं जिन्हें एएआर आर्टफ़ैक्ट में पैकेज किया गया हो. इन आर्टफ़ैक्ट को शामिल करने के लिए APK बनाते समय, नियमों को एक साथ मर्ज कर दिया जाता है. यह ठीक उसी तरह होता है जैसे मेनिफ़ेस्ट मर्ज किया जाता है. इसके बाद, इन्हें APK के लिए खास तौर पर तैयार की गई कॉम्पैक्ट बाइनरी एआरटी प्रोफ़ाइल में कंपाइल किया जाता है.
जब APK का इस्तेमाल डिवाइसों पर किया जाता है, तब ART इस प्रोफ़ाइल का इस्तेमाल करता है. ऐसा Android 9 (एपीआई लेवल 28) पर इंस्टॉल करने के दौरान, ऐप्लिकेशन के किसी खास सबसेट को AOT कंपाइल करने के लिए किया जाता है. इसके अलावा, Android 7 (एपीआई लेवल 24) पर ProfileInstaller
का इस्तेमाल करते समय भी ऐसा किया जाता है.
मैन्युअल तरीके से बेसलाइन प्रोफ़ाइलें इकट्ठा करना
Macrobenchmark लाइब्रेरी को सेट अप किए बिना, मैन्युअल तरीके से बेसलाइन प्रोफ़ाइल जनरेट की जा सकती है. साथ ही, उपयोगकर्ता के मुख्य टास्क के लिए यूज़र इंटरफ़ेस (यूआई) ऑटोमेशन बनाए जा सकते हैं. हमारा सुझाव है कि आप मैक्रोबेंचमार्क का इस्तेमाल करें. हालांकि, ऐसा हमेशा मुमकिन नहीं होता. उदाहरण के लिए, अगर Gradle के अलावा किसी दूसरे बिल्ड सिस्टम का इस्तेमाल किया जा रहा है, तो Baseline Profile Gradle प्लगिन का इस्तेमाल नहीं किया जा सकता. ऐसे मामलों में, बेसलाइन प्रोफ़ाइल के नियमों को मैन्युअल तरीके से इकट्ठा किया जा सकता है. अगर एपीआई लेवल 34 और इसके बाद के लेवल पर काम करने वाले डिवाइस या एम्युलेटर का इस्तेमाल किया जाता है, तो यह काम ज़्यादा आसानी से किया जा सकता है. हालांकि, कम एपीआई लेवल पर भी ऐसा किया जा सकता है, लेकिन इसके लिए रूट ऐक्सेस की ज़रूरत होती है. साथ ही, आपको एओएसपी इमेज चलाने वाले एम्युलेटर का इस्तेमाल करना होगा. सीधे तौर पर नियम इकट्ठा करने के लिए, यह तरीका अपनाएं:
- टेस्ट डिवाइस पर, अपने ऐप्लिकेशन का रिलीज़ वर्शन इंस्टॉल करें. ऐप्लिकेशन का बिल्ड टाइप, R8-ऑप्टिमाइज़ नहीं होना चाहिए. साथ ही, इसे डीबग किया जा सकने वाला नहीं होना चाहिए, ताकि ऐसी प्रोफ़ाइल कैप्चर की जा सके जिसका इस्तेमाल बिल्ड सिस्टम कर सके.
- प्रोफ़ाइल इंस्टॉल करने की सुविधा बंद करें और ऐप्लिकेशन बंद करें.
अगर आपके APK की Jetpack Profile Installer लाइब्रेरी पर डिपेंडेंसी है, तो लाइब्रेरी आपके APK के पहली बार लॉन्च होने पर प्रोफ़ाइल बूटस्ट्रैप करती है. इससे प्रोफ़ाइल जनरेट करने की प्रोसेस में रुकावट आ सकती है. इसलिए, इसे बंद करने के लिए यहां दिया गया निर्देश इस्तेमाल करें:
adb shell am broadcast -a androidx.profileinstaller.action.SKIP_FILE WRITE_SKIP_FILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver
ऐप्लिकेशन के कंपाइलेशन को रीसेट करें और सभी प्रोफ़ाइलें मिटाएं.
एपीआई 34 और इसके बाद के वर्शन
adb shell cmd package compile -f -m verify $PACKAGE_NAME adb shell pm art clear-app-profiles $PACKAGE_NAME
एपीआई लेवल 33 और इससे पहले के लेवल
adb root adb shell cmd package compile --reset $PACKAGE_NAME
ऐप्लिकेशन चलाएं और उन क्रिटिकल यूज़र जर्नी पर मैन्युअल तरीके से जाएं जिनके लिए आपको प्रोफ़ाइल इकट्ठा करनी है.
प्रोफ़ाइलों को स्थिर होने के लिए, कम से कम पांच सेकंड तक इंतज़ार करें.
सेव करने की कार्रवाई करें और सेव होने की प्रोसेस पूरी होने का इंतज़ार करें. अगर आपके APK में Jetpack Profile Installer लाइब्रेरी पर निर्भरता है, तो प्रोफ़ाइलें डंप करने के लिए इसका इस्तेमाल करें:
अगर प्रोफ़ाइल इंस्टॉलर का इस्तेमाल नहीं किया जा रहा है, तो यहां दी गई कमांड का इस्तेमाल करके, किसी एम्युलेटर पर प्रोफ़ाइलें मैन्युअल तरीके से डंप करें:adb shell am broadcast -a androidx.profileinstaller.action.SAVE_PROFILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver sleep 1 # wait 1 second adb shell am force-stop $PACKAGE_NAME
adb root adb shell killall -s SIGUSR1 $PACKAGE_NAME sleep 1 # wait 1 second adb shell am force-stop $PACKAGE_NAME
जनरेट की गई बाइनरी प्रोफ़ाइलों को टेक्स्ट में बदलें:
एपीआई 34 और इसके बाद के वर्शन
adb shell pm dump-profiles --dump-classes-and-methods $PACKAGE_NAME
एपीआई लेवल 33 और इससे पहले के लेवल
यह कुकी यह तय करती है कि रेफ़रंस प्रोफ़ाइल या मौजूदा प्रोफ़ाइल बनाई गई है या नहीं. रेफ़रंस प्रोफ़ाइल यहां मौजूद होती है:
/data/misc/profiles/ref/$$PACKAGE_NAME/primary.prof
मौजूदा प्रोफ़ाइल इस जगह पर मौजूद है:
/data/misc/profiles/cur/0/$PACKAGE_NAME/primary.prof
APK की जगह की जानकारी का पता लगाएं:
adb root adb shell pm path $PACKAGE_NAME
कन्वर्ज़न करना:
adb root adb shell profman --dump-classes-and-methods --profile-file=$PROFILE_PATH --apk=$APK_PATH > /data/misc/profman/$PACKAGE_NAME-primary.prof.txt
डिवाइस से डंप की गई प्रोफ़ाइल वापस पाने के लिए,
adb
का इस्तेमाल करें:adb pull /data/misc/profman/$PACKAGE_NAME-primary.prof.txt PATH_TO_APP_MODULE/src/main/
इससे जनरेट किए गए प्रोफ़ाइल के नियम फ़ेच होते हैं और आपके ऐप्लिकेशन मॉड्यूल में इंस्टॉल हो जाते हैं. अगली बार ऐप्लिकेशन बनाने पर, बेसलाइन प्रोफ़ाइल शामिल की जाती है. इसकी पुष्टि करने के लिए, इंस्टॉल करने से जुड़ी समस्याएं में दिया गया तरीका अपनाएं.
ऐप्लिकेशन में हुए सुधारों को मैन्युअल तरीके से मेज़र करना
हमारा सुझाव है कि आप बेंचमार्किंग की मदद से, ऐप्लिकेशन में हुए सुधारों को मेज़र करें. हालांकि, अगर आपको मैन्युअल तरीके से सुधारों का आकलन करना है, तो रेफ़रंस के लिए, बिना ऑप्टिमाइज़ किए गए ऐप्लिकेशन के स्टार्टअप का आकलन करके शुरू करें.
PACKAGE_NAME=com.example.app
# Force Stop App adb shell am force-stop $PACKAGE_NAME # Reset compiled state adb shell cmd package compile --reset $PACKAGE_NAME
# Measure App startup # This corresponds to `Time to initial display` metric. adb shell am start-activity -W -n $PACKAGE_NAME/.ExampleActivity \ | grep "TotalTime"
इसके बाद, बेसलाइन प्रोफ़ाइल को साइडलोड करें.
# Unzip the Release APK first. unzip release.apk
# Create a ZIP archive. # The name should match the name of the APK. # Copy `baseline.prof{m}` and rename it `primary.prof{m}`. cp assets/dexopt/baseline.prof primary.prof cp assets/dexopt/baseline.profm primary.profm
# Create an archive. zip -r release.dm primary.prof primary.profm
# Confirm that release.dm only contains the two profile files: unzip -l release.dm # Archive: release.dm # Length Date Time Name # --------- ---------- ----- ---- # 3885 1980-12-31 17:01 primary.prof # 1024 1980-12-31 17:01 primary.profm # --------- ------- # 2 files
# Install APK + Profile together. adb install-multiple release.apk release.dm
यह पुष्टि करने के लिए कि पैकेज को इंस्टॉल करते समय ऑप्टिमाइज़ किया गया था, यह कमांड चलाएं:
# Check dexopt state.
adb shell dumpsys package dexopt | grep -A 1 $PACKAGE_NAME
आउटपुट में यह बताया जाना चाहिए कि पैकेज कंपाइल हो गया है:
[com.example.app]
path: /data/app/~~YvNxUxuP2e5xA6EGtM5i9A==/com.example.app-zQ0tkJN8tDrEZXTlrDUSBg==/base.apk
arm64: [status=speed-profile] [reason=install-dm]
अब ऐप्लिकेशन के स्टार्टअप की परफ़ॉर्मेंस को पहले की तरह मेज़र किया जा सकता है. हालांकि, कंपाइल की गई स्थिति को रीसेट करने की ज़रूरत नहीं होगी. पक्का करें कि आपने पैकेज के लिए कंपाइल की गई स्थिति को रीसेट न किया हो.
# Force stop app adb shell am force-stop $PACKAGE_NAME
# Measure app startup adb shell am start-activity -W -n $PACKAGE_NAME/.ExampleActivity \ | grep "TotalTime"
बेसलाइन प्रोफ़ाइलें और profgen
इस सेक्शन में बताया गया है कि बेसलिन प्रोफ़ाइल का कंपैक्ट बाइनरी वर्शन बनाते समय, profgen टूल क्या करता है.
Profgen-cli, प्रोफ़ाइल कंपाइल करने, इंट्रॉस्पेक्शन करने, और ART प्रोफ़ाइलों को ट्रांसपाइल करने में मदद करता है. इससे, उन्हें Android पर चलने वाले डिवाइसों पर इंस्टॉल किया जा सकता है. इसके लिए, टारगेट एसडीके वर्शन से कोई फ़र्क़ नहीं पड़ता.
Profgen-cli एक सीएलआई है. यह Baseline Profile के HRF को कंपाइल करके, कंपाइल किए गए फ़ॉर्मैट में बदलता है. सीएलआई, Android SDK के हिस्से के तौर पर cmdline-tools
रिपॉज़िटरी में भी उपलब्ध है.
ये सुविधाएं studio-main
ब्रांच में उपलब्ध हैं:
➜ ../cmdline-tools/latest/bin
apkanalyzer
avdmanager
lint
profgen
retrace
screenshot2
sdkmanager
Profgen-cli की मदद से, छोटी बाइनरी प्रोफ़ाइलें बनाना
Profgen-cli के साथ bin
, validate
, और dumpProfile
कमांड उपलब्ध हैं. उपलब्ध कमांड देखने के लिए, profgen --help
का इस्तेमाल करें:
➜ profgen --help
Usage: profgen options_list
Subcommands:
bin - Generate Binary Profile
validate - Validate Profile
dumpProfile - Dump a binary profile to a HRF
Options:
--help, -h -> Usage info
कॉम्पैक्ट बाइनरी प्रोफ़ाइल जनरेट करने के लिए, bin
कमांड का इस्तेमाल करें. बातचीत शुरू करने का उदाहरण यहां दिया गया है:
profgen bin ./baseline-prof.txt \
--apk ./release.apk \
--map ./obfuscation-map.txt \
--profile-format v0_1_0_p \
--output ./baseline.prof \
उपलब्ध विकल्प देखने के लिए, profgen bin options_list
का इस्तेमाल करें:
Usage: profgen bin options_list
Arguments:
profile -> File path to Human Readable profile { String }
Options:
--apk, -a -> File path to apk (always required) { String }
--output, -o -> File path to generated binary profile (always required)
--map, -m -> File path to name obfuscation map { String }
--output-meta, -om -> File path to generated metadata output { String }
--profile-format, -pf [V0_1_0_P] -> The ART profile format version
{ Value should be one of [
v0_1_5_s, v0_1_0_p, v0_0_9_omr1, v0_0_5_o, v0_0_1_n
]
}
--help, -h -> Usage info
पहले आर्ग्युमेंट में, baseline-prof.txt
एचआरएफ़ का पाथ दिखाया जाता है.
Profgen-cli को APK के रिलीज़ बिल्ड का पाथ और एक ऑब्फ़स्केशन मैप की भी ज़रूरत होती है. इसका इस्तेमाल R8 या Proguard का इस्तेमाल करते समय, APK को ऑब्फ़स्केट करने के लिए किया जाता है. इस तरह, profgen
एचआरएफ़ में मौजूद सोर्स सिंबल को, कंपाइल की गई प्रोफ़ाइल बनाते समय उनके धुंधले किए गए नामों में बदल सकता है.
ART प्रोफ़ाइल के फ़ॉर्मैट, आगे या पीछे के वर्शन के साथ काम नहीं करते. इसलिए, एक प्रोफ़ाइल फ़ॉर्मैट उपलब्ध कराएं, ताकि profgen
पैकेज प्रोफ़ाइल मेटाडेटा (profm
) उपलब्ध करा सके. इसका इस्तेमाल, ज़रूरत पड़ने पर एक ART प्रोफ़ाइल फ़ॉर्मैट को दूसरे में ट्रांसकोड करने के लिए किया जा सकता है.
प्रोफ़ाइल के फ़ॉर्मैट और प्लैटफ़ॉर्म के वर्शन
प्रोफ़ाइल फ़ॉर्मैट चुनते समय, ये विकल्प उपलब्ध होते हैं:
प्रोफ़ाइल का फ़ॉर्मैट | प्लेटफ़ॉर्म वर्शन | API स्तर |
---|---|---|
v0_1_5_s | Android S+ | 31 से ज़्यादा |
v0_1_0_p | Android P, Q, और R | 28-30 |
v0_0_9_omr1 | Android O MR1 | 27 |
v0_0_5_o | Android O | 26 |
v0_0_1_n | Android N | 24-25 |
baseline.prof
और baseline.profm
आउटपुट फ़ाइलों को APK में मौजूद assets
या dexopt
फ़ोल्डर में कॉपी करें.
ओब्फ़स्केशन मैप
अगर एचआरएफ़, सोर्स सिंबल का इस्तेमाल करता है, तो आपको सिर्फ़ अस्पष्ट करने वाली मैपिंग फ़ाइल देनी होगी. अगर एचआरएफ़, पहले से अस्पष्ट किए गए रिलीज़ बिल्ड से जनरेट किया गया है और मैपिंग की ज़रूरत नहीं है, तो उस विकल्प को अनदेखा किया जा सकता है. साथ ही, आउटपुट को assets
या dexopt
फ़ोल्डर में कॉपी किया जा सकता है.
बेसलाइन प्रोफ़ाइल को पारंपरिक तरीके से इंस्टॉल करना
आम तौर पर, किसी डिवाइस पर बेसलाइन प्रोफ़ाइल दो तरीकों से डिलीवर की जाती हैं.
DexMetadata के साथ install-multiple
का इस्तेमाल करना
एपीआई 28 और इसके बाद के वर्शन पर काम करने वाले डिवाइसों पर, Play क्लाइंट, इंस्टॉल किए जा रहे APK वर्शन के लिए APK और DexMetadata (DM) पेलोड डाउनलोड करता है. डीएम में प्रोफ़ाइल की वह जानकारी होती है जिसे डिवाइस पर Package Manager को भेजा जाता है.
APK और डीएम को एक ही इंस्टॉल सेशन के हिस्से के तौर पर इंस्टॉल किया जाता है. इसके लिए, इस तरह के कोड का इस्तेमाल किया जाता है:
adb install-multiple base.apk base.dm
Jetpack ProfileInstaller
एपीआई लेवल 29 और इसके बाद के वर्शन वाले डिवाइसों पर, Jetpack ProfileInstaller लाइब्रेरी, डिवाइस पर APK इंस्टॉल होने के बाद, assets
या dexopt
में पैकेज की गई प्रोफ़ाइल को इंस्टॉल करने का एक वैकल्पिक तरीका उपलब्ध कराती है. ProfileInstaller
को ProfileInstallReceiver
या सीधे तौर पर ऐप्लिकेशन से शुरू किया जाता है.
ProfileInstaller लाइब्रेरी, टारगेट डिवाइस के SDK वर्शन के आधार पर प्रोफ़ाइल को ट्रांसकोड करती है. साथ ही, प्रोफ़ाइल को डिवाइस पर मौजूद cur
डायरेक्ट्री में कॉपी करती है. यह डायरेक्ट्री, डिवाइस पर ART प्रोफ़ाइलों के लिए पैकेज के हिसाब से स्टेजिंग डायरेक्ट्री होती है.
जब डिवाइस का इस्तेमाल नहीं किया जा रहा होता है, तब डिवाइस पर bg-dexopt
नाम की प्रोसेस, प्रोफ़ाइल को चुनती है.
बेसलाइन प्रोफ़ाइल को साइडलोड करना
इस सेक्शन में, किसी APK के लिए बेसलाइन प्रोफ़ाइल इंस्टॉल करने का तरीका बताया गया है.
androidx.profileinstaller
से ब्रॉडकास्ट करना
एपीआई 24 और इसके बाद के वर्शन वाले डिवाइसों पर, प्रोफ़ाइल इंस्टॉल करने के लिए यह निर्देश ब्रॉडकास्ट किया जा सकता है:
# Broadcast the install profile command - moves binary profile from assets
# to a location where ART uses it for the next compile.
# When successful, the following command prints "1":
adb shell am broadcast \
-a androidx.profileinstaller.action.INSTALL_PROFILE \
<pkg>/androidx.profileinstaller.ProfileInstallReceiver
# Kill the process
am force-stop <pkg>
# Compile the package based on profile
adb shell cmd package compile -f -m speed-profile <pkg>
ProfileInstaller, बेसलाइन प्रोफ़ाइल वाले ज़्यादातर APK में मौजूद नहीं होता. Play पर मौजूद 4,50,000 ऐप्लिकेशन में से करीब 77,000 ऐप्लिकेशन में यह मौजूद नहीं होता. हालांकि, यह Compose का इस्तेमाल करने वाले हर APK में मौजूद होता है. ऐसा इसलिए है, क्योंकि लाइब्रेरी, ProfileInstaller पर निर्भरता का एलान किए बिना प्रोफ़ाइलें उपलब्ध करा सकती हैं. Jetpack से शुरू होने वाली हर लाइब्रेरी में, प्रोफ़ाइल के साथ डिपेंडेंसी जोड़ने की सुविधा मिलती है.
profgen या DexMetaData के साथ install-multiple
का इस्तेमाल करना
API 28 और उसके बाद के वर्शन वाले डिवाइसों पर, ऐप्लिकेशन में ProfileInstaller लाइब्रेरी के बिना ही, बेसलाइन प्रोफ़ाइल को साइडलोड किया जा सकता है.
इसके लिए, Profgen-cli का इस्तेमाल करें:
profgen extractProfile \
--apk app-release.apk \
--output-dex-metadata app-release.dm \
--profile-format V0_1_5_S # Select based on device and the preceding table.
# Install APK and the profile together
adb install-multiple appname-release.apk appname-release.dm
APK स्प्लिट के लिए, ऊपर दिए गए एक्सट्रैक्ट प्रोफ़ाइल के चरणों को हर APK के लिए एक बार चलाएं. इंस्टॉल करते समय, हर APK और उससे जुड़ी .dm
फ़ाइल पास करें. साथ ही, यह पक्का करें कि APK और .dm
के नाम मेल खाते हों:
adb install-multiple appname-base.apk appname-base.dm \
appname-split1.apk appname-split1.dm
पुष्टि
यह पुष्टि करने के लिए कि प्रोफ़ाइल सही तरीके से इंस्टॉल की गई है, ऐप्लिकेशन की परफ़ॉर्मेंस को मैन्युअल तरीके से मेज़र करें में दिए गए चरणों का इस्तेमाल किया जा सकता है.
बाइनरी प्रोफ़ाइल का कॉन्टेंट डंप करना
बेसलिन प्रोफ़ाइल के कंपैक्ट बाइनरी वर्शन के कॉन्टेंट की जांच करने के लिए, Profgen-cli dumpProfile
विकल्प का इस्तेमाल करें:
Usage: profgen dumpProfile options_list
Options:
--profile, -p -> File path to the binary profile (always required)
--apk, -a -> File path to apk (always required) { String }
--map, -m -> File path to name obfuscation map { String }
--strict, -s [true] -> Strict mode
--output, -o -> File path for the HRF (always required) { String }
--help, -h -> Usage info
dumpProfile
को APK की ज़रूरत होती है, क्योंकि कॉम्पैक्ट बाइनरी फ़ॉर्मैट में सिर्फ़ DEX ऑफ़सेट सेव होते हैं. इसलिए, क्लास और तरीके के नामों को फिर से बनाने के लिए, इसकी ज़रूरत होती है.
सख्त मोड डिफ़ॉल्ट रूप से चालू होता है. यह APK में मौजूद DEX फ़ाइलों के साथ प्रोफ़ाइल की कंपैटिबिलिटी की जांच करता है. अगर आपको किसी दूसरे टूल से जनरेट की गई प्रोफ़ाइलों को डीबग करना है, तो आपको कंपैटिबिलिटी से जुड़ी समस्याएं मिल सकती हैं. इनकी वजह से, आपको जांच के लिए डंप करने में समस्या आ सकती है. ऐसे मामलों में, --strict false
की मदद से स्ट्रिक्ट मोड बंद किया जा सकता है. हालांकि, ज़्यादातर मामलों में आपको स्ट्रिक्ट मोड चालू रखना चाहिए.
ऑब्फ़स्केशन मैप देना ज़रूरी नहीं है. अगर इसे दिया जाता है, तो इससे ऑब्फ़स्केट किए गए सिंबल को उनके ऐसे वर्शन में फिर से मैप करने में मदद मिलती है जिन्हें कोई भी व्यक्ति आसानी से पढ़ सकता है. इससे इस्तेमाल करना आसान हो जाता है.
आपके लिए सुझाव
- ध्यान दें: JavaScript बंद होने पर लिंक टेक्स्ट दिखता है
- SQLite की परफ़ॉर्मेंस के लिए सबसे सही तरीके
- बेसलाइन प्रोफ़ाइलें {:#baseline-profiles}
- अटके हुए पार्शियल वेक लॉक