ম্যানুয়ালি বেসলাইন প্রোফাইল তৈরি ও পরিমাপ করা

আমরা Jetpack Macrobenchmark লাইব্রেরি ব্যবহার করে প্রোফাইল রুল অটোমেট করার জন্য সাজেস্ট করি যাতে ম্যানুয়াল পরিশ্রম কমে এবং সাধারণ স্কেলেবিলিটি বাড়ে। তবে, আপনার অ্যাপে ম্যানুয়ালি প্রোফাইল নিয়ম তৈরি ও পরিমাপ করা সম্ভব।

ম্যানুয়ালি প্রোফাইল সংক্রান্ত নিয়ম নির্ধারণ করুন

আপনি src/main ডিরেক্টরিতে baseline-prof.txt নামের ফাইল তৈরি করে কোনও অ্যাপ বা লাইব্রেরি মডিউলে ম্যানুয়ালি প্রোফাইল সংক্রান্ত নিয়ম নির্ধারণ করতে পারবেন। এটি সেই একই ফোল্ডার যেখানে AndroidManifest.xml ফাইলটি আছে।

ফাইলটি প্রতি লাইনে একটি করে নিয়ম নির্দিষ্ট করে। প্রতিটি নিয়ম অ্যাপ বা লাইব্রেরিতে ম্যাচিং পদ্ধতি বা ক্লাসের জন্য একটি প্যাটার্ন উপস্থাপন করে যা অপ্টিমাইজ করা প্রয়োজন।

adb shell profman --dump-classes-and-methods ব্যবহার করার সময় এই নিয়মগুলির সিনট্যাক্স হল মানুষের-পঠনযোগ্য ART প্রোফাইল ফর্ম্যাটের (HRF) সুপারসেট। সিনট্যাক্স ডেসক্রিপ্টর ও স্বাক্ষরের সিনট্যাক্সের মতো, তবে নিয়ম লেখার প্রসেস সহজ করতে ওয়াইল্ডকার্ড ব্যবহার করতে দেয়।

নিচের উদাহরণে Jetpack Compose লাইব্রেরিতে অন্তর্ভুক্ত কয়েকটি বেসলাইন প্রোফাইল নিয়ম দেখানো হয়েছে:

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 শুধুমাত্র মানুষের-পঠনযোগ্য ART প্রোফাইল ফর্ম্যাট (HRF) সাপোর্ট করে, তাই ওয়াইল্ডকার্ড সাপোর্ট করে না।

নিয়মের সিনট্যাক্স

এই নিয়মগুলি পদ্ধতি বা ক্লাসকে টার্গেট করার জন্য দুটি ফর্মের মধ্যে একটি গ্রহণ করে:

[FLAGS][CLASS_DESCRIPTOR]->[METHOD_SIGNATURE]

ক্লাস নিয়মে নিম্নলিখিত প্যাটার্ন ব্যবহার করা হয়:

[CLASS_DESCRIPTOR]

বিস্তারিত বিবরণের জন্য নিম্নলিখিত টেবিলটি দেখুন:

সিনট্যাক্স বর্ণনা
FLAGS স্টার্টআপের ধরন অনুযায়ী এই পদ্ধতিকে Hot, Startup বা Post Startup হিসেবে ফ্ল্যাগ করা হবে কিনা তা বোঝাতে এক বা একাধিক অক্ষর H, S ও P ব্যবহার করা হয়।

H ফ্ল্যাগ সহ মেথড থেকে বোঝা যায় যে এটি একটি "হট" মেথড, অর্থাৎ অ্যাপের লাইফটাইমে এটি অনেকবার কল করা হয়েছে।

S ফ্ল্যাগ সহ মেথড থেকে বোঝা যায় যে এটি স্টার্টআপের সময় কল করা মেথড।

P ফ্ল্যাগ সহ একটি মেথড ইঙ্গিত করে যে এটি স্টার্টআপের পরে কল করা একটি মেথড।

এই ফাইলে উপস্থিত একটি ক্লাস ইঙ্গিত করে যে এটি স্টার্টআপের সময় ব্যবহার করা হয় এবং ক্লাস লোড করার খরচ এড়াতে হিপে অবশ্যই প্রি-অ্যালোকেট করা উচিত। ART কম্পাইলার বিভিন্ন অপ্টিমাইজেশন স্ট্র্যাটেজি ব্যবহার করে, যেমন এইসব পদ্ধতির AOT কম্পাইলেশন এবং জেনারেট করা AOT ফাইলে লেআউট অপ্টিমাইজেশন পারফর্ম করা।
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 চার UTF-16-এ এনকোড করা ইউনিকোড অক্ষর কোড পয়েন্ট
D ডবল ডবল-প্রিসিশন ফ্লোটিং পয়েন্ট ভ্যালু
F ফ্লোট সিঙ্গেল-প্রিসিশন ফ্লোটিং পয়েন্ট ভ্যালু
I int পূর্ণসংখ্যা
J দীর্ঘ দীর্ঘ পূর্ণসংখ্যা
S ছোট ভিডিও স্বাক্ষরিত Short
V বাতিল বাতিল
Z বুলিয়ান সত্য বা মিথ্যা
L (ক্লাসের নাম) রেফারেন্স ক্লাসের নামের একটি উদাহরণ

এছাড়াও, লাইব্রেরিগুলি AAR আর্টিফ্যাক্টে প্যাকেজ করা নিয়মগুলি সংজ্ঞায়িত করতে পারে। এইসব আর্টিফ্যাক্ট অন্তর্ভুক্ত করার জন্য আপনি যখন APK তৈরি করেন, তখন নিয়মগুলি একসাথে মার্জ করা হয়—ম্যানিফেস্ট মার্জিং যেভাবে করা হয়, ঠিক সেভাবেই—এবং APK-এর জন্য নির্দিষ্ট একটি কম্প্যাক্ট বাইনারি ART প্রোফাইলে কম্পাইল করা হয়।

Android 9 (API লেভেল ২৮) বা Android 7 (API লেভেল ২৪)-এ ইনস্টল করার সময় ProfileInstaller ব্যবহার করার সময় অ্যাপের নির্দিষ্ট সাবসেট AOT কম্পাইল করার জন্য ডিভাইসে APK ব্যবহার করা হলে, ART এই প্রোফাইল কাজে লাগায়।

ম্যানুয়ালি বেসলাইন প্রোফাইল সংগ্রহ করা

আপনি Macrobenchmark লাইব্রেরি সেট-আপ না করেই ম্যানুয়ালি বেসলাইন প্রোফাইল জেনারেট করতে এবং আপনার ক্রিটিকাল ইউজার জার্নির UI অটোমেশন তৈরি করতে পারবেন। আমরা Macrobenchmarks ব্যবহার করার সাজেশন দিলেও, এটি সবসময় সম্ভব নাও হতে পারে। যেমন, আপনি যদি নন-গ্রেডেল বিল্ড সিস্টেম ব্যবহার করেন, তাহলে আপনি বেসলাইন প্রোফাইল গ্রেডেল প্লাগ-ইন ব্যবহার করতে পারবেন না। এই ধরনের ক্ষেত্রে, আপনি ম্যানুয়ালি বেসলাইন প্রোফাইল নিয়ম সংগ্রহ করতে পারবেন। আপনি API 34 বা তার পরবর্তী যেকোনও ভার্সন রান করে এমন ডিভাইস বা এমুলেটর ব্যবহার করলে এটি অনেক সহজ হয়। যদিও এটি এখনও কম API লেভেলে সম্ভব, তবে এর জন্য রুট অ্যাক্সেস প্রয়োজন এবং আপনাকে একটি এমুলেটর ব্যবহার করতে হবে যা একটি AOSP ইমেজ চালাচ্ছে। আপনি নিম্নলিখিত কাজগুলি করে সরাসরি নিয়ম সংগ্রহ করতে পারবেন:

  1. টেস্ট ডিভাইসে আপনার অ্যাপের রিলিজ ভার্সন ইনস্টল করুন। বিল্ড সিস্টেম ব্যবহার করতে পারে এমন প্রোফাইল ক্যাপচার করার জন্য অ্যাপ বিল্ডের ধরন R8-অপ্টিমাইজ করা হলে চলবে না এবং ডিবাগ করা গেলেও চলবে না।
  2. প্রোফাইল ইনস্টলেশন বন্ধ করে অ্যাপটি বন্ধ করুন।

    আপনার APK যদি Jetpack প্রোফাইল ইনস্টলার লাইব্রেরির উপর নির্ভরশীল হয়, তাহলে লাইব্রেরিটি আপনার APK প্রথমবার লঞ্চ করার সময় একটি প্রোফাইল বুটস্ট্র্যাপ করে। এটি প্রোফাইল জেনারেশন প্রসেসে বাধা সৃষ্টি করতে পারে, তাই নিম্নলিখিত কমান্ডের সাহায্যে এটি বন্ধ করুন:

    adb shell am broadcast -a androidx.profileinstaller.action.SKIP_FILE WRITE_SKIP_FILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver
  3. অ্যাপ কম্পাইলেশন রিসেট করুন এবং যেকোনও প্রোফাইল মুছে দিন।

    API 34 ও তার পরের যেকোনও ভার্সন

    adb shell cmd package compile -f -m verify $PACKAGE_NAME
    adb shell pm art clear-app-profiles $PACKAGE_NAME

    API 33 ও তার আগের যেকোনও ভার্সন

    adb root
    adb shell cmd package compile --reset $PACKAGE_NAME

  4. অ্যাপটি চালান এবং আপনি যে ক্রিটিকাল ইউজার জার্নির জন্য প্রোফাইল সংগ্রহ করতে চান, সেটিতে ম্যানুয়ালি নেভিগেট করুন।

  5. প্রোফাইল স্থিতিশীল হতে অন্তত পাঁচ সেকেন্ড অপেক্ষা করুন।

  6. সেভ করার অ্যাকশন পারফর্ম করুন এবং সেভ সম্পূর্ণ হওয়া পর্যন্ত অপেক্ষা করুন। আপনার APK-এর Jetpack প্রোফাইল ইনস্টলার লাইব্রেরির উপর নির্ভরতা থাকলে, প্রোফাইল ডাম্প করতে সেটি ব্যবহার করুন:

    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
    আপনি Profile Installer ব্যবহার না করলে, নিম্নলিখিত কমান্ড ব্যবহার করে এমুলেটরে ম্যানুয়ালি প্রোফাইল ডাম্প করুন:

    adb root
    adb shell killall -s SIGUSR1 $PACKAGE_NAME
    sleep 1 # wait 1 second
    adb shell am force-stop $PACKAGE_NAME

  7. জেনারেট করা বাইনারি প্রোফাইল টেক্সটে কনভার্ট করুন:

    API 34 ও তার পরের যেকোনও ভার্সন

    adb shell pm dump-profiles --dump-classes-and-methods $PACKAGE_NAME

    API 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

  8. ডিভাইস থেকে ডাম্প করা প্রোফাইল ফিরিয়ে আনতে 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 প্রোফাইল ট্রান্সপাইল করার ব্যাপারে সাহায্য করে, যাতে টার্গেট SDK ভার্সন যাই হোক না কেন, Android-চালিত ডিভাইসে সেগুলি ইনস্টল করা যায়।

Profgen-cli হল একটি CLI যা বেসলাইন প্রোফাইলের HRF-কে তার কম্পাইল করা ফর্ম্যাটে কম্পাইল করে। এছাড়াও, CLI, 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 HRF-এর পাথ দেখায়।

এছাড়াও, Profgen-cli-এর জন্য APK-এর রিলিজ বিল্ডের পাথ এবং একটি অবফাসকেশন ম্যাপ প্রয়োজন যা R8 বা Proguard ব্যবহার করার সময় APK অবফাসকেট করতে ব্যবহৃত হয়। এইভাবে, কম্পাইল করা প্রোফাইল তৈরি করার সময় profgen HRF-এ সোর্স সিম্বলকে তার সংশ্লিষ্ট অস্পষ্ট নামে অনুবাদ করতে পারে।

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 ২৭
v0_0_5_o Android O 26
v0_0_1_n Android N 24-25

baseline.prof এবং baseline.profm আউটপুট ফাইল কপি করে APK-র assets বা dexopt ফোল্ডারে পেস্ট করুন।

অস্পষ্টতা ম্যাপ

HRF সোর্স সিম্বল ব্যবহার করলে তবেই আপনাকে অবফাসকেশন ম্যাপ দিতে হবে। যদি HRF এমন একটি রিলিজ বিল্ড থেকে তৈরি করা হয় যা ইতিমধ্যেই অস্পষ্ট করা হয়েছে এবং কোনও ম্যাপিংয়ের প্রয়োজন নেই, তাহলে আপনি সেই বিকল্পটি উপেক্ষা করতে পারেন এবং আউটপুটগুলি assets বা dexopt ফোল্ডারে কপি করতে পারেন।

বেসলাইন প্রোফাইলের প্রথাগত ইনস্টলেশন

বেসলাইন প্রোফাইল সাধারণত দুটি উপায়ের যেকোনও একটিতে ডিভাইসে ডেলিভার করা হয়।

DexMetadata-এর সাথে install-multiple ব্যবহার করা

API 28 এবং তার পরবর্তী ভার্সন চলছে এমন ডিভাইসে, Play ক্লায়েন্ট APK এবং ইনস্টল করা হচ্ছে এমন APK ভার্সনের জন্য DexMetadata (DM) পেলোড ডাউনলোড করে। DM-এ প্রোফাইল সংক্রান্ত তথ্য থাকে যা ডিভাইসের প্যাকেজ ম্যানেজারে পাস করা হয়।

APK ও DM, একটি ইনস্টল সেশনের অংশ হিসেবে ইনস্টল করা হয়, যেমন:

adb install-multiple base.apk base.dm

Jetpack ProfileInstaller

API লেভেল ২৯ ও তার পরবর্তী ভার্সন চলছে এমন ডিভাইসে, Jetpack ProfileInstaller লাইব্রেরি, ডিভাইসে APK ইনস্টল করার পরে assetsবা dexopt-এ প্যাকেজ করা প্রোফাইল ইনস্টল করার জন্য একটি বিকল্প মেকানিজম প্রদান করে। ProfileInstaller-কে ProfileInstallReceiver বা সরাসরি অ্যাপের মাধ্যমে চালু করা হয়।

ProfileInstaller লাইব্রেরি টার্গেট ডিভাইস SDK ভার্সনের উপর ভিত্তি করে প্রোফাইল ট্রান্সকোড করে এবং ডিভাইসের cur ডিরেক্টরিতে প্রোফাইল কপি করে (ডিভাইসে ART প্রোফাইলের জন্য প্যাকেজ-নির্দিষ্ট স্টেজিং ডিরেক্টরি)।

ডিভাইসটি নিষ্ক্রিয় হয়ে গেলে, ডিভাইসে bg-dexopt নামক একটি প্রসেসের মাধ্যমে প্রোফাইলটি বেছে নেওয়া হয়।

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

এই বিভাগে, APK-এর জন্য বেসলাইন প্রোফাইল কীভাবে ইনস্টল করতে হয় তা বর্ণনা করা হয়েছে।

androidx.profileinstaller-এর মাধ্যমে ব্রডকাস্ট করুন

API 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>

বেসলাইন প্রোফাইল সহ বেশিরভাগ APK-তে ProfileInstaller নেই—যা Play-তে ৪৫০K অ্যাপের মধ্যে প্রায় ৭৭K-তে আছে—যদিও এটি 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

যাচাইকরণ

প্রোফাইলটি সঠিকভাবে ইনস্টল করা হয়েছে কিনা তা যাচাই করতে, আপনি অ্যাপের উন্নতি ম্যানুয়ালি পরিমাপ করুন থেকে ধাপগুলি ব্যবহার করতে পারেন।

বাইনারি প্রোফাইলের কন্টেন্ট ডাম্প করুন

Baseline Profile-এর কম্প্যাক্ট বাইনারি ভার্সনের কন্টেন্ট ইন্ট্রোস্পেক্ট করতে, 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-এর মাধ্যমে স্ট্রিক্ট মোড বন্ধ করতে পারবেন। তবে, বেশিরভাগ ক্ষেত্রে আপনার স্ট্রিক্ট মোড চালু রাখা উচিত।

অবফাসকেশন ম্যাপ ঐচ্ছিক; এটি প্রদান করা হলে, সহজে ব্যবহার করার জন্য অবফাসকেট করা চিহ্নকে মানুষের-পঠনযোগ্য ভার্সনে রিম্যাপ করতে সাহায্য করে।