শুরু করার আগে, ART পরিষেবা সম্পর্কে একটি সামগ্রিক ধারণা দেখে নিন।
অ্যান্ড্রয়েড ১৪ থেকে শুরু করে, অ্যাপের জন্য অন-ডিভাইস AOT কম্পাইলেশন (যা ডেক্সঅপট নামেও পরিচিত) ART সার্ভিস দ্বারা পরিচালিত হয়। ART সার্ভিস হলো ART মডিউলের একটি অংশ, এবং আপনি সিস্টেম প্রোপার্টি ও API-এর মাধ্যমে এটিকে কাস্টমাইজ করতে পারেন।
সিস্টেমের বৈশিষ্ট্য
ART সার্ভিস সকল প্রাসঙ্গিক dex2oat অপশন সমর্থন করে।
এছাড়াও, ART সার্ভিস নিম্নলিখিত সিস্টেম প্রোপার্টিগুলো সমর্থন করে:
pm.dexopt.<reason>
এটি সিস্টেম প্রোপার্টিগুলোর একটি সেট, যা ডেক্সপ্ট সিনারিওতে বর্ণিত সমস্ত পূর্বনির্ধারিত কম্পাইলেশন কারণগুলোর জন্য ডিফল্ট কম্পাইলার ফিল্টার নির্ধারণ করে।
আরও তথ্যের জন্য, কম্পাইলার ফিল্টারসমূহ দেখুন।
প্রমিত ডিফল্ট মানগুলো হলো:
pm.dexopt.first-boot=verify
pm.dexopt.boot-after-ota=verify
pm.dexopt.boot-after-mainline-update=verify
pm.dexopt.bg-dexopt=speed-profile
pm.dexopt.inactive=verify
pm.dexopt.cmdline=verify
pm.dexopt.shared (ডিফল্ট: স্পিড)
এটি হলো অন্যান্য অ্যাপ দ্বারা ব্যবহৃত অ্যাপগুলোর জন্য ফলব্যাক কম্পাইলার ফিল্টার।
নীতিগতভাবে, ART সার্ভিস সম্ভব হলে সমস্ত অ্যাপের জন্য প্রোফাইল-নির্দেশিত কম্পাইলেশন ( speed-profile ) করে থাকে, যা সাধারণত ব্যাকগ্রাউন্ড ডেক্সঅপশনের সময় সম্পন্ন হয়। তবে, এমন কিছু অ্যাপ আছে যা অন্য অ্যাপ দ্বারা ব্যবহৃত হয় (হয় <uses-library> এর মাধ্যমে অথবা CONTEXT_INCLUDE_CODE সহ Context#createPackageContext ব্যবহার করে ডায়নামিকভাবে লোড করা হয়)। গোপনীয়তার কারণে এই ধরনের অ্যাপগুলো লোকাল প্রোফাইল ব্যবহার করতে পারে না।
এই ধরনের অ্যাপের ক্ষেত্রে, প্রোফাইল-নির্দেশিত কম্পাইলেশনের অনুরোধ করা হলে, ART Service প্রথমে একটি ক্লাউড প্রোফাইল ব্যবহার করার চেষ্টা করে। যদি কোনো ক্লাউড প্রোফাইল না থাকে, তাহলে ART Service pm.dexopt.shared দ্বারা নির্দিষ্ট কম্পাইলার ফিল্টারটি ব্যবহার করে।
অনুরোধকৃত সংকলনটি যদি প্রোফাইল-নির্দেশিত না হয়, তবে এই প্রপার্টিটির কোনো প্রভাব থাকবে না।
pm.dexopt.<reason>.concurrency (ডিফল্ট: 1)
এটি কিছু পূর্বনির্ধারিত কম্পাইলেশন কারণের ( first-boot , boot-after-ota , boot-after-mainline-update , এবং bg-dexopt ) জন্য dex2oat আহ্বানের সংখ্যা।
উল্লেখ্য যে, এই অপশনটির প্রভাব dex2oat রিসোর্স ব্যবহারের অপশনগুলোর ( dalvik.vm.*dex2oat-threads , dalvik.vm.*dex2oat-cpu-set , এবং টাস্ক প্রোফাইলগুলো) সাথে মিলিতভাবে কাজ করে:
-
dalvik.vm.*dex2oat-threadsপ্রতিটি dex2oat আহ্বানের জন্য থ্রেডের সংখ্যা নিয়ন্ত্রণ করে, অন্যদিকেpm.dexopt.<reason>.concurrencydex2oat আহ্বানের সংখ্যা নিয়ন্ত্রণ করে। অর্থাৎ, একযোগে সর্বাধিক সংখ্যক থ্রেড হলো এই দুটি সিস্টেম প্রপার্টির গুণফল। -
dalvik.vm.*dex2oat-cpu-setএবং টাস্ক প্রোফাইলগুলো একযোগে চলমান থ্রেডের সর্বোচ্চ সংখ্যা (উপরে আলোচিত) নির্বিশেষে সর্বদা সিপিইউ কোরের ব্যবহার সীমিত রাখত।
dalvik.vm.*dex2oat-threads নির্বিশেষে, একটি একক dex2oat আহ্বান সব সিপিইউ কোর সম্পূর্ণরূপে ব্যবহার নাও করতে পারে। তাই, dex2oat আহ্বানের সংখ্যা ( pm.dexopt.<reason>.concurrency ) বাড়ালে সিপিইউ কোরগুলো আরও ভালোভাবে ব্যবহৃত হতে পারে, যা dexopt-এর সামগ্রিক অগ্রগতিকে ত্বরান্বিত করে। এটি বিশেষত বুট করার সময় কার্যকর।
তবে, খুব বেশি dex2oat ইনভোকেশনের ফলে ডিভাইসের মেমোরি শেষ হয়ে যেতে পারে, যদিও dalvik.vm.dex2oat-swap true সেট করে একটি সোয়াপ ফাইল ব্যবহারের সুযোগ দিয়ে এর প্রতিকার করা যায়। অতিরিক্ত ইনভোকেশনের কারণে অপ্রয়োজনীয় কনটেক্সট সুইচিংও হতে পারে। তাই, প্রতিটি প্রোডাক্টের জন্য এই সংখ্যাটি সতর্কতার সাথে নির্ধারণ করা উচিত।
pm.dexopt.downgrade_after_inactive_days (ডিফল্ট: সেট করা নেই)
এই অপশনটি সেট করা থাকলে, ART Service শুধুমাত্র গত নির্দিষ্ট সংখ্যক দিনের মধ্যে ব্যবহৃত অ্যাপগুলোই ডিএক্সপ্ট করে।
এছাড়াও, স্টোরেজ প্রায় শেষ হয়ে এলে, ব্যাকগ্রাউন্ড ডেক্সঅপট (dexopt) চলাকালীন, ART সার্ভিস জায়গা খালি করার জন্য গত নির্দিষ্ট সংখ্যক দিনে অব্যবহৃত অ্যাপগুলির কম্পাইলার ফিল্টার ডাউনগ্রেড করে। এর জন্য কম্পাইলার কারণটি হলো inactive , এবং কম্পাইলার ফিল্টারটি pm.dexopt.inactive দ্বারা নির্ধারিত হয়। এই ফিচারটি চালু করার জন্য প্রয়োজনীয় স্পেস থ্রেশহোল্ড হলো স্টোরেজ ম্যানেজারের লো স্পেস থ্রেশহোল্ড (যা গ্লোবাল সেটিংস sys_storage_threshold_percentage এবং sys_storage_threshold_max_bytes এর মাধ্যমে কনফিগার করা যায়, ডিফল্ট: ৫০০ মেগাবাইট) এবং তার সাথে ৫০০ মেগাবাইট যোগ করে প্রাপ্ত পরিমাণ।
আপনি যদি ArtManagerLocal#setBatchDexoptStartCallback মাধ্যমে প্যাকেজের তালিকা কাস্টমাইজ করেন, তাহলে bg-dexopt এর জন্য BatchDexoptStartCallback দ্বারা প্রদত্ত তালিকার প্যাকেজগুলি কখনই ডাউনগ্রেড করা হয় না।
pm.dexopt.disable_bg_dexopt (ডিফল্ট: false)
এটি শুধুমাত্র পরীক্ষার জন্য। এটি ART সার্ভিসকে ব্যাকগ্রাউন্ড ডেক্সপ্ট জব শিডিউল করা থেকে বিরত রাখে।
যদি ব্যাকগ্রাউন্ড ডেক্সপ্ট জবটি আগে থেকেই শিডিউল করা থাকে কিন্তু এখনও রান না হয়ে থাকে, তাহলে এই অপশনটির কোনো প্রভাব থাকবে না। অর্থাৎ, জবটি তবুও রান হবে।
ব্যাকগ্রাউন্ডে dexopt জবটি চলা বন্ধ করার জন্য প্রস্তাবিত কমান্ডের ক্রমটি হলো:
setprop pm.dexopt.disable_bg_dexopt true
pm bg-dexopt-job --disable
প্রথম লাইনটি ব্যাকগ্রাউন্ড ডেক্সপ্ট জবটিকে শিডিউল হওয়া থেকে বিরত রাখে, যদি এটি এখনও শিডিউল করা না হয়ে থাকে। দ্বিতীয় লাইনটি ব্যাকগ্রাউন্ড ডেক্সপ্ট জবটিকে আনশিডিউল করে, যদি এটি ইতিমধ্যেই শিডিউল করা থাকে, এবং যদি এটি চলমান থাকে, তবে তা সঙ্গে সঙ্গে বাতিল করে দেয়।
ART পরিষেবা API
ART সার্ভিস কাস্টমাইজেশনের জন্য জাভা এপিআই (API) প্রদান করে। এপিআইগুলো ArtManagerLocal এ সংজ্ঞায়িত করা আছে। এর ব্যবহারবিধি জানতে art/libartservice/service/java/com/android/server/art/ArtManagerLocal.java তে থাকা Javadoc দেখুন ( অ্যান্ড্রয়েড ১৪ সোর্স , অপ্রকাশিত ডেভেলপমেন্ট সোর্স )।
ArtManagerLocal হলো LocalManagerRegistry দ্বারা ধারণকৃত একটি সিঙ্গেলটন। com.android.server.pm.DexOptHelper#getArtManagerLocal নামক একটি হেল্পার ফাংশন আপনাকে এটি পেতে সাহায্য করে।
import static com.android.server.pm.DexOptHelper.getArtManagerLocal;
বেশিরভাগ API-এর জন্য PackageManagerLocal.FilteredSnapshot এর একটি ইনস্ট্যান্স প্রয়োজন হয়, যা সমস্ত অ্যাপের তথ্য ধারণ করে। আপনি PackageManagerLocal#withFilteredSnapshot কল করে এটি পেতে পারেন, যেখানে PackageManagerLocal ও LocalManagerRegistry দ্বারা ধারণকৃত একটি সিঙ্গেলটন এবং এটি com.android.server.pm.PackageManagerServiceUtils#getPackageManagerLocal থেকে পাওয়া যায়।
import static com.android.server.pm.PackageManagerServiceUtils.getPackageManagerLocal;
নিম্নলিখিতগুলি হলো এপিআইগুলির কিছু সাধারণ ব্যবহার।
একটি অ্যাপের জন্য ডেক্সঅপট ট্রিগার করুন
আপনি যেকোনো অ্যাপের জন্য যেকোনো সময়ে ArtManagerLocal#dexoptPackage কল করে dexopt চালু করতে পারেন।
try (var snapshot = getPackageManagerLocal().withFilteredSnapshot()) {
getArtManagerLocal().dexoptPackage(
snapshot,
"com.google.android.calculator",
new DexoptParams.Builder(ReasonMapping.REASON_INSTALL).build());
}
আপনি আপনার নিজস্ব ডেক্সঅপশন কারণও পাস করতে পারেন। যদি তা করেন, তাহলে প্রায়োরিটি ক্লাস এবং কম্পাইলার ফিল্টার অবশ্যই স্পষ্টভাবে সেট করতে হবে।
try (var snapshot = getPackageManagerLocal().withFilteredSnapshot()) {
getArtManagerLocal().dexoptPackage(
snapshot,
"com.google.android.calculator",
new DexoptParams.Builder("my-reason")
.setCompilerFilter("speed-profile")
.setPriorityClass(ArtFlags.PRIORITY_BACKGROUND)
.build());
}
ডেক্সপ্ট বাতিল করুন
যদি কোনো অপারেশন একটি dexoptPackage কলের মাধ্যমে শুরু করা হয়, তাহলে আপনি একটি ক্যান্সেলেশন সিগন্যাল পাস করতে পারেন, যা আপনাকে যেকোনো পর্যায়ে অপারেশনটি বাতিল করার সুযোগ দেয়। যখন আপনি dexopt অ্যাসিঙ্ক্রোনাসভাবে চালান, তখন এটি কার্যকর হতে পারে।
Executor executor = ...; // Your asynchronous executor here.
var cancellationSignal = new CancellationSignal();
executor.execute(() -> {
try (var snapshot = getPackageManagerLocal().withFilteredSnapshot()) {
getArtManagerLocal().dexoptPackage(
snapshot,
"com.google.android.calculator",
new DexoptParams.Builder(ReasonMapping.REASON_INSTALL).build(),
cancellationSignal);
}
});
// When you want to cancel the operation.
cancellationSignal.cancel();
আপনি ব্যাকগ্রাউন্ড ডেক্সঅপশনও বাতিল করতে পারেন, যা ART সার্ভিস দ্বারা শুরু করা হয়।
getArtManagerLocal().cancelBackgroundDexoptJob();
ডেক্সপ্ট ফলাফল পান
যদি dexoptPackage কলের মাধ্যমে কোনো অপারেশন শুরু করা হয়, তাহলে আপনি রিটার্ন ভ্যালু থেকে ফলাফলটি পেতে পারেন।
DexoptResult result;
try (var snapshot = getPackageManagerLocal().withFilteredSnapshot()) {
result = getArtManagerLocal().dexoptPackage(...);
}
// Process the result here.
...
অনেক ক্ষেত্রে, যেমন ব্যাকগ্রাউন্ড ডেক্সপ্ট-এর ক্ষেত্রে, ART সার্ভিস নিজেই ডেক্সপ্ট অপারেশন শুরু করে। অপারেশনটি dexoptPackage কল বা ART সার্ভিস দ্বারা শুরু হোক না কেন, সমস্ত ডেক্সপ্ট ফলাফল শোনার জন্য ArtManagerLocal#addDexoptDoneCallback ব্যবহার করুন।
getArtManagerLocal().addDexoptDoneCallback(
false /* onlyIncludeUpdates */,
Runnable::run,
(result) -> {
// Process the result here.
...
});
প্রথম আর্গুমেন্টটি নির্ধারণ করে যে ফলাফলে শুধুমাত্র আপডেটগুলো অন্তর্ভুক্ত করা হবে কিনা। আপনি যদি শুধুমাত্র dexopt দ্বারা আপডেট করা প্যাকেজগুলো শুনতে চান, তাহলে এটিকে 'true' সেট করুন।
দ্বিতীয় আর্গুমেন্টটি হলো কলব্যাকের এক্সিকিউটর। যে থ্রেডে dexopt চলে, সেই একই থ্রেডে কলব্যাকটি এক্সিকিউট করতে Runnable::run ব্যবহার করুন। যদি আপনি না চান যে কলব্যাকটি dexopt-কে ব্লক করুক, তাহলে একটি অ্যাসিঙ্ক্রোনাস এক্সিকিউটর ব্যবহার করুন।
আপনি একাধিক কলব্যাক যোগ করতে পারেন এবং ART সার্ভিস সেগুলোকে ক্রমানুসারে কার্যকর করবে। আপনি অপসারণ না করা পর্যন্ত, ভবিষ্যতের সমস্ত কলের জন্য সবগুলো কলব্যাক সক্রিয় থাকবে।
যদি আপনি কোনো কলব্যাক সরাতে চান, তাহলে সেটি যোগ করার সময় কলব্যাকটির রেফারেন্সটি রাখুন এবং ArtManagerLocal#removeDexoptDoneCallback ব্যবহার করুন।
DexoptDoneCallback callback = (result) -> {
// Process the result here.
...
};
getArtManagerLocal().addDexoptDoneCallback(
false /* onlyIncludeUpdates */, Runnable::run, callback);
// When you want to remove it.
getArtManagerLocal().removeDexoptDoneCallback(callback);
প্যাকেজ তালিকা এবং dexopt প্যারামিটারগুলি কাস্টমাইজ করুন
ART সার্ভিস বুট করার সময় এবং ব্যাকগ্রাউন্ড ডেক্সপ্টের সময় নিজেই ডেক্সপ্ট অপারেশন শুরু করে। এই অপারেশনগুলির জন্য প্যাকেজ তালিকা বা ডেক্সপ্ট প্যারামিটার কাস্টমাইজ করতে, ArtManagerLocal#setBatchDexoptStartCallback ব্যবহার করুন।
getArtManagerLocal().setBatchDexoptStartCallback(
Runnable::run,
(snapshot, reason, defaultPackages, builder, cancellationSignal) -> {
switch (reason) {
case ReasonMapping.REASON_BG_DEXOPT:
var myPackages = new ArrayList<String>(defaultPackages);
myPackages.add(...);
myPackages.remove(...);
myPackages.sort(...);
builder.setPackages(myPackages);
break;
default:
// Ignore unknown reasons.
}
});
আপনি প্যাকেজ তালিকায় আইটেম যোগ করতে, তা থেকে আইটেম সরাতে, তালিকাটি সাজাতে, এমনকি সম্পূর্ণ ভিন্ন একটি তালিকাও ব্যবহার করতে পারেন।
আপনার কলব্যাককে অবশ্যই অজানা কারণগুলো উপেক্ষা করতে হবে, কারণ ভবিষ্যতে আরও কারণ যুক্ত হতে পারে।
আপনি সর্বাধিক একটি BatchDexoptStartCallback সেট করতে পারবেন। আপনি এটি নিষ্ক্রিয় না করা পর্যন্ত, এই কলব্যাকটি ভবিষ্যতের সমস্ত কলের জন্য সক্রিয় থাকবে।
যদি আপনি কলব্যাকটি বাতিল করতে চান, তাহলে ArtManagerLocal#clearBatchDexoptStartCallback ব্যবহার করুন।
getArtManagerLocal().clearBatchDexoptStartCallback();
ব্যাকগ্রাউন্ড ডেক্সপ্ট জবের প্যারামিটারগুলো কাস্টমাইজ করুন
ডিফল্টরূপে, ডিভাইসটি নিষ্ক্রিয় থাকা অবস্থায় এবং চার্জ হওয়ার সময় ব্যাকগ্রাউন্ড ডেক্সঅপট জবটি দিনে একবার চলে। ArtManagerLocal#setScheduleBackgroundDexoptJobCallback ব্যবহার করে এটি পরিবর্তন করা যেতে পারে।
getArtManagerLocal().setScheduleBackgroundDexoptJobCallback(
Runnable::run,
builder -> {
builder.setPeriodic(TimeUnit.DAYS.toMillis(2));
});
আপনি সর্বাধিক একটি ScheduleBackgroundDexoptJobCallback সেট করতে পারবেন। আপনি এটি নিষ্ক্রিয় না করা পর্যন্ত, এই কলব্যাকটি ভবিষ্যতের সমস্ত কলের জন্য সক্রিয় থাকবে।
আপনি যদি কলব্যাকটি বাতিল করতে চান, তাহলে ArtManagerLocal#clearScheduleBackgroundDexoptJobCallback ব্যবহার করুন।
getArtManagerLocal().clearScheduleBackgroundDexoptJobCallback();
সাময়িকভাবে dexopt নিষ্ক্রিয় করুন
ART সার্ভিস দ্বারা শুরু করা যেকোনো dexopt অপারেশন একটি BatchDexoptStartCallback ট্রিগার করে। আপনি dexopt কার্যকরভাবে নিষ্ক্রিয় করতে অপারেশনগুলো বাতিল করতে পারেন।
আপনি যে অপারেশনটি বাতিল করছেন তা যদি ব্যাকগ্রাউন্ড ডেক্সঅপশন হয়, তবে এটি ডিফল্ট পুনঃপ্রচেষ্টা নীতি অনুসরণ করে (৩০ সেকেন্ড, এক্সপোনেনশিয়াল, সর্বোচ্চ ৫ ঘণ্টা)।
// Good example.
var shouldDisableDexopt = new AtomicBoolean(false);
getArtManagerLocal().setBatchDexoptStartCallback(
Runnable::run,
(snapshot, reason, defaultPackages, builder, cancellationSignal) -> {
if (shouldDisableDexopt.get()) {
cancellationSignal.cancel();
}
});
// Disable dexopt.
shouldDisableDexopt.set(true);
getArtManagerLocal().cancelBackgroundDexoptJob();
// Re-enable dexopt.
shouldDisableDexopt.set(false);
আপনি সর্বাধিক একটি BatchDexoptStartCallback ব্যবহার করতে পারবেন। যদি আপনি প্যাকেজ তালিকা বা dexopt প্যারামিটার কাস্টমাইজ করার জন্যেও BatchDexoptStartCallback ব্যবহার করতে চান, তবে আপনাকে অবশ্যই কোডটি একটিমাত্র কলব্যাকে একত্রিত করতে হবে।
// Bad example.
// Disable dexopt.
getArtManagerLocal().unscheduleBackgroundDexoptJob();
// Re-enable dexopt.
getArtManagerLocal().scheduleBackgroundDexoptJob();
অ্যাপ ইনস্টলের সময় সম্পাদিত dexopt অপারেশনটি ART সার্ভিস দ্বারা শুরু করা হয় না । পরিবর্তে, এটি প্যাকেজ ম্যানেজার দ্বারা একটি dexoptPackage কলের মাধ্যমে শুরু করা হয়। তাই, এটি BatchDexoptStartCallback ট্রিগার করে না । অ্যাপ ইনস্টলে dexopt নিষ্ক্রিয় করতে, প্যাকেজ ম্যানেজারকে dexoptPackage কল করা থেকে বিরত রাখুন।
নির্দিষ্ট কিছু প্যাকেজের জন্য কম্পাইলার ফিল্টার ওভাররাইড করুন (অ্যান্ড্রয়েড ১৫+)
আপনি setAdjustCompilerFilterCallback মাধ্যমে একটি কলব্যাক রেজিস্টার করে নির্দিষ্ট কিছু প্যাকেজের জন্য কম্পাইলার ফিল্টার ওভাররাইড করতে পারেন। যখনই কোনো প্যাকেজ ডেক্সপ্ট করা হবে, তখনই এই কলব্যাকটি কল করা হয়; ডেক্সপ্টটি বুট ও ব্যাকগ্রাউন্ড ডেক্সপ্টের সময় ART সার্ভিস দ্বারা শুরু হোক বা একটি dexoptPackage API কলের মাধ্যমে হোক, তা নির্বিশেষে এই কলব্যাকটি কার্যকর হয়।
যদি কোনো প্যাকেজের সমন্বয়ের প্রয়োজন না হয়, তাহলে কলব্যাকটিকে অবশ্যই originalCompilerFilter রিটার্ন করতে হবে।
getArtManagerLocal().setAdjustCompilerFilterCallback(
Runnable::run,
(packageName, originalCompilerFilter, reason) -> {
if (isVeryImportantPackage(packageName)) {
return "speed-profile";
}
return originalCompilerFilter;
});
আপনি শুধুমাত্র একটি AdjustCompilerFilterCallback সেট করতে পারবেন। যদি আপনি একাধিক প্যাকেজের জন্য কম্পাইলার ফিল্টার ওভাররাইড করতে AdjustCompilerFilterCallback ব্যবহার করতে চান, তবে আপনাকে অবশ্যই কোডটিকে একটিমাত্র কলব্যাকে একত্রিত করতে হবে। আপনি এটি ক্লিয়ার না করা পর্যন্ত, কলব্যাকটি ভবিষ্যতের সমস্ত কলের জন্য সক্রিয় থাকে।
যদি আপনি কলব্যাকটি বাতিল করতে চান, তাহলে ArtManagerLocal#clearAdjustCompilerFilterCallback ব্যবহার করুন।
getArtManagerLocal().clearAdjustCompilerFilterCallback();
অন্যান্য কাস্টমাইজেশন
ART সার্ভিস আরও কিছু কাস্টমাইজেশন সমর্থন করে।
ব্যাকগ্রাউন্ড ডেক্সপ্টের জন্য থার্মাল থ্রেশহোল্ড সেট করুন
ব্যাকগ্রাউন্ড ডেক্সপ্ট জবের তাপীয় নিয়ন্ত্রণ জব শিডিউলার দ্বারা পরিচালিত হয়। তাপমাত্রা THERMAL_STATUS_MODERATE পৌঁছালে জবটি তাৎক্ষণিকভাবে বাতিল হয়ে যায়। THERMAL_STATUS_MODERATE এর এই থ্রেশহোল্ডটি পরিবর্তনযোগ্য।
ব্যাকগ্রাউন্ডে ডেক্সপ্ট চলছে কিনা তা নির্ধারণ করুন।
ব্যাকগ্রাউন্ড ডেক্সঅপট জবটি জব শিডিউলার দ্বারা পরিচালিত হয় এবং এর জব আইডি হলো 27873780 জবটি চলছে কিনা তা জানতে, জব শিডিউলার এপিআই (API) ব্যবহার করুন।
// Good example.
var jobScheduler =
Objects.requireNonNull(mContext.getSystemService(JobScheduler.class));
int reason = jobScheduler.getPendingJobReason(27873780);
if (reason == PENDING_JOB_REASON_EXECUTING) {
// Do something when the job is running.
...
}
// Bad example.
var backgroundDexoptRunning = new AtomicBoolean(false);
getArtManagerLocal().setBatchDexoptStartCallback(
Runnable::run,
(snapshot, reason, defaultPackages, builder, cancellationSignal) -> {
if (reason.equals(ReasonMapping.REASON_BG_DEXOPT)) {
backgroundDexoptRunning.set(true);
}
});
getArtManagerLocal().addDexoptDoneCallback(
false /* onlyIncludeUpdates */,
Runnable::run,
(result) -> {
if (result.getReason().equals(ReasonMapping.REASON_BG_DEXOPT)) {
backgroundDexoptRunning.set(false);
}
});
if (backgroundDexoptRunning.get()) {
// Do something when the job is running.
...
}
ডেক্সপ্টের জন্য একটি প্রোফাইল প্রদান করুন
dexopt-কে নির্দেশনা দিতে প্রোফাইল ব্যবহার করার জন্য, APK-টির পাশে একটি .prof ফাইল অথবা একটি .dm ফাইল রাখুন।
.prof ফাইলটি অবশ্যই একটি বাইনারি-ফরম্যাটের প্রোফাইল ফাইল হতে হবে এবং ফাইলের নামটি APK-এর নামের সাথে .prof যোগ করে লিখতে হবে। উদাহরণস্বরূপ,
base.apk.prof
.dm ফাইলের ফাইলের নামটি অবশ্যই APK ফাইলের নামের মতোই হতে হবে, যেখানে এক্সটেনশনটি .dm দ্বারা প্রতিস্থাপিত হবে। উদাহরণস্বরূপ,
base.dm
প্রোফাইলটি ডেক্সঅপট-এর জন্য ব্যবহৃত হচ্ছে কিনা তা যাচাই করতে, speed-profile সহ ডেক্সঅপট চালান এবং ফলাফলটি পরীক্ষা করুন।
pm art clear-app-profiles <package-name>
pm compile -m speed-profile -f -v <package-name>
প্রথম লাইনটি রানটাইম দ্বারা তৈরি সমস্ত প্রোফাইল (অর্থাৎ, /data/misc/profiles এ থাকা প্রোফাইলগুলো), যদি থাকে, তা মুছে ফেলে, যাতে এটা নিশ্চিত করা যায় যে APK-এর পাশের প্রোফাইলটিই একমাত্র প্রোফাইল যা ART Service ব্যবহার করতে পারে। দ্বিতীয় লাইনটি speed-profile সহ dexopt চালায়, এবং বিস্তারিত ফলাফল প্রিন্ট করার জন্য -v পাস করে।
প্রোফাইলটি ব্যবহৃত হলে, আপনি ফলাফলে actualCompilerFilter=speed-profile দেখতে পাবেন। অন্যথায়, আপনি actualCompilerFilter=verify দেখতে পাবেন। উদাহরণস্বরূপ,
DexContainerFileDexoptResult{dexContainerFile=/data/app/~~QR0fTV0UbDbIP1Su7XzyPg==/com.google.android.gms-LvusF2uARKOtBbcaPHdUtQ==/base.apk, primaryAbi=true, abi=x86_64, actualCompilerFilter=speed-profile, status=PERFORMED, dex2oatWallTimeMillis=4549, dex2oatCpuTimeMillis=14550, sizeBytes=3715344, sizeBeforeBytes=3715344}
ART Service যেসব সাধারণ কারণে প্রোফাইল ব্যবহার করে না, সেগুলো হলো নিম্নরূপ:
- প্রোফাইলটির ফাইলের নাম ভুল অথবা এটি APK-এর পাশে নেই।
- প্রোফাইলটি ভুল ফরম্যাটে আছে।
- প্রোফাইলটি APK-এর সাথে মিলছে না। (প্রোফাইলের চেকসামগুলো APK-তে থাকা
.dexফাইলগুলোর চেক্সামের সাথে মিলছে না।)