ঠিক সময়ে কম্পাইলার ART প্রয়োগ করুন

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

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

JIT স্থাপত্য

JIT স্থাপত্য
চিত্র ১. জেআইটি স্থাপত্য।

JIT সংকলন

JIT কম্পাইলেশনের সাথে নিম্নলিখিত কার্যক্রমগুলো জড়িত:

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

    JIT ডেমন
    চিত্র ৩. JIT ডেমন-এর কার্যক্রম।

গুগল প্লে পরিষেবা হলো এমন একটি উদাহরণ যা শেয়ার্ড লাইব্রেরির মতো আচরণকারী অন্যান্য অ্যাপ্লিকেশনগুলো ব্যবহার করে থাকে।

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

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

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

অ্যান্ড্রয়েড ১৩ বা তার আগের সংস্করণে

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

adb shell pm compile --reset 

অ্যান্ড্রয়েড ১৪ বা তার পরবর্তী সংস্করণে

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

adb shell pm art clear-app-profiles 

দ্রষ্টব্য: অ্যান্ড্রয়েড ১৩ বা তার আগের সংস্করণের কমান্ডের মতো নয়, এই কমান্ডটি অ্যাপের সাথে ইনস্টল হওয়া বাহ্যিক প্রোফাইল ডেটা (`.dm`) মুছে ফেলে না।

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

adb shell pm compile --reset 

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

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

adb shell cmd package compile -m verify -f 

দ্রষ্টব্য: এই কমান্ডটি স্থানীয় প্রোফাইল ডেটা অক্ষুণ্ণ রাখে।