ART জাস্ট-ইন-টাইম কম্পাইলার প্রয়োগ করা

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

JIT ও AOT একই কম্পাইলার ও একই ধরনের অপ্টিমাইজেশন ব্যবহার করলেও, জেনারেট করা কোড একই রকম নাও হতে পারে। JIT রানটাইম টাইপ তথ্য ব্যবহার করে, আরও ভাল ইনলাইনিং করতে পারে এবং অন স্ট্যাক রিপ্লেসমেন্ট (OSR) কম্পাইলেশন সম্ভব করে তোলে, এগুলি সবই সামান্য আলাদা কোড তৈরি করে।

JIT আর্কিটেকচার

JIT আর্কিটেকচার
ছবি ১. JIT আর্কিটেকচার।

JIT কম্পাইলেশন

JIT কম্পাইলেশনের মধ্যে নিম্নলিখিত অ্যাক্টিভিটি অন্তর্ভুক্ত:

প্রোফাইল-গাইডেড কম্পোজিশন
ছবি ২. প্রোফাইল-গাইডেড কম্পাইলেশন।
  1. ব্যবহারকারী অ্যাপটি চালান, যা ART-কে .dex ফাইল লোড করার জন্য ট্রিগার করে।
    • .oat ফাইল (.dex ফাইলের জন্য AOT বাইনারি) উপলভ্য থাকলে, ART সরাসরি এটি ব্যবহার করে। যদিও .oat ফাইল নিয়মিত জেনারেট করা হয়, তবে সেগুলিতে সবসময় কম্পাইল করা কোড (AOT বাইনারি) থাকে না।
    • .oat ফাইলে কম্পাইল করা কোড না থাকলে, ART, .dex ফাইল এক্সিকিউট করার জন্য JIT ও ইন্টারপ্রেটার ব্যবহার করে।
  2. speed কম্পাইলেশন ফিল্টার (যা বলে "অ্যাপ থেকে যতটা সম্ভব কম্পাইল করুন") অনুযায়ী কম্পাইল করা হয়নি এমন যেকোনও অ্যাপ্লিকেশনের জন্য JIT চালু করা আছে।
  3. JIT প্রোফাইল ডেটা সিস্টেম ডিরেক্টরিতে একটি ফাইলে ডাম্প করা হয় যা শুধুমাত্র অ্যাপ্লিকেশন অ্যাক্সেস করতে পারে।
  4. AOT কম্পাইলেশন (dex2oat) ডেমোন সেই ফাইল পার্স করে কম্পাইলেশন চালায়।

    JIT ডেমন
    ছবি ৩. JIT ডেমন অ্যাক্টিভিটি।

Google Play পরিষেবা হল এমন একটি উদাহরণ যা অন্যান্য অ্যাপ্লিকেশন ব্যবহার করে এবং শেয়ার করা লাইব্রেরির মতো আচরণ করে।

JIT ওয়ার্কফ্লো

JIT আর্কিটেকচার
ছবি ৪. JIT ডেটা ফ্লো।
  • কোড ক্যাশে প্রোফাইলিং তথ্য স্টোর করা হয় এবং মেমরি প্রেসার থাকলে গার্বেজ কালেকশন করা হয়।
    • অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে থাকাকালীন নেওয়া স্ন্যাপশটে সম্পূর্ণ ডেটা (অর্থাৎ, JIT করা সবকিছু) থাকবে এমন কোনও গ্যারান্টি নেই।
    • সবকিছু রেকর্ড করা হয়েছে কিনা তা নিশ্চিত করার কোনও চেষ্টা করা হয় না (কারণ এটি রানটাইম পারফর্ম্যান্সকে প্রভাবিত করতে পারে)।
  • পেমেন্ট পদ্ধতি তিনটি আলাদা আলাদা স্ট্যাটাসে থাকতে পারে:
    • ইন্টারপ্রিট করা (dex কোড)
    • JIT কম্পাইল করা
    • AOT কম্পাইল করা
    JIT ও AOT কোড, দুটিই থাকলে (যেমন, বারবার ডি-অপ্টিমাইজেশনের কারণে), JIT কোডকে অগ্রাধিকার দেওয়া হয়।
  • ফোরগ্রাউন্ড অ্যাপের পারফর্ম্যান্সের উপর প্রভাব না ফেলে JIT চালানোর জন্য প্রয়োজনীয় মেমরি, সংশ্লিষ্ট অ্যাপের উপর নির্ভর করে। ছোট অ্যাপের তুলনায় বড় অ্যাপের জন্য বেশি মেমরি প্রয়োজন। সাধারণত, বড় অ্যাপের সাইজ ৪ এমবি-র কাছাকাছি হয়।

JIT লগিং চালু করা

JIT লগিং চালু করতে, নিম্নলিখিত কমান্ডগুলি রান করুন:

adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start

JIT বন্ধ করা

JIT বন্ধ করতে, নিম্নলিখিত কমান্ড রান করুন:

adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start

কম্পাইলেশন প্রয়োগ করা

কম্পাইলেশন বাধ্য করতে, নিম্নলিখিত কমান্ড রান করুন:

adb shell cmd package compile

নির্দিষ্ট প্যাকেজ জোর করে কম্পাইল করার সাধারণ ব্যবহার:

  • প্রোফাইল-ভিত্তিক:
    adb shell cmd package compile -m speed-profile -f my-package
    
  • সম্পূর্ণ:
    adb shell cmd package compile -m speed -f my-package
    

সব প্যাকেজ ফোর্স কম্পাইল করার সাধারণ ব্যবহার:

  • প্রোফাইল-ভিত্তিক:
    adb shell cmd package compile -m speed-profile -f -a
    
  • সম্পূর্ণ:
    adb shell cmd package compile -m speed -f -a
    

প্রোফাইল ডেটা মুছে দেওয়া

Android 13 বা তার আগের যেকোনও ভার্সনে

স্থানীয় প্রোফাইল ডেটা মুছে দিতে এবং কম্পাইল করা কোড সরিয়ে দিতে, নিম্নলিখিত কমান্ড রান করুন:

adb shell pm compile --reset 

Android 14 বা এর পরের যেকোনও ভার্সনে

শুধুমাত্র স্থানীয় প্রোফাইল ডেটা মুছে দিতে:

adb shell pm art clear-app-profiles 

মনে রাখবেন: Android 13 বা তার আগের ভার্সনের কমান্ডের মতো, এই কমান্ড অ্যাপের সাথে ইনস্টল করা এক্সটার্নাল প্রোফাইল ডেটা (`.dm`) মুছে দেয় না।

লোকাল প্রোফাইল ডেটা মুছে দিতে এবং লোকাল প্রোফাইল ডেটা থেকে তৈরি করা কম্পাইল করা কোড সরাতে (অর্থাৎ, ইনস্টল করার অবস্থায় রিসেট করতে), নিম্নলিখিত কমান্ড রান করুন:

adb shell pm compile --reset 

মনে রাখবেন: এই কমান্ডটি অ্যাপের সাথে ইনস্টল করা এক্সটার্নাল প্রোফাইল ডেটা (`.dm`) থেকে তৈরি কম্পাইল করা কোড সরিয়ে দেয় না।

সব কম্পাইল করা কোড মুছে দিতে, এই কমান্ডটি রান করুন:

adb shell cmd package compile -m verify -f 

মনে রাখবেন: এই কমান্ড লোকাল প্রোফাইল ডেটা রেখে দেয়।