বুট ইমেজ প্রোফাইল

Android 11 বা তার পরবর্তী যেকোনও ভার্সন বুট ইমেজ প্রোফাইল জেনারেট করতে পারে, যা সিস্টেম সার্ভার ও বুট ক্লাসপাথের মতো বিভিন্ন সিস্টেম-লেভেল কম্পোনেন্টের কোড সম্পর্কে তথ্য এনক্যাপসুলেট করে। সিস্টেম-ব্যাপী অপ্টিমাইজেশন পারফর্ম করতে Android Runtime (ART) এই তথ্য ব্যবহার করে। এর মধ্যে কিছু অপ্টিমাইজেশন Android-এর পারফর্ম্যান্সের জন্য অত্যন্ত গুরুত্বপূর্ণ এবং সব নন-নেটিভ কোডের (সিস্টেম বা অ্যাপ লেভেল) এক্সিকিউশনের উপর প্রভাব ফেলে। কিছু ক্ষেত্রে, বুট ইমেজ প্রোফাইল এক্সিকিউশন পারফর্ম্যান্স এবং মেমরি কনজাম্পশনকে ডবল ডিজিট পার্সেন্টেজ দ্বারা প্রভাবিত করতে পারে।

বুট প্রোফাইল সংক্রান্ত তথ্য পাওয়া

ক্রিটিক্যাল ইউজার জার্নি (CUJ) চলাকালীন অ্যাপের প্রোফাইল থেকে বুট ইমেজ প্রোফাইল পাওয়া যায়। নির্দিষ্ট ডিভাইস কনফিগারেশনে, ART (JIT প্রোফাইলের অংশ হিসেবে) অ্যাপের ব্যবহার করা বুট ক্লাসপাথ পদ্ধতি ও ক্লাস ক্যাপচার করে, তারপর সেই তথ্য অ্যাপ প্রোফাইলে (যেমন, /data/misc/profiles/cur/0/com.android.chrome/primary.prof) রেকর্ড করে, যেখানে বুট ক্লাসপাথ Dalvik EXecutable (DEX) ফাইল দ্বারা এটি ইন্ডেক্স করা হয় (ART প্রোফাইল ফর্ম্যাট দেখুন)।

CUJ চলাকালীন রেকর্ড করা অ্যাপ প্রোফাইল পর্যালোচনা করে দেখুন যে বুট ক্লাসপাথের কোন অংশটি সবচেয়ে বেশি ব্যবহার করা হয় এবং অপ্টিমাইজ করার জন্য সবচেয়ে গুরুত্বপূর্ণ (যেমন, ART প্রোফাইল ফর্ম্যাট দেখুন)। সব পদ্ধতি বা ক্লাস অন্তর্ভুক্ত করলে পারফর্ম্যান্সের উপর নেতিবাচক প্রভাব পড়ে, তাই সবচেয়ে বেশি ব্যবহৃত কোড পাথের উপর ফোকাস করুন। যেমন, বুট ক্লাসপাথ থেকে কোনও পদ্ধতি যদি একটি অ্যাপ ব্যবহার করে, তাহলে সেটি বুট প্রোফাইলের অংশ হওয়া উচিত নয়। প্রতিটি ডিভাইসকে CUJ বেছে নেওয়া এবং পরীক্ষার মাধ্যমে তৈরি করা ডেটার পরিমাণের উপর ভিত্তি করে পদ্ধতি/ক্লাস বেছে নেওয়া কনফিগার করতে হবে।

ডিভাইসে সব স্বতন্ত্র অ্যাপ প্রোফাইল থেকে বুট ক্লাসপাথ সংক্রান্ত তথ্য একত্রিত করতে, adb shell cmd package snapshot-profile android কমান্ডটি চালান। আপনি ম্যানুয়ালি স্বতন্ত্র প্রোফাইল এগ্রিগেট না করেই (যদিও আপনি চাইলে তা করতে পারেন) প্রসেসিং ও পদ্ধতি/ক্লাস বেছে নেওয়ার ভিত্তি হিসেবে এগ্রিগেট করা তথ্য ব্যবহার করতে পারেন।

বুট ইমেজ প্রোফাইল

ছবি ১. বুট ইমেজ প্রোফাইল পাওয়ার প্রসেস

বুট ইমেজ প্রোফাইল ডেটা

