আপনি শুরু করার আগে, ART পরিষেবার একটি উচ্চ-স্তরের ওভারভিউ দেখুন।
অ্যান্ড্রয়েড 14 দিয়ে শুরু করে, অ্যাপ্লিকেশানগুলির জন্য অন-ডিভাইস AOT সংকলন (ওরফে dexopt) ART পরিষেবা দ্বারা পরিচালিত হয়। ART পরিষেবা হল ART মডিউলের একটি অংশ, এবং আপনি এটিকে সিস্টেম বৈশিষ্ট্য এবং API-এর মাধ্যমে কাস্টমাইজ করতে পারেন।
সিস্টেম বৈশিষ্ট্য
ART পরিষেবা সমস্ত প্রাসঙ্গিক dex2oat বিকল্পগুলিকে সমর্থন করে৷
উপরন্তু, ART পরিষেবা নিম্নলিখিত সিস্টেম বৈশিষ্ট্য সমর্থন করে:
pm.dexopt.<reason>
এটি সিস্টেম বৈশিষ্ট্যগুলির একটি সেট যা Dexopt পরিস্থিতিতে বর্ণিত সমস্ত পূর্বনির্ধারিত সংকলন কারণগুলির জন্য ডিফল্ট কম্পাইলার ফিল্টার নির্ধারণ করে।
আরও তথ্যের জন্য, কম্পাইলার ফিল্টার দেখুন।
স্ট্যান্ডার্ড ডিফল্ট মান হল:
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 (ডিফল্ট: গতি)
এটি অন্যান্য অ্যাপের দ্বারা ব্যবহৃত অ্যাপগুলির জন্য ফলব্যাক কম্পাইলার ফিল্টার।
নীতিগতভাবে, এআরটি সার্ভিস সব অ্যাপের জন্য প্রোফাইল-গাইডেড কম্পাইলেশন ( speed-profile
) করে যখন সম্ভব হয়, সাধারণত ব্যাকগ্রাউন্ড ডেক্সোপ্টের সময়। যাইহোক, কিছু অ্যাপ আছে যেগুলি অন্যান্য অ্যাপ দ্বারা ব্যবহার করা হয় (হয় <uses-library>
এর মাধ্যমে অথবা CONTEXT_INCLUDE_CODE
এর সাথে Context#createPackageContext
ব্যবহার করে গতিশীলভাবে লোড করা হয়)। গোপনীয়তার কারণে এই ধরনের অ্যাপ স্থানীয় প্রোফাইল ব্যবহার করতে পারে না।
এই ধরনের অ্যাপের জন্য, যদি প্রোফাইল-নির্দেশিত সংকলন অনুরোধ করা হয়, ART পরিষেবা প্রথমে একটি ক্লাউড প্রোফাইল ব্যবহার করার চেষ্টা করে। যদি একটি ক্লাউড প্রোফাইল বিদ্যমান না থাকে, ART পরিষেবা 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>.concurrency
dex2oat আহ্বানের সংখ্যা নিয়ন্ত্রণ করে। অর্থাৎ, সর্বাধিক সংখ্যক সমবর্তী থ্রেড দুটি সিস্টেম বৈশিষ্ট্যের গুণফল। -
dalvik.vm.*dex2oat-cpu-set
dalvik.vm.*dex2oat-threads
নির্বিশেষে একটি একক dex2oat আমন্ত্রণ সমস্ত CPU কোর সম্পূর্ণরূপে ব্যবহার নাও করতে পারে। তাই, dex2oat আহবানের সংখ্যা বৃদ্ধি ( pm.dexopt.<reason>.concurrency
) dexopt-এর সামগ্রিক অগ্রগতিকে দ্রুততর করতে CPU কোরগুলিকে আরও ভালভাবে ব্যবহার করতে পারে। এটি বুট করার সময় বিশেষভাবে কার্যকর।
যাইহোক, অনেক বেশি dex2oat ইনভোকেশন থাকার ফলে ডিভাইসটির মেমরি ফুরিয়ে যেতে পারে, যদিও dalvik.vm.dex2oat-swap
swap ফাইল ব্যবহার করার অনুমতি দেওয়ার জন্য এটিকে true
সেট করে এটি প্রশমিত করা যেতে পারে। অত্যধিক আমন্ত্রণ অপ্রয়োজনীয় প্রসঙ্গ পরিবর্তনের কারণ হতে পারে। অতএব, এই সংখ্যাটি একটি পণ্য দ্বারা পণ্যের ভিত্তিতে সাবধানে টিউন করা উচিত।
pm.dexopt.downgrade_after_inactive_days (ডিফল্ট: সেট নয়)
যদি এই বিকল্পটি সেট করা থাকে, ART পরিষেবা শুধুমাত্র শেষ প্রদত্ত দিনের মধ্যে ব্যবহৃত অ্যাপগুলিকে ডেক্সপ্ট করে৷
উপরন্তু, যদি স্টোরেজ প্রায় কম হয়, ব্যাকগ্রাউন্ড ডেক্সোপ্টের সময়, ART পরিষেবা স্থান খালি করতে শেষ প্রদত্ত দিনের মধ্যে ব্যবহার করা হয়নি এমন অ্যাপগুলির কম্পাইলার ফিল্টারকে ডাউনগ্রেড করে। এর জন্য কম্পাইলার কারণ inactive
, এবং কম্পাইলার ফিল্টার pm.dexopt.inactive
দ্বারা নির্ধারিত হয়। এই বৈশিষ্ট্যটি ট্রিগার করার জন্য স্পেস থ্রেশহোল্ড হল স্টোরেজ ম্যানেজারের লো স্পেস থ্রেশহোল্ড (গ্লোবাল সেটিংস sys_storage_threshold_percentage
এবং sys_storage_threshold_max_bytes
, ডিফল্ট: 500MB) প্লাস 500MB এর মাধ্যমে কনফিগার করা যায়।
আপনি যদি ArtManagerLocal#setBatchDexoptStartCallback
মাধ্যমে প্যাকেজগুলির তালিকা কাস্টমাইজ করেন, তাহলে bg-dexopt
এর জন্য BatchDexoptStartCallback
দ্বারা প্রদত্ত তালিকার প্যাকেজগুলি কখনই ডাউনগ্রেড করা হয় না।
pm.dexopt.disable_bg_dexopt (ডিফল্ট: মিথ্যা)
এটি শুধুমাত্র পরীক্ষার জন্য। এটি ART পরিষেবাকে ব্যাকগ্রাউন্ড ডেক্সপট কাজের সময় নির্ধারণ থেকে বাধা দেয়।
যদি ব্যাকগ্রাউন্ড ডেক্সপট কাজটি ইতিমধ্যেই নির্ধারিত থাকে কিন্তু এখনও চালানো না হয় তবে এই বিকল্পটির কোন প্রভাব নেই। অর্থাৎ চাকরি তখনও চলবে।
ব্যাকগ্রাউন্ড ডেক্সপট কাজটি চলা থেকে প্রতিরোধ করার জন্য কমান্ডের একটি প্রস্তাবিত ক্রম হল:
setprop pm.dexopt.disable_bg_dexopt true
pm bg-dexopt-job --disable
প্রথম লাইন ব্যাকগ্রাউন্ড ডেক্সপট কাজকে নির্ধারিত হতে বাধা দেয়, যদি এটি এখনও নির্ধারিত না হয়। দ্বিতীয় লাইনটি ব্যাকগ্রাউন্ড ডেক্সপট কাজকে পূর্বনির্ধারিত করে, যদি এটি ইতিমধ্যেই নির্ধারিত থাকে, এবং এটি চলমান থাকলে তা অবিলম্বে ব্যাকগ্রাউন্ড ডেক্সপট কাজ বাতিল করে।
ART পরিষেবা APIs
এআরটি সার্ভিস কাস্টমাইজেশনের জন্য জাভা এপিআই প্রকাশ করে। API গুলি ArtManagerLocal
এ সংজ্ঞায়িত করা হয়েছে। ব্যবহারের জন্য art/libartservice/service/java/com/android/server/art/ArtManagerLocal.java
এ Javadoc দেখুন ( অ্যান্ড্রয়েড 14 উৎস , অপ্রকাশিত উন্নয়ন উৎস )।
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;
নিম্নলিখিত API-এর কিছু সাধারণ ব্যবহারের ক্ষেত্রে রয়েছে।
একটি অ্যাপের জন্য ডেক্সপট ট্রিগার করুন
আপনি ArtManagerLocal#dexoptPackage
কল করে যেকোনো সময় যেকোনো অ্যাপের জন্য dexopt ট্রিগার করতে পারেন।
try (var snapshot = getPackageManagerLocal().withFilteredSnapshot()) {
getArtManagerLocal().dexoptPackage(
snapshot,
"com.google.android.calculator",
new DexoptParams.Builder(ReasonMapping.REASON_INSTALL).build());
}
এছাড়াও আপনি আপনার নিজস্ব dexopt কারণ পাস করতে পারেন. যদি আপনি এটি করেন, অগ্রাধিকার শ্রেণী এবং কম্পাইলার ফিল্টার স্পষ্টভাবে সেট করা আবশ্যক।
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());
}
dexopt বাতিল করুন
যদি একটি 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();
dexopt ফলাফল পান
যদি একটি অপারেশন একটি dexoptPackage
কল দ্বারা শুরু করা হয়, তাহলে আপনি রিটার্ন মান থেকে ফলাফল পেতে পারেন।
DexoptResult result;
try (var snapshot = getPackageManagerLocal().withFilteredSnapshot()) {
result = getArtManagerLocal().dexoptPackage(...);
}
// Process the result here.
...
এআরটি সার্ভিস অনেক পরিস্থিতিতে যেমন ব্যাকগ্রাউন্ড ডেক্সপ্ট নিজেই ডেক্সপট অপারেশন শুরু করে। সমস্ত dexopt ফলাফল শোনার জন্য, অপারেশনটি একটি dexoptPackage
কল দ্বারা শুরু করা হোক বা ART পরিষেবা দ্বারা, ArtManagerLocal#addDexoptDoneCallback
ব্যবহার করুন।
getArtManagerLocal().addDexoptDoneCallback(
false /* onlyIncludeUpdates */,
Runnable::run,
(result) -> {
// Process the result here.
...
});
প্রথম আর্গুমেন্ট নির্ধারণ করে যে শুধুমাত্র ফলাফলে আপডেট অন্তর্ভুক্ত করা হবে কিনা। আপনি যদি শুধুমাত্র dexopt দ্বারা আপডেট করা প্যাকেজগুলি শুনতে চান তবে এটি সত্যে সেট করুন।
দ্বিতীয় যুক্তি হল কলব্যাকের নির্বাহক। একই থ্রেডে কলব্যাক চালানোর জন্য যা dexopt সম্পাদন করে, Runnable::run
ব্যবহার করুন। আপনি কলব্যাক ডেক্সপট ব্লক করতে না চাইলে, একটি অ্যাসিঙ্ক্রোনাস এক্সিকিউটর ব্যবহার করুন।
আপনি একাধিক কলব্যাক যোগ করতে পারেন, এবং 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 পরামিতি কাস্টমাইজ করুন
এআরটি সার্ভিস বুট এবং ব্যাকগ্রাউন্ড ডেক্সোপ্টের সময় নিজেই dexopt অপারেশন শুরু করে। প্যাকেজ তালিকা কাস্টমাইজ করতে বা সেই অপারেশনগুলির জন্য dexopt প্যারামিটারগুলি ব্যবহার করুন 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 অক্ষম করুন
এআরটি সার্ভিস দ্বারা শুরু করা যেকোনো ডেক্সপট অপারেশন একটি BatchDexoptStartCallback
ট্রিগার করে। আপনি কার্যকরভাবে dexopt নিষ্ক্রিয় করতে অপারেশন বাতিল করতে পারেন.
আপনি যে ক্রিয়াকলাপটি বাতিল করেন তা যদি ব্যাকগ্রাউন্ড ডেক্সপট হয়, তবে এটি ডিফল্ট পুনঃপ্রচেষ্টা নীতি অনুসরণ করে (30 সেকেন্ড, সূচকীয়, 5 ঘন্টা সীমাবদ্ধ)।
// 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
কল করা থেকে বিরত করুন।
নির্দিষ্ট প্যাকেজের জন্য কম্পাইলার ফিল্টার ওভাররাইড করুন (Android 15+)
আপনি 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();
অন্যান্য কাস্টমাইজেশন
এআরটি সার্ভিস কিছু অন্যান্য কাস্টমাইজেশন সমর্থন করে।
ব্যাকগ্রাউন্ড ডেক্সোপ্টের জন্য তাপীয় থ্রেশহোল্ড সেট করুন
ব্যাকগ্রাউন্ড ডেক্সপট কাজের তাপ নিয়ন্ত্রণ জব সিডিউলার দ্বারা সঞ্চালিত হয়। তাপমাত্রা 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 এর জন্য একটি প্রোফাইল প্রদান করুন
dexopt গাইড করতে একটি প্রোফাইল ব্যবহার করতে, APK এর পাশে একটি .prof
ফাইল বা একটি .dm
ফাইল রাখুন৷
.prof
ফাইলটি অবশ্যই একটি বাইনারি-ফরম্যাট প্রোফাইল ফাইল হতে হবে এবং ফাইলের নামটি অবশ্যই APK + .prof
এর ফাইলের নাম হতে হবে। যেমন,
base.apk.prof
.dm
ফাইলের ফাইলের নাম অবশ্যই .dm
দ্বারা প্রতিস্থাপিত এক্সটেনশন সহ APK-এর ফাইলের নাম হতে হবে। যেমন,
base.dm
প্রোফাইলটি dexopt-এর জন্য ব্যবহার করা হচ্ছে তা যাচাই করতে, speed-profile
দিয়ে dexopt চালান এবং ফলাফল পরীক্ষা করুন।
pm art clear-app-profiles <package-name>
pm compile -m speed-profile -f -v <package-name>
প্রথম লাইনটি রানটাইম দ্বারা উত্পাদিত সমস্ত প্রোফাইল সাফ করে (অর্থাৎ, /data/misc/profiles
এ ), যদি থাকে, নিশ্চিত করার জন্য যে APK-এর পাশের প্রোফাইলটিই একমাত্র প্রোফাইল যা ART পরিষেবা সম্ভবত ব্যবহার করতে পারে৷ দ্বিতীয় লাইনটি 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 পরিষেবা প্রোফাইল ব্যবহার না করার সাধারণ কারণগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:
- প্রোফাইলে একটি ভুল ফাইলের নাম আছে বা এটি APK-এর পাশে নেই৷
- প্রোফাইল ভুল বিন্যাসে আছে.
- প্রোফাইলটি APK এর সাথে মেলে না। (প্রোফাইলের চেকসামগুলি APK-এর
.dex
ফাইলগুলির চেকসামগুলির সাথে মেলে না৷)