बेसलाइन प्रोफ़ाइल डीबग करें

इस दस्तावेज़ में, समस्याओं की पहचान करने और पक्का करने के लिए सबसे सही तरीके बताए गए हैं ज़्यादा से ज़्यादा फ़ायदा देने के लिए, आपकी बेसलाइन प्रोफ़ाइल सही तरीके से काम करती हैं.

बिल्ड से जुड़ी समस्याएं

अगर आपने अब Android में में बेसलाइन प्रोफ़ाइल का उदाहरण कॉपी किया है, तो सैंपल ऐप्लिकेशन डाउनलोड करते हैं, तो बेसलाइन प्रोफ़ाइल टास्क के दौरान आपको टेस्ट में गड़बड़ी मिल सकती है यह बताता है कि टेस्ट, एम्युलेटर पर नहीं चलाए जा सकते:

./gradlew assembleDemoRelease
Starting a Gradle Daemon (subsequent builds will be faster)
Calculating task graph as no configuration cache is available for tasks: assembleDemoRelease
Type-safe project accessors is an incubating feature.

> Task :benchmarks:pixel6Api33DemoNonMinifiedReleaseAndroidTest
Starting 14 tests on pixel6Api33

com.google.samples.apps.nowinandroid.foryou.ScrollForYouFeedBenchmark > scrollFeedCompilationNone[pixel6Api33] FAILED
        java.lang.AssertionError: ERRORS (not suppressed): EMULATOR
        WARNINGS (suppressed):
        ...

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

installDemoRelease -Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile

इसके अलावा, Android Studio में अपनी पसंद के मुताबिक रन कॉन्फ़िगरेशन बनाया जा सकता है, ताकि इसे चुनकर एम्युलेटर पर बेसलाइन प्रोफ़ाइल चालू करें चलाएं > कॉन्फ़िगरेशन में बदलाव करने के लिए:

Android में Now में बेसलाइन प्रोफ़ाइल बनाने के लिए, कस्टम रन कॉन्फ़िगरेशन जोड़ें
पहली इमेज. बेसलाइन बनाने के लिए, अपने हिसाब से रन कॉन्फ़िगरेशन जोड़ें अब Android पर प्रोफ़ाइलें देखें.

इंस्टॉलेशन संबंधी समस्याएं

यह जांच लें कि आपने जो APK या एएबी बनाया है वह ऐसे बिल्ड वैरिएंट से है जिसमें यह शामिल है बेसलाइन प्रोफ़ाइल. इसे देखने का सबसे आसान तरीका है कि APK को बिल्ड > APK का विश्लेषण करें APK इंस्टॉल कर रहे हैं और /assets/dexopt/baseline.prof में प्रोफ़ाइल ढूंढ रहे हैं फ़ाइल:

Android Studio में APK व्यूअर का इस्तेमाल करके, बेसलाइन प्रोफ़ाइल की जांच करना
दूसरी इमेज. इसमें APK व्यूअर का इस्तेमाल करके बेसलाइन प्रोफ़ाइल की जांच करें Android Studio.

ऐप्लिकेशन चलाने वाले डिवाइस पर बेसलाइन प्रोफ़ाइल को कंपाइल किया जाना चाहिए. दोनों के लिए का उपयोग करके इंस्टॉल किए गए ऐप्लिकेशन स्टोर इंस्टॉल और PackageInstaller, डिवाइस पर मौजूद कई क्लिप को ऐप्लिकेशन के हिस्से के तौर पर कंपाइल किया जाता है इंस्टॉल करने की प्रोसेस शुरू होती है. हालांकि, जब Android Studio से ऐप्लिकेशन को अलग से लोड किया जाता है, या कमांड-लाइन टूल का इस्तेमाल करने पर, Jetpack ProfileInstaller लाइब्रेरी यह डेटा इकट्ठा करने के लिए बैकग्राउंड DEX ऑप्टिमाइज़ेशन प्रोसेस. ऐसे मामलों में, अगर आपको यह पक्का करना है कि बेसलाइन प्रोफ़ाइल का इस्तेमाल किया जा रहा है. आपको ये काम करने होंगे बेसलाइन प्रोफ़ाइलों का ज़बरदस्ती कंपाइलेशन होता है. ProfileVerifier की ओर से आप प्रोफ़ाइल के इंस्टॉलेशन और कंपाइलेशन की स्थिति के बारे में क्वेरी करते हैं, जैसा कि नीचे दिया गया उदाहरण:

Kotlin

private const val TAG = "MainActivity"

class MainActivity : ComponentActivity() {
  ...
  override fun onResume() {
    super.onResume()
    lifecycleScope.launch {
      logCompilationStatus()
    }
  }

  private suspend fun logCompilationStatus() {
     withContext(Dispatchers.IO) {
        val status = ProfileVerifier.getCompilationStatusAsync().await()
        when (status.profileInstallResultCode) {
            RESULT_CODE_NO_PROFILE ->
                Log.d(TAG, "ProfileInstaller: Baseline Profile not found")
            RESULT_CODE_COMPILED_WITH_PROFILE ->
                Log.d(TAG, "ProfileInstaller: Compiled with profile")
            RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION ->
                Log.d(TAG, "ProfileInstaller: Enqueued for compilation")
            RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING ->
                Log.d(TAG, "ProfileInstaller: App was installed through Play store")
            RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST ->
                Log.d(TAG, "ProfileInstaller: PackageName not found")
            RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ ->
                Log.d(TAG, "ProfileInstaller: Cache file exists but cannot be read")
            RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE ->
                Log.d(TAG, "ProfileInstaller: Can't write cache file")
            RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION ->
                Log.d(TAG, "ProfileInstaller: Enqueued for compilation")
            else ->
                Log.d(TAG, "ProfileInstaller: Profile not compiled or enqueued")
        }
    }
}

Java

public class MainActivity extends ComponentActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onResume() {
        super.onResume();

        logCompilationStatus();
    }

    private void logCompilationStatus() {
         ListeningExecutorService service = MoreExecutors.listeningDecorator(
                Executors.newSingleThreadExecutor());
        ListenableFutureP<rofileVerifier.CompilationStatus >future =
                ProfileVerifier.getCompilationStatusAsync();
        Futures.addCallback(future, new FutureCallback(<>) {
            @Override
            public void onSuccess(CompilationStatus result) {
                int resultCode = result.getProfileInstallResultCode();
                if (resultCode == RESULT_CODE_NO_PROFILE) {
                    Log.d(TAG, "ProfileInstaller: Baseline Profile not found");
                } else if (resultCode == RESULT_CODE_COMPILED_WITH_PROFILE) {
                    Log.d(TAG, "ProfileInstaller: Compiled with profile");
                } else if (resultCode == RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) {
                    Log.d(TAG, "ProfileInstaller: Enqueued for compilation");
                } else if (resultCode == RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING) {
                    Log.d(TAG, "ProfileInstaller: App was installed through Play store");
                } else if (resultCode == RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST) {
                    Log.d(TAG, "ProfileInstaller: PackageName not found");
                } else if (resultCode == RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ) {
                    Log.d(TAG, "ProfileInstaller: Cache file exists but cannot be read");
                } else if (resultCode
                        == RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE) {
                    Log.d(TAG, "ProfileInstaller: Can't write cache file");
                } else if (resultCode == RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION) {
                    Log.d(TAG, "ProfileInstaller: Enqueued for compilation");
                } else {
                    Log.d(TAG, "ProfileInstaller: Profile not compiled or enqueued");
                }
            }

            @Override
            public void onFailure(Throwable t) {
                Log.d(TAG,
                        "ProfileInstaller: Error getting installation status: " + t.getMessage());
            }
        }, service);
    }
}

ये नतीजे कोड कुछ समस्याओं की वजहों के लिए संकेत देते हैं:

RESULT_CODE_COMPILED_WITH_PROFILE
ऐप्लिकेशन के चलने पर, प्रोफ़ाइल इंस्टॉल और कंपाइल हो जाती है. साथ ही, इसका इस्तेमाल भी किया जाता है. यह ही वह नतीजा है जिसे आपको देखना है.
RESULT_CODE_ERROR_NO_PROFILE_EMBEDDED
APK या एएबी में कोई प्रोफ़ाइल नहीं मिली. सुनिश्चित करें कि आप एक ऐसा वैरिएंट बनाएं जिसमें बेसलाइन प्रोफ़ाइल शामिल हो, अगर आपको यह गड़बड़ी दिखती है, और वह APK में कोई प्रोफ़ाइल मौजूद है.
RESULT_CODE_NO_PROFILE
ऐप्लिकेशन के ज़रिए ऐप्लिकेशन इंस्टॉल करते समय, इस ऐप्लिकेशन के लिए कोई प्रोफ़ाइल इंस्टॉल नहीं की गई स्टोर या पैकेज मैनेजर पर टैप करें. गड़बड़ी कोड के लिए इसकी मुख्य वजह वह प्रोफ़ाइल है ProfileInstallerInitializer को बंद करने की वजह से इंस्टॉलर नहीं चला. ध्यान दें कि इस गड़बड़ी की शिकायत किए जाने पर भी, एम्बेड की गई प्रोफ़ाइल ऐप्लिकेशन APK के लिए बना दिया गया है. एम्बेड की गई प्रोफ़ाइल न मिलने पर, गड़बड़ी का कोड दिखेगा RESULT_CODE_ERROR_NO_PROFILE_EMBEDDED है.
RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION
APK या एएबी में कोई प्रोफ़ाइल मिलती है और उसे कंपाइलेशन के लिए सूची में रखा जाता है. जब प्रोफ़ाइल को ProfileInstaller ने इंस्टॉल किया है, यह अगली बार सिस्टम से बैकग्राउंड DEX ऑप्टिमाइज़ेशन चलाया जाएगा. यह प्रोफ़ाइल कंपाइलेशन पूरा होने तक सक्रिय रहेगा. अपने बेसलाइन कैंपेन को बेंचमार्क करने की कोशिश न करें कंपाइलेशन पूरा होने तक प्रोफ़ाइलें. आपको ये काम करने पड़ सकते हैं बेसलाइन प्रोफ़ाइलों का ज़बरदस्ती कंपाइलेशन होता है. यह गड़बड़ी तब नहीं होगी, जब ऐप्लिकेशन को, चल रहे डिवाइसों पर ऐप स्टोर या पैकेज मैनेजर से इंस्टॉल किया गया हो Android 9 (एपीआई 28) और उसके बाद के वर्शन में उपलब्ध है. ऐसा इसलिए, क्योंकि कंपाइलेशन इंस्टॉल करने के दौरान किया जाता है.
RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING
मेल न खाने वाली प्रोफ़ाइल इंस्टॉल की गई और ऐप्लिकेशन को उसके साथ कंपाइल कर दिया गया. यह Google Play Store या पैकेज मैनेजर से इंस्टॉल करने का नतीजा है. ध्यान दें कि यह नतीजा RESULT_CODE_COMPILED_WITH_PROFILE से अलग है, क्योंकि मेल न खाने वाली प्रोफ़ाइल सिर्फ़ उन तरीकों को इकट्ठा करेगी जो अब भी शेयर किए गए हैं प्रोफ़ाइल और ऐप के बीच में स्विच कर सकते हैं. प्रोफ़ाइल प्रभावी रूप से इससे छोटी है ऐसा किया जा सकता है. साथ ही, बेसलाइन में शामिल करने की तुलना में कम मेथड कंपाइल किए जाएंगे प्रोफ़ाइल पर क्लिक करें.
RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE
ProfileVerifier, पुष्टि के नतीजे की कैश फ़ाइल में बदलाव नहीं कर सकता. यह काम कर सकता है ऐसा हो सकता है कि ऐप्लिकेशन फ़ोल्डर की अनुमतियों में कोई गड़बड़ी हो या डिवाइस की डिस्क में ज़रूरत के मुताबिक स्टोरेज नहीं है.
RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION
ProfileVerifieris running on an unsupported API version of Android. ProfileVerifier सुविधा, सिर्फ़ Android 9 (एपीआई लेवल 28) और उसके बाद वाले वर्शन के साथ काम करती है.
RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST
A PackageManager.NameNotFoundException की क्वेरी करते समय ऐप्लिकेशन पैकेज के लिए PackageManager. ऐसा शायद ही कभी होता है. आज़माएँ ऐप्लिकेशन को अनइंस्टॉल करके सब कुछ फिर से इंस्टॉल करना.
RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ
पुष्टि के नतीजे की पिछली कैश फ़ाइल मौजूद है, लेकिन उसे पढ़ा नहीं जा सकता. यह शायद ही कभी होता हो. ऐप्लिकेशन को अनइंस्टॉल करें और सब कुछ फिर से इंस्टॉल करके देखें.

प्रोडक्शन में ProfileVerifier का इस्तेमाल करना

प्रोडक्शन में, ProfileVerifier को इसके साथ इस्तेमाल किया जा सकता है आंकड़ों से जुड़ी रिपोर्टिंग लाइब्रेरी, जैसे कि Firebase के लिए Google Analytics प्रोफ़ाइल की स्थिति को दिखाने वाले ऐनलिटिक्स इवेंट जनरेट करते हैं. उदाहरण के लिए, यह अगर कोई ऐसा नया ऐप्लिकेशन वर्शन रिलीज़ होता है जिसमें बेसलाइन प्रोफ़ाइल.

बेसलाइन प्रोफ़ाइल को ज़बरदस्ती कंपाइल करें

अगर आपकी बेसलाइन प्रोफ़ाइलों के कंपाइलेशन स्टेटस को RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION, आपके पास तुरंत कार्रवाई करने का विकल्प है adb का इस्तेमाल करके कंपाइलेशन:

adb shell cmd package compile -r bg-dexopt PACKAGE_NAME

ProfileVerifier के बिना कंपाइलेशन स्थिति देखें

अगर ProfileVerifier का इस्तेमाल नहीं किया जा रहा है, तो कंपाइलेशन की स्थिति देखने के लिए adb. हालांकि, यह ProfileVerifier के बराबर ज़्यादा अहम जानकारी नहीं देता:

adb shell dumpsys package dexopt | grep -A 2 PACKAGE_NAME

adb का इस्तेमाल करने से कुछ ऐसा मिलता है:

  [com.google.samples.apps.nowinandroid.demo]
    path: /data/app/~~dzJiGMKvp22vi2SsvfjkrQ==/com.google.samples.apps.nowinandroid.demo-7FR1sdJ8ZTy7eCLwAnn0Vg==/base.apk
      arm64: [status=speed-profile] [reason=bg-dexopt] [primary-abi]
        [location is /data/app/~~dzJiGMKvp22vi2SsvfjkrQ==/com.google.samples.apps.nowinandroid.demo-7FR1sdJ8ZTy7eCLwAnn0Vg==/oat/arm64/base.odex]

स्थिति मान प्रोफ़ाइल के कंपाइलेशन की स्थिति के बारे में बताता है और यह इनमें से एक है नीचे दिए गए मान:

कंपाइलेशन स्टेटस मतलब
speed‑profile एक कंपाइल्ड प्रोफ़ाइल मौजूद है और इसका इस्तेमाल किया जा रहा है.
verify कोई कंपाइल की गई प्रोफ़ाइल मौजूद नहीं है.

verify स्थिति का मतलब यह नहीं है कि APK या एएबी में कोई प्रोफ़ाइल नहीं है, क्योंकि इसे अगले बैकग्राउंड DEX ऑप्टिमाइज़ेशन के ज़रिए कंपाइल करने के लिए जोड़ा जा सकता है टास्क.

वजह बताने वाली वैल्यू से पता चलता है कि प्रोफ़ाइल को कंपाइल करने के लिए कौनसी चीज़ ट्रिगर होती है और इनमें से किसी एक वैल्यू का इस्तेमाल करें:

वजह मतलब
install‑dm बेसलाइन प्रोफ़ाइल को मैन्युअल तरीके से या Google ने कंपाइल किया था ऐप्लिकेशन इंस्टॉल होने के दौरान चलाएं.
bg‑dexopt डिवाइस का इस्तेमाल न होने पर, एक प्रोफ़ाइल को कंपाइल किया गया था. यह कोई बेसलाइन प्रोफ़ाइल हो सकती है या ऐप के इस्तेमाल के दौरान इकट्ठा की गई प्रोफ़ाइल.
cmdline adb का इस्तेमाल करके कंपाइलेशन ट्रिगर किया गया. यह कोई बेसलाइन प्रोफ़ाइल हो सकती है या ऐप के इस्तेमाल के दौरान इकट्ठा की गई प्रोफ़ाइल.

परफ़ॉर्मेंस से जुड़ी समस्याएं

इस सेक्शन में, शर्तों को सही तरीके से परिभाषित करने और मानदंड तय करने के कुछ सबसे सही तरीके बताए गए हैं अपनी बेसलाइन प्रोफ़ाइल का इस्तेमाल करें, ताकि आप उनका ज़्यादा से ज़्यादा फ़ायदा पा सकें.

सही बेंचमार्क स्टार्टअप मेट्रिक

आपकी बेसलाइन प्रोफ़ाइल ज़्यादा असरदार होंगी, अगर आपकी स्टार्टअप मेट्रिक अच्छी तरह से परिभाषित किया गया है. दो मुख्य मेट्रिक हैं, शुरुआती डिसप्ले में लगने वाला समय (TTID) और फ़ुल डिसप्ले में लगने वाला समय (टीटीएफ़डी).

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

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

TTID और TTFD दोनों को जितना हो सके उतना कम रखें, ताकि आपका ऐप्लिकेशन रिस्पॉन्सिव हो.

सिस्टम TTID का पता लगा सकता है, उसे Logcat में दिखा सकता है, और उसकी रिपोर्ट कर सकता है शुरुआती बेंचमार्क के बारे में बताया गया है. हालांकि, सिस्टम TTFD का पता नहीं लगा पाता और पूरी तरह से इंटरैक्टिव होने पर, ऐप्लिकेशन को रिपोर्ट करना राज्य. ऐसा करने के लिए, reportFullyDrawn() पर कॉल करें या अगर Jetpack Compose का इस्तेमाल किया जा रहा है, तो ReportDrawn. अगर आपके पास कई ऐप्लिकेशन के पूरी तरह से काम करने से पहले, बैकग्राउंड में होने वाले ऐसे टास्क जिन्हें पूरा करना ज़रूरी है बनाया है, तो आप FullyDrawnReporter का इस्तेमाल कर सकते हैं, जैसा कि बेहतर बनाएं स्टार्टअप समय की सटीक जानकारी देना.

लाइब्रेरी प्रोफ़ाइल और कस्टम प्रोफ़ाइलें

प्रोफ़ाइलों के असर की तुलना करते समय, प्रोफ़ाइलों के असर को पहचानना मुश्किल हो सकता है लाइब्रेरी से मिली प्रोफ़ाइल से आपके ऐप्लिकेशन की प्रोफ़ाइल के फ़ायदे, जैसे कि Jetpack लाइब्रेरी. अपना APK बनाने पर 'Android Gradle प्लग इन', प्रोफ़ाइल के साथ-साथ आपकी कस्टम प्रोफ़ाइल में भी. यह अच्छा है इसका इस्तेमाल करके, पूरी परफ़ॉर्मेंस को ऑप्टिमाइज़ किया जा सकता है. इसका सुझाव आपकी रिलीज़ के बिल्ड के लिए दिया जाता है. हालांकि, इससे यह आकलन करना मुश्किल हो जाता है कि परफ़ॉर्मेंस में कितना अतिरिक्त सुधार हुआ है आपकी कस्टम प्रोफ़ाइल से.

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

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

Kotlin

android {
  ...
  buildTypes {
    ...
    // Release build with only library profiles.
    create("releaseWithoutCustomProfile") {
      initWith(release)
    }
    ...
  }
  ...
}
...
dependencies {
  ...
  // Remove the baselineProfile dependency.
  // baselineProfile(project(":baselineprofile"))
}

baselineProfile {
  variants {
    create("release") {
      from(project(":baselineprofile"))
    }
  }
}

ग्रूवी

android {
  ...
  buildTypes {
    ...
    // Release build with only library profiles.
    releaseWithoutCustomProfile {
      initWith(release)
    }
    ...
  }
  ...
}
...
dependencies {
  ...
  // Remove the baselineProfile dependency.
  // baselineProfile ':baselineprofile"'
}

baselineProfile {
  variants {
    release {
      from(project(":baselineprofile"))
    }
  }
}

ऊपर दिए गए कोड के उदाहरण में, सभी से baselineProfile डिपेंडेंसी हटा दी गई है और इसे सिर्फ़ release वैरिएंट पर लागू किया जाता है. ऐसा लग सकता है नहीं है कि लाइब्रेरी प्रोफ़ाइल्स को अभी भी जोड़ा जा रहा है जब प्रोफ़ाइल प्रोड्यूसर मॉड्यूल पर निर्भरता को हटा दिया गया है. हालांकि, यह मॉड्यूल जो केवल आपकी कस्टम प्रोफ़ाइल बनाने के लिए ज़िम्मेदार है. Android Gradle प्लगिन अब भी सभी वैरिएंट के लिए चल रहा है. साथ ही, वह इन चीज़ों को शामिल करने के लिए ज़िम्मेदार है लाइब्रेरी प्रोफ़ाइल से.

आपको प्रोफ़ाइल जनरेटर मॉड्यूल में नया वैरिएंट भी जोड़ना होगा. इसमें उदाहरण के लिए, प्रोड्यूसर मॉड्यूल का नाम :baselineprofile है.

Kotlin

android {
  ...
    buildTypes {
      ...
      // Release build with only library profiles.
      create("releaseWithoutCustomProfile") {}
      ...
    }
  ...
}

ग्रूवी

android {
  ...
    buildTypes {
      ...
      // Release build with only library profiles.
      releaseWithoutCustomProfile {}
      ...
    }
  ...
}

जब Android Studio से बेंचमार्क की सेटिंग का इस्तेमाल किया जाता है, तो सिर्फ़ लाइब्रेरी की मदद से परफ़ॉर्मेंस मापने के लिए releaseWithoutCustomProfile वैरिएंट प्रोफ़ाइल बनाएं या लाइब्रेरी की मदद से परफ़ॉर्मेंस का आकलन करने के लिए, release वैरिएंट चुनें और कस्टम प्रोफ़ाइल बनाने की सुविधा मिलती है.

I/O-बाउंड ऐप्लिकेशन स्टार्टअप से बचें

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

हमारा सुझाव है कि आप अपने ऐप्लिकेशन के आर्किटेक्चर को, बिना नेटवर्क के ऐप्लिकेशन शुरू करने की सुविधा दें या I/O कॉल, भले ही उसका इस्तेमाल मानदंड स्टार्टअप के समय ही क्यों न किया गया हो. इससे यह पक्का करने में मदद मिलती है कि आपके मानदंड की अलग-अलग बार-बार की जाने वाली क्षमताओं में सबसे कम बदलाव होगा.

अगर आपका ऐप्लिकेशन Hilt का इस्तेमाल करता है, तो आपके पास नकली I/O-बाउंड वैल्यू उपलब्ध कराने का विकल्प है माइक्रोबेंचमार्क और Hilt में मानक तय करने के बाद, उन्हें लागू किया जाता है.

उपयोगकर्ता की सभी अहम गतिविधियां कवर करें

यह ज़रूरी है कि उसमें उपयोगकर्ता की सभी अहम गतिविधियों को सटीक तरीके से कवर किया जाए बेसलाइन प्रोफ़ाइल जनरेशन. उपयोगकर्ता की ऐसी गतिविधियां जो कवर नहीं की गई हैं इसे बेसलाइन प्रोफ़ाइल से बेहतर बनाया गया है. सबसे असरदार बेसलाइन प्रोफ़ाइल में सभी स्टार्टअप उपयोगकर्ता की सामान्य गतिविधियां, परफ़ॉर्मेंस को लेकर संवेदनशील इन-ऐप्लिकेशन उपयोगकर्ता जैसे कि स्क्रोलिंग लिस्ट.