বুট ইমেজ প্রোফাইলে নিম্নলিখিত ফাইল ও ডেটা থাকে।

  • বুট ক্ল্যাসপাথের প্রোফাইল (frameworks/base/config/boot-image-profile.txt. বুট ক্ল্যাসপাথ থেকে কোন কোন মেথড অপ্টিমাইজ করা হবে এবং কোন ক্লাস বুট .art ইমেজে অন্তর্ভুক্ত করা হবে তা নির্ধারণ করে।

  • প্রি-লোড করা ক্লাসের তালিকা। Zygote-এ কোন ক্লাসগুলি প্রি-লোড করা আছে তা নির্ধারণ করে।

  • সিস্টেম সার্ভার কম্পোনেন্টের প্রোফাইল (frameworks/base/services/art-profile)। সিস্টেম সার্ভার থেকে কোন কোন পদ্ধতি অপ্টিমাইজ/কম্পাইল করা হবে, কোন ক্লাস বুট .art ইমেজে অন্তর্ভুক্ত করা হবে এবং কীভাবে সংশ্লিষ্ট DEX ফাইল সাজানো হবে তা নির্ধারণ করে।

ART প্রোফাইল ফর্ম্যাট

ART প্রোফাইল লোড করা প্রতিটি DEX ফাইল থেকে তথ্য ক্যাপচার করে, এর মধ্যে অপ্টিমাইজ করার মতো পদ্ধতি এবং স্টার্ট-আপের সময় ব্যবহৃত ক্লাস সম্পর্কিত তথ্য অন্তর্ভুক্ত। বুট ইমেজ প্রোফাইলিং চালু করা থাকলে, ART প্রোফাইলে বুট ক্লাসপাথ ও সিস্টেম সার্ভার JAR ফাইলও অন্তর্ভুক্ত করে এবং প্রতিটি DEX ফাইলকে যে প্যাকেজ ব্যবহার করে তার নাম দিয়ে অ্যানোটেট করে।

যেমন, নিম্নলিখিত কমান্ডের সাহায্যে র বুট ইমেজ প্রোফাইল ডাম্প করুন:

adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof

এর ফলে এই ধরনের আউটপুট তৈরি হয়:

=== Dex files  ===
=== profile ===
ProfileInfo [012]

core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
        hot methods: 520[], 611[] …
        startup methods: …
        classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
        hot methods: 520[], 521[]…
        startup methods: …
        classes: …

উপরের উদাহরণে:

  • core-oj.jar, com.google.android.ext.services এবং com.android.systemui ব্যবহার করে। প্রতিটি এন্ট্রিতে core-oj.jar থেকে ব্যবহার করা দুটি প্যাকেজের তালিকা থাকে।

  • দুটি প্রসেসেই DEX ইন্ডেক্স 520 সহ পদ্ধতি ব্যবহার করা হয়, কিন্তু শুধুমাত্র systemui প্রসেসে DEX ইন্ডেক্স 521 সহ পদ্ধতি ব্যবহার করা হয়। অন্যান্য প্রোফাইল বিভাগেও (যেমন, স্টার্ট-আপ ক্লাস) একই যুক্তি প্রযোজ্য।

ডেটা প্রসেস করার সময়, ব্যবহারের উপর ভিত্তি করে পদ্ধতি/ক্লাস ফিল্টার করুন, সিস্টেম-লেভেল প্রসেসকে (যেমন, সিস্টেম সার্ভার বা systemui) অথবা সাধারণত ব্যবহার করা হয় না কিন্তু এখনও গুরুত্বপূর্ণ (যেমন, ক্যামেরা অ্যাপের মাধ্যমে ব্যবহার করা পদ্ধতি) এমন পদ্ধতিকে অগ্রাধিকার দিন।

প্রোফাইল ফর্ম্যাট ইন্টার্নালি প্রতিটি পদ্ধতিকে একাধিক ফ্ল্যাগ (স্টার্টআপ, পোস্ট-স্টার্টআপ, হটনেস, abi) দিয়ে অ্যানোটেট করে, যা ডাম্প-অনলি ফর্ম্যাটে দেখানো তথ্যের চেয়ে বেশি। সব সিগন্যাল ব্যবহার করতে, উপলভ্য স্ক্রিপ্টগুলি পরিবর্তন করুন।

সাজেশন

সবথেকে ভালো ফলাফল পেতে, নিম্নলিখিত নির্দেশিকা ব্যবহার করুন।

  • একাধিক টেস্ট ডিভাইসে বুট ইমেজ প্রোফাইল জেনারেট করার জন্য কনফিগারেশন ডেপ্লয় করুন এবং ফাইনাল বুট ইমেজ প্রোফাইল জেনারেট করার আগে ফলাফল একত্রিত করুন। profman টুলটি একাধিক বুট ইমেজ প্রোফাইল একত্রিত ও বেছে নিতে সাহায্য করে, তবে এটি শুধুমাত্র বুট ইমেজের একই ভার্সনের সাথে কাজ করে (একই বুট ক্ল্যাসপাথ)।

  • সিস্টেম প্রসেস দ্বারা ব্যবহৃত পদ্ধতি/ক্লাসকে বেছে নেওয়ার ক্ষেত্রে অগ্রাধিকার দিন। এইসব পদ্ধতি/ক্লাস এমন কোড ব্যবহার করতে পারে যা অন্যান্য অ্যাপ প্রায়ই ব্যবহার করে না, কিন্তু অপ্টিমাইজ করার জন্য এটি এখনও গুরুত্বপূর্ণ।

  • সিঙ্গেল ডিভাইস রান থেকে পাওয়া ডেটা শেপ, টেস্ট ডিভাইসের তুলনায় অনেক আলাদা হয়, যা রিয়েল-ওয়ার্ল্ড CUJ এক্সিকিউট করে। আপনার কাছে যদি প্রচুর পরিমাণে টেস্ট ডিভাইস না থাকে, তাহলে বুট ইমেজ প্রোফাইল অপ্টিমাইজেশন প্রোডাকশনে ভালভাবে কাজ করবে সেই ব্যাপারে আত্মবিশ্বাস বাড়াতে একই ডিভাইসে একাধিক CUJ রান করুন (এই পরিস্থিতি নিচে বর্ণনা করা হয়েছে)।

ডিভাইস কনফিগার করা

সিস্টেম প্রপার্টির মাধ্যমে বুট প্রোফাইল কনফিগারেশন চালু করতে, নিম্নলিখিত পদ্ধতিগুলির মধ্যে একটি ব্যবহার করুন।

  • বিকল্প ১: ম্যানুয়ালি প্রপ সেট-আপ করুন (রিবুট করা পর্যন্ত কাজ করে):

    adb root
    adb shell stop
    adb shell setprop dalvik.vm.profilebootclasspath true
    adb shell setprop dalvik.vm.profilesystemserver true
    adb shell start
  • বিকল্প ২: local.prop ব্যবহার করুন (ফাইল মুছে না দেওয়া পর্যন্ত স্থায়ী এফেক্ট)। এটি করতে:

    1. এই কন্টেন্ট সহ একটি local.prop ফাইল তৈরি করুন:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. এই কমান্ডগুলি রান করুন:

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
  • বিকল্প ৩: নিম্নলিখিত সার্ভার-সাইড প্রপার্টি সেট করতে ডিভাইস কনফিগারেশন ব্যবহার করুন:

    adb shell device_config put runtime_native_boot profilebootclasspath true
    adb shell device_config put runtime_native_boot profilesystemserver true
    

বুট ইমেজ প্রোফাইল তৈরি করা

একটি ডিভাইসে পরীক্ষা করে সাধারণ বুট ইমেজ প্রোফাইল তৈরি করতে নিম্নলিখিত নির্দেশাবলী ব্যবহার করুন।

  1. ডিভাইস সেট-আপ করুন।

    1. ডিভাইস কনফিগার করা নিবন্ধে যেভাবে বলা হয়েছে সেইভাবে ডিভাইস কনফিগার করুন।

    2. (ঐচ্ছিক) নতুন প্রোফাইল ফর্ম্যাটকে অন্যান্য প্রোফাইল পরিষ্কার ও পরিবর্তন করতে সময় লাগে। প্রোফাইল সংগ্রহ করার প্রসেস দ্রুত করতে, ডিভাইসের সব প্রোফাইল রিসেট করুন।

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
    3. ডিভাইসে CUJ চালান।

  2. নিম্নলিখিত কমান্ড ব্যবহার করে প্রোফাইল ক্যাপচার করুন:

    adb shell cmd package snapshot-profile android
  3. নিম্নলিখিত কমান্ড ব্যবহার করে প্রোফাইল এক্সট্র্যাক্ট করুন:

    adb pull /data/misc/profman/android.prof
  4. নিম্নলিখিত কমান্ড ব্যবহার করে বুট ক্লাসপথ JAR ফাইলে নেভিগেট করুন:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
  5. নিম্নলিখিত profman কমান্ড ব্যবহার করে বুট ইমেজ প্রোফাইল তৈরি করুন।

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
  6. ডেটা ব্যবহার করে, উপলভ্য সিলেকশন থ্রেশহোল্ড ফ্ল্যাগ ব্যবহার করে profman কমান্ড পরিবর্তন করুন।

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    সম্পূর্ণ তালিকা দেখতে, profman সহায়তা পৃষ্ঠা বা সোর্স কোড দেখুন।