বেসলাইন প্রোফাইল ডিবাগ করুন

এই নথিটি সমস্যাগুলি নির্ণয় করতে এবং সর্বাধিক সুবিধা প্রদানের জন্য আপনার বেসলাইন প্রোফাইলগুলি সঠিকভাবে কাজ করে তা নিশ্চিত করতে সর্বোত্তম অনুশীলনগুলি দেখায়৷

সমস্যা তৈরি করুন

আপনি যদি নাও ইন অ্যান্ড্রয়েড নমুনা অ্যাপে বেসলাইন প্রোফাইলের উদাহরণটি অনুলিপি করে থাকেন, তাহলে আপনি বেসলাইন প্রোফাইল টাস্কের সময় পরীক্ষা ব্যর্থতার সম্মুখীন হতে পারেন এই বলে যে পরীক্ষাগুলি এমুলেটরে চালানো যাবে না:

./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):
        ...

ব্যর্থতাগুলি ঘটছে কারণ Now in Android বেসলাইন প্রোফাইল তৈরির জন্য একটি Gradle-পরিচালিত ডিভাইস ব্যবহার করে৷ ব্যর্থতা প্রত্যাশিত, কারণ আপনার সাধারণত কোনো এমুলেটরে পারফরম্যান্স বেঞ্চমার্ক চালানো উচিত নয়। যাইহোক, যেহেতু আপনি বেসলাইন প্রোফাইল তৈরি করার সময় পারফরম্যান্স মেট্রিক্স সংগ্রহ করছেন না, তাই আপনি সুবিধার জন্য এমুলেটরগুলিতে বেসলাইন প্রোফাইল সংগ্রহ চালাতে পারেন। একটি এমুলেটর দিয়ে বেসলাইন প্রোফাইল ব্যবহার করতে, কমান্ড-লাইন থেকে বিল্ড এবং ইনস্টলেশন সঞ্চালন করুন এবং বেসলাইন প্রোফাইল নিয়মগুলি সক্ষম করতে একটি আর্গুমেন্ট সেট করুন:

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

বিকল্পভাবে, আপনি রান > কনফিগারেশন সম্পাদনা নির্বাচন করে এমুলেটরগুলিতে বেসলাইন প্রোফাইল সক্ষম করতে অ্যান্ড্রয়েড স্টুডিওতে একটি কাস্টম রান কনফিগারেশন তৈরি করতে পারেন:

Android-এ Now-এ বেসলাইন প্রোফাইল তৈরি করতে একটি কাস্টম রান কনফিগারেশন যোগ করুন
চিত্র 1. Android-এ Now-এ বেসলাইন প্রোফাইল তৈরি করতে একটি কাস্টম রান কনফিগারেশন যোগ করুন।

ইনস্টলেশন সমস্যা

আপনি যে APK বা AAB তৈরি করছেন সেটি একটি বিল্ড ভেরিয়েন্টের যা বেসলাইন প্রোফাইলগুলি অন্তর্ভুক্ত করে তা পরীক্ষা করুন৷ এটি চেক করার সবচেয়ে সহজ উপায় হল Android স্টুডিওতে APK খুলে Build > Analyze APK নির্বাচন করে, আপনার APK খুলে এবং /assets/dexopt/baseline.prof ফাইলে প্রোফাইল খোঁজা:

অ্যান্ড্রয়েড স্টুডিওতে APK ভিউয়ার ব্যবহার করে একটি বেসলাইন প্রোফাইল চেক করুন
চিত্র 2. Android স্টুডিওতে APK ভিউয়ার ব্যবহার করে একটি বেসলাইন প্রোফাইল চেক করুন।

অ্যাপটি চালানো ডিভাইসে বেসলাইন প্রোফাইল কম্পাইল করা দরকার। PackageInstaller ব্যবহার করে অ্যাপ স্টোর ইনস্টল এবং অ্যাপ ইনস্টল করা উভয়ের জন্য, ডিভাইসে সংকলন অ্যাপ ইনস্টল প্রক্রিয়ার অংশ হিসেবে ঘটে। যাইহোক, যখন অ্যাপটি অ্যান্ড্রয়েড স্টুডিও থেকে সাইডলোড করা হয়, বা কমান্ড-লাইন টুল ব্যবহার করে, জেটপ্যাক ProfileInstaller লাইব্রেরি পরবর্তী ব্যাকগ্রাউন্ড DEX অপ্টিমাইজেশন প্রক্রিয়া চলাকালীন সংকলনের জন্য প্রোফাইলগুলি সারিবদ্ধ করার জন্য দায়ী। এই ক্ষেত্রে, আপনি যদি আপনার বেসলাইন প্রোফাইলগুলি ব্যবহার করা হচ্ছে তা নিশ্চিত করতে চান, তাহলে আপনাকে জোর করে বেসলাইন প্রোফাইলের সংকলন করতে হবে। ProfileVerifier আপনাকে প্রোফাইল ইনস্টলেশন এবং সংকলনের স্থিতি জিজ্ঞাসা করতে দেয়, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

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")
        }
    }
}

জাভা


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());
        ListenableFuture<ProfileVerifier.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 বা AAB চালানো হচ্ছে তাতে কোনো প্রোফাইল পাওয়া যায় না। নিশ্চিত করুন যে আপনি একটি বিল্ড ভেরিয়েন্ট ব্যবহার করছেন যাতে বেসলাইন প্রোফাইল অন্তর্ভুক্ত থাকে যদি আপনি এই ত্রুটিটি দেখতে পান এবং APK-এ একটি প্রোফাইল রয়েছে।
RESULT_CODE_NO_PROFILE
অ্যাপ স্টোর বা প্যাকেজ ম্যানেজারের মাধ্যমে অ্যাপ ইনস্টল করার সময় এই অ্যাপের জন্য কোনও প্রোফাইল ইনস্টল করা হয়নি। এরর কোডের প্রধান কারণ হল যে প্রোফাইল ইনস্টলারটি ProfileInstallerInitializer নিষ্ক্রিয় হওয়ার কারণে রান করা হয়নি। মনে রাখবেন যে যখন এই ত্রুটিটি রিপোর্ট করা হয় তখনও অ্যাপ্লিকেশন APK-এ একটি এমবেডেড প্রোফাইল পাওয়া যায়। যখন একটি এমবেডেড প্রোফাইল পাওয়া যায় না, তখন ফেরত দেওয়া ত্রুটি কোড হল RESULT_CODE_ERROR_NO_PROFILE_EMBEDDED
RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION
একটি প্রোফাইল APK বা AAB-তে পাওয়া যায় এবং কম্পাইলেশনের জন্য সারিবদ্ধ করা হয়। যখন একটি প্রোফাইল ProfileInstaller দ্বারা ইনস্টল করা হয়, তখন পরবর্তী সময়ে ব্যাকগ্রাউন্ড DEX অপ্টিমাইজেশন সিস্টেম দ্বারা চালিত হলে এটি সংকলনের জন্য সারিবদ্ধ হয়। সংকলন সম্পূর্ণ না হওয়া পর্যন্ত প্রোফাইলটি সক্রিয় নয়। সংকলন সম্পূর্ণ না হওয়া পর্যন্ত আপনার বেসলাইন প্রোফাইল বেঞ্চমার্ক করার চেষ্টা করবেন না। আপনাকে জোর করে বেসলাইন প্রোফাইলের সংকলন করতে হতে পারে। অ্যান্ড্রয়েড 9 (API 28) এবং উচ্চতর চলমান ডিভাইসগুলিতে অ্যাপ স্টোর বা প্যাকেজ ম্যানেজার থেকে অ্যাপ ইনস্টল করা হলে এই ত্রুটি ঘটবে না, কারণ ইনস্টলেশনের সময় সংকলন করা হয়।
RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING
একটি অ-ম্যাচিং প্রোফাইল ইনস্টল করা হয়েছে এবং অ্যাপটি এটির সাথে কম্পাইল করা হয়েছে। এটি গুগল প্লে স্টোর বা প্যাকেজ ম্যানেজারের মাধ্যমে ইনস্টলেশনের ফলাফল। মনে রাখবেন যে এই ফলাফলটি RESULT_CODE_COMPILED_WITH_PROFILE থেকে আলাদা কারণ অ-মেলা প্রোফাইল শুধুমাত্র প্রোফাইল এবং অ্যাপের মধ্যে শেয়ার করা যেকোন পদ্ধতিগুলিকে কম্পাইল করবে৷ প্রোফাইলটি প্রত্যাশিতভাবে কার্যকরভাবে ছোট, এবং বেসলাইন প্রোফাইলে অন্তর্ভুক্ত করার চেয়ে কম পদ্ধতি কম্পাইল করা হবে।
RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE
ProfileVerifier যাচাইকরণের ফলাফল ক্যাশে ফাইল লিখতে পারে না। এটি ঘটতে পারে কারণ অ্যাপ ফোল্ডারের অনুমতিতে কিছু ভুল হয়েছে বা ডিভাইসে পর্যাপ্ত ফাঁকা জায়গা না থাকলে।
RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION
ProfileVerifier is running on an unsupported API version of Android. ProfileVerifier শুধুমাত্র Android 9 (API স্তর 28) এবং উচ্চতর সমর্থন করে৷
RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST
অ্যাপ প্যাকেজের জন্য PackageManager জিজ্ঞাসা করার সময় একটি PackageManager.NameNotFoundException নিক্ষেপ করা হয়৷ এটি খুব কমই ঘটতে হবে। অ্যাপটি আনইনস্টল করে সবকিছু পুনরায় ইনস্টল করার চেষ্টা করুন।
RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ
একটি পূর্ববর্তী যাচাই ফলাফল ক্যাশে ফাইল বিদ্যমান, কিন্তু এটি পড়া যাবে না. এটি খুব কমই ঘটতে হবে। অ্যাপটি আনইনস্টল করে সবকিছু পুনরায় ইনস্টল করার চেষ্টা করুন।

প্রোডাকশনে প্রোফাইল ভেরিফায়ার ব্যবহার করুন

প্রোডাকশনে, আপনি প্রোফাইল স্ট্যাটাস নির্দেশ করে অ্যানালিটিক্স ইভেন্ট তৈরি করতে ফায়ারবেসের জন্য Google Analytics- এর মতো অ্যানালিটিক্স-রিপোর্টিং লাইব্রেরির সাথে ProfileVerifier ব্যবহার করতে পারেন। উদাহরণস্বরূপ, এটি আপনাকে দ্রুত সতর্ক করে যদি একটি নতুন অ্যাপ সংস্করণ প্রকাশিত হয় যাতে বেসলাইন প্রোফাইল নেই৷

বেসলাইন প্রোফাইলের ফোর্স কম্পাইলেশন

যদি আপনার বেসলাইন প্রোফাইলের কম্পাইলেশন স্ট্যাটাস হয় 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 বা AAB-এ একটি প্রোফাইল নেই, কারণ এটি পরবর্তী ব্যাকগ্রাউন্ড DEX অপ্টিমাইজেশন টাস্ক দ্বারা সংকলনের জন্য সারিবদ্ধ হতে পারে।

কারণ মানটি নির্দেশ করে যে প্রোফাইলের সংকলনকে ট্রিগার করে এবং নিম্নলিখিত মানগুলির মধ্যে একটি:

কারণ অর্থ
install‑dm অ্যাপটি ইনস্টল করার সময় একটি বেসলাইন প্রোফাইল ম্যানুয়ালি বা Google Play দ্বারা কম্পাইল করা হয়েছিল।
bg‑dexopt আপনার ডিভাইস নিষ্ক্রিয় থাকাকালীন একটি প্রোফাইল কম্পাইল করা হয়েছিল৷ এটি একটি বেসলাইন প্রোফাইল হতে পারে, অথবা এটি অ্যাপ ব্যবহারের সময় সংগ্রহ করা একটি প্রোফাইল হতে পারে।
cmdline সংকলনটি অ্যাডবি ব্যবহার করে ট্রিগার করা হয়েছিল। এটি একটি বেসলাইন প্রোফাইল হতে পারে, অথবা এটি অ্যাপ ব্যবহারের সময় সংগ্রহ করা একটি প্রোফাইল হতে পারে।

কর্মক্ষমতা সমস্যা

এই বিভাগটি আপনার বেসলাইন প্রোফাইলগুলি থেকে সর্বাধিক সুবিধা পেতে সঠিকভাবে সংজ্ঞায়িত এবং বেঞ্চমার্ক করার জন্য কিছু সেরা অনুশীলন দেখায়৷

সঠিকভাবে বেঞ্চমার্ক স্টার্টআপ মেট্রিক্স

আপনার স্টার্টআপ মেট্রিক্স ভালভাবে সংজ্ঞায়িত হলে আপনার বেসলাইন প্রোফাইলগুলি আরও কার্যকর হবে৷ দুটি মূল মেট্রিক হল টাইম টু ইনিশিয়াল ডিসপ্লে (TTID) এবং টাইম টু ফুল ডিসপ্লে (TTFD)

TTID হল যখন অ্যাপটি তার প্রথম ফ্রেম আঁকে। এটি যতটা সম্ভব সংক্ষিপ্ত রাখা গুরুত্বপূর্ণ কারণ কিছু প্রদর্শন করা ব্যবহারকারীকে দেখায় যে অ্যাপটি চলছে৷ এমনকি অ্যাপটি প্রতিক্রিয়াশীল তা দেখানোর জন্য আপনি একটি অনির্দিষ্ট অগ্রগতি সূচকও প্রদর্শন করতে পারেন।

TTFD হল যখন অ্যাপটির সাথে আসলে ইন্টারঅ্যাক্ট করা যায়। ব্যবহারকারীর হতাশা এড়াতে এটি যতটা সম্ভব সংক্ষিপ্ত রাখা গুরুত্বপূর্ণ। আপনি যদি সঠিকভাবে TTFD সংকেত দেন, আপনি সিস্টেমকে বলছেন যে TTFD-এর পথে যে কোডটি চালানো হয়েছে সেটি অ্যাপ স্টার্টআপের অংশ। সিস্টেমের ফলে প্রোফাইলে এই কোড রাখার সম্ভাবনা বেশি।

আপনার অ্যাপকে প্রতিক্রিয়াশীল মনে করতে TTID এবং TTFD উভয়কেই যতটা সম্ভব কম রাখুন।

সিস্টেম টিটিআইডি সনাক্ত করতে, লগক্যাটে এটি প্রদর্শন করতে এবং স্টার্টআপ বেঞ্চমার্কের অংশ হিসাবে রিপোর্ট করতে সক্ষম। যাইহোক, সিস্টেমটি TTFD নির্ধারণ করতে অক্ষম, এবং এটি সম্পূর্ণভাবে আঁকা ইন্টারেক্টিভ অবস্থায় পৌঁছলে রিপোর্ট করার দায়িত্ব অ্যাপের। আপনি যদি জেটপ্যাক কম্পোজ ব্যবহার করেন তাহলে reportFullyDrawn() , অথবা ReportDrawn কল করে এটি করতে পারেন। আপনার যদি একাধিক ব্যাকগ্রাউন্ড টাস্ক থাকে যা অ্যাপটিকে সম্পূর্ণরূপে আঁকার আগে সম্পূর্ণ করতে হবে, তাহলে আপনি FullyDrawnReporter ব্যবহার করতে পারেন, যেমনটি স্টার্টআপ টাইমিং নির্ভুলতা উন্নত করুন -এ বর্ণিত হয়েছে।

লাইব্রেরি প্রোফাইল এবং কাস্টম প্রোফাইল

প্রোফাইলের প্রভাব বেঞ্চমার্ক করার সময়, জেটপ্যাক লাইব্রেরিগুলির মতো লাইব্রেরিগুলির দ্বারা অবদানকৃত প্রোফাইলগুলি থেকে আপনার অ্যাপের প্রোফাইলগুলির সুবিধাগুলি আলাদা করা কঠিন হতে পারে৷ আপনি যখন আপনার APK তৈরি করেন তখন অ্যান্ড্রয়েড গ্রেডল প্লাগইন লাইব্রেরি নির্ভরতার পাশাপাশি আপনার কাস্টম প্রোফাইলে যেকোনো প্রোফাইল যোগ করে। এটি সামগ্রিক কর্মক্ষমতা অপ্টিমাইজ করার জন্য ভাল, এবং আপনার রিলিজ বিল্ডের জন্য সুপারিশ করা হয়। যাইহোক, আপনার কাস্টম প্রোফাইল থেকে কতটা অতিরিক্ত কর্মক্ষমতা লাভ আসে তা পরিমাপ করা কঠিন করে তোলে।

আপনার কাস্টম প্রোফাইল দ্বারা প্রদত্ত অতিরিক্ত অপ্টিমাইজেশানটি ম্যানুয়ালি দেখার একটি দ্রুত উপায় হল এটি অপসারণ করা এবং আপনার বেঞ্চমার্কগুলি চালানো৷ তারপর এটি প্রতিস্থাপন করুন এবং আবার আপনার মানদণ্ড চালান। দুটির তুলনা করলে আপনি শুধুমাত্র লাইব্রেরি প্রোফাইল এবং লাইব্রেরি প্রোফাইল এবং আপনার কাস্টম প্রোফাইল দ্বারা প্রদত্ত অপ্টিমাইজেশানগুলি দেখাবে৷

প্রোফাইল তুলনা করার একটি স্বয়ংক্রিয় উপায় হল একটি নতুন বিল্ড ভেরিয়েন্ট তৈরি করা যাতে শুধুমাত্র লাইব্রেরি প্রোফাইল থাকে এবং আপনার কাস্টম প্রোফাইল নয়। এই ভেরিয়েন্ট থেকে রিলিজ ভেরিয়েন্টের সাথে বেঞ্চমার্কের তুলনা করুন যাতে লাইব্রেরি প্রোফাইল এবং আপনার কাস্টম প্রোফাইল উভয়ই রয়েছে। নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে কেবল লাইব্রেরি প্রোফাইলগুলি অন্তর্ভুক্ত করে এমন বৈকল্পিক সেট আপ করতে হয়। আপনার প্রোফাইল গ্রাহক মডিউলে releaseWithoutCustomProfile নামে একটি নতুন বৈকল্পিক যোগ করুন, যা সাধারণত আপনার অ্যাপ মডিউল:

কোটলিন

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 ভেরিয়েন্টে প্রয়োগ করে। প্রোফাইল প্রযোজক মডিউলের উপর নির্ভরতা সরানো হলে লাইব্রেরি প্রোফাইলগুলি এখনও যোগ করা হচ্ছে বলে মনে হতে পারে। যাইহোক, এই মডিউলটি শুধুমাত্র আপনার কাস্টম প্রোফাইল তৈরি করার জন্য দায়ী। অ্যান্ড্রয়েড গ্রেডল প্লাগইন এখনও সমস্ত ভেরিয়েন্টের জন্য চলছে, এবং লাইব্রেরি প্রোফাইলগুলি অন্তর্ভুক্ত করার জন্য দায়ী৷

আপনাকে প্রোফাইল জেনারেটর মডিউলে নতুন বৈকল্পিক যোগ করতে হবে। এই উদাহরণে প্রযোজক মডিউলটির নাম দেওয়া হয়েছে :baselineprofile

কোটলিন

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

গ্রোভি

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

আপনি যখন অ্যান্ড্রয়েড স্টুডিও থেকে বেঞ্চমার্ক চালান, তখন শুধুমাত্র লাইব্রেরি প্রোফাইলের সাথে পারফরম্যান্স পরিমাপ করতে একটি releaseWithoutCustomProfile ভেরিয়েন্ট নির্বাচন করুন বা লাইব্রেরি এবং কাস্টম প্রোফাইলগুলির সাথে পারফরম্যান্স পরিমাপ করতে একটি release ভেরিয়েন্ট নির্বাচন করুন।

I/O-বাউন্ড অ্যাপ স্টার্টআপ এড়িয়ে চলুন

যদি আপনার অ্যাপটি স্টার্টআপের সময় প্রচুর I/O কল বা নেটওয়ার্ক কল করে থাকে, তাহলে এটি অ্যাপ স্টার্টআপের সময় এবং আপনার স্টার্টআপ বেঞ্চমার্কিংয়ের যথার্থতা উভয়কেই নেতিবাচকভাবে প্রভাবিত করতে পারে। এই হেভিওয়েট কলগুলি অনির্দিষ্ট পরিমাণে সময় নিতে পারে যা সময়ের সাথে পরিবর্তিত হতে পারে এমনকি একই বেঞ্চমার্কের পুনরাবৃত্তির মধ্যেও। I/O কলগুলি সাধারণত নেটওয়ার্ক কলগুলির চেয়ে ভাল, কারণ পরবর্তীগুলি ডিভাইসের বাইরের কারণগুলির দ্বারা এবং ডিভাইসে নিজেই প্রভাবিত হতে পারে৷ স্টার্টআপের সময় নেটওয়ার্ক কল এড়িয়ে চলুন। যেখানে এক বা অন্য ব্যবহার অনিবার্য, সেখানে I/O ব্যবহার করুন।

আমরা আপনাকে নেটওয়ার্ক বা I/O কল ছাড়াই আপনার অ্যাপ আর্কিটেকচার সাপোর্ট অ্যাপ স্টার্টআপ করার পরামর্শ দিই, এমনকি যদি শুধুমাত্র বেঞ্চমার্কিং স্টার্টআপ করার সময় এটি ব্যবহার করা হয়। এটি আপনার বেঞ্চমার্কের বিভিন্ন পুনরাবৃত্তির মধ্যে সর্বনিম্ন সম্ভাব্য পরিবর্তনশীলতা নিশ্চিত করতে সহায়তা করে।

আপনার অ্যাপ হিল্ট ব্যবহার করলে, মাইক্রোবেঞ্চমার্ক এবং হিল্টে বেঞ্চমার্ক করার সময় আপনি জাল I/O-বাউন্ড বাস্তবায়ন প্রদান করতে পারেন।

সমস্ত গুরুত্বপূর্ণ ব্যবহারকারীর যাত্রা কভার করুন

আপনার বেসলাইন প্রোফাইল জেনারেশনের সমস্ত গুরুত্বপূর্ণ ব্যবহারকারীর যাত্রা সঠিকভাবে কভার করা গুরুত্বপূর্ণ। কোনো ব্যবহারকারীর যাত্রা যা কভার করা হয় না বেসলাইন প্রোফাইল দ্বারা উন্নত করা হবে না। সবচেয়ে কার্যকর বেসলাইন প্রোফাইলগুলির মধ্যে সমস্ত সাধারণ স্টার্টআপ ব্যবহারকারীর যাত্রার পাশাপাশি কর্মক্ষমতা-সংবেদনশীল ইন-অ্যাপ ব্যবহারকারী ভ্রমণ যেমন স্ক্রলিং তালিকা অন্তর্ভুক্ত রয়েছে।