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

ম্যানুয়াল শ্রম কমাতে এবং সার্বিক স্কেলেবিলিটি বাড়াতে আমরা জেটপ্যাক ম্যাক্রোবেঞ্চমার্ক লাইব্রেরি ব্যবহার করে প্রোফাইল রুল তৈরি স্বয়ংক্রিয় করার জন্য দৃঢ়ভাবে সুপারিশ করি। তবে, আপনার অ্যাপে ম্যানুয়ালি প্রোফাইল রুল তৈরি এবং পরিমাপ করাও সম্ভব।

প্রোফাইলের নিয়মগুলি ম্যানুয়ালি নির্ধারণ করুন।

আপনি 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;

আপনি এই নমুনা কম্পাইলার এক্সপ্লোরার প্রজেক্টে প্রোফাইল নিয়মগুলো পরিবর্তন করে দেখতে পারেন। উল্লেখ্য যে, কম্পাইলার এক্সপ্লোরার শুধুমাত্র মানুষের পাঠযোগ্য 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; ডালভিক এক্সিকিউটেবল (DEX) ফরম্যাট অনুযায়ী এখানে শুরুতে L যোগ করা হয়।
METHOD_SIGNATURE মেথডের সিগনেচার, যার মধ্যে মেথডের নাম, প্যারামিটারের ধরন এবং রিটার্ন টাইপ অন্তর্ভুক্ত থাকে। উদাহরণস্বরূপ:

// LayoutNode.kt

fun isPlaced():Boolean {
// ...
}

LayoutNode এর সিগনেচার হলো isPlaced()Z

এই প্যাটার্নগুলিতে ওয়াইল্ডকার্ড থাকতে পারে, যার ফলে একটিমাত্র নিয়ম একাধিক মেথড বা ক্লাসকে অন্তর্ভুক্ত করতে পারে। অ্যান্ড্রয়েড স্টুডিওতে নিয়ম সিনট্যাক্স ব্যবহার করে লেখার সময় নির্দেশিত সহায়তার জন্য, অ্যান্ড্রয়েড বেসলাইন প্রোফাইলস প্লাগইনটি দেখুন।

ওয়াইল্ডকার্ড নিয়মের একটি উদাহরণ দেখতে এইরকম হতে পারে:

HSPLandroidx/compose/ui/layout/**->**(**)**

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

বেসলাইন প্রোফাইল নিয়মগুলি নিম্নলিখিত প্রকারগুলি সমর্থন করে। এই প্রকারগুলি সম্পর্কে বিস্তারিত জানতে, ডালভিক এক্সিকিউটেবল (DEX) ফরম্যাট দেখুন।

চরিত্র প্রকার বর্ণনা
B বাইট স্বাক্ষরিত বাইট
C চার UTF-16-এ এনকোড করা ইউনিকোড ক্যারেক্টার কোড পয়েন্ট
D দ্বিগুণ ডাবল-প্রিসিশন ফ্লোটিং পয়েন্ট মান
F ভাসতে একক-নির্ভুল ফ্লোটিং পয়েন্ট মান
I int পূর্ণসংখ্যা
J দীর্ঘ দীর্ঘ পূর্ণসংখ্যা
S সংক্ষিপ্ত সংক্ষিপ্ত স্বাক্ষর
V শূন্যতা শূন্য
Z বুলিয়ান সত্য বা মিথ্যা
L (শ্রেণির নাম) রেফারেন্স একটি ক্লাস নামের উদাহরণ

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

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

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

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

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

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

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

    এপিআই ৩৪ এবং উচ্চতর

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

    এপিআই ৩৩ এবং নিম্ন

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

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

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

  6. সেভ করার কাজটি করুন এবং সেভ সম্পন্ন হওয়া পর্যন্ত অপেক্ষা করুন। যদি আপনার 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

  7. তৈরি হওয়া বাইনারি প্রোফাইলগুলোকে টেক্সটে রূপান্তর করুন:

    এপিআই ৩৪ এবং উচ্চতর

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

    এপিআই ৩৩ এবং নিম্ন

    একটি রেফারেন্স প্রোফাইল নাকি একটি বর্তমান প্রোফাইল তৈরি করা হয়েছে তা নির্ধারণ করুন। একটি রেফারেন্স প্রোফাইল নিম্নলিখিত স্থানে অবস্থিত:

    /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-cli প্রোফাইল কম্পাইলেশন, ইন্ট্রোস্পেকশন এবং ART প্রোফাইল ট্রান্সপাইলিং-এ সাহায্য করে, ফলে টার্গেট SDK ভার্সন নির্বিশেষে অ্যান্ড্রয়েড-চালিত ডিভাইসগুলিতে সেগুলি ইনস্টল করা যায়।

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

প্রোফাইল ফরম্যাট এবং প্ল্যাটফর্ম সংস্করণ

প্রোফাইল ফরম্যাট বেছে নেওয়ার সময় নিম্নলিখিত বিকল্পগুলি উপলব্ধ থাকে:

প্রোফাইল ফরম্যাট প্ল্যাটফর্ম সংস্করণ এপিআই স্তর
v0_1_5_s অ্যান্ড্রয়েড এস+ ৩১+
v0_1_0_p অ্যান্ড্রয়েড পি, কিউ এবং আর ২৮-৩০
v0_0_9_omr1 অ্যান্ড্রয়েড ও এমআর১ ২৭
v0_0_5_o অ্যান্ড্রয়েড ও ২৬
v0_0_1_n অ্যান্ড্রয়েড এন ২৪-২৫

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

অস্পষ্টতার মানচিত্র

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

বেসলাইন প্রোফাইলের ঐতিহ্যবাহী ইনস্টলেশন

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

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

এপিআই ২৮ এবং তার পরবর্তী সংস্করণে চালিত ডিভাইসগুলিতে, প্লে ক্লায়েন্ট ইনস্টল করা হচ্ছে এমন এপিকে সংস্করণের জন্য এপিকে এবং ডেক্সমেটাডেটা (ডিএম) পেলোড ডাউনলোড করে। ডিএম-এ প্রোফাইলের তথ্য থাকে যা ডিভাইসের প্যাকেজ ম্যানেজারের কাছে পাঠানো হয়।

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

adb install-multiple base.apk base.dm

জেটপ্যাক প্রোফাইলইনস্টলার

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

একটি দুর্বোধ্যকরণ মানচিত্র ঐচ্ছিক; এটি প্রদান করা হলে, ব্যবহারের সুবিধার জন্য দুর্বোধ্য প্রতীকগুলোকে তাদের পাঠযোগ্য সংস্করণে পুনঃস্থাপন করতে সাহায্য করে।

{% হুবহু %} {% endverbatim %} {% হুবহু %} {% endverbatim %}