ART পরিষেবা কনফিগারেশন

শুরু করার আগে, ART পরিষেবার একটি হাই-লেভেল ওভারভিউ দেখুন।

Android 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 (default: speed)

অন্য অ্যাপের মাধ্যমে ব্যবহার করা অ্যাপের জন্য এটি হল ফলব্যাক কম্পাইলার ফিল্টার।

নীতিগতভাবে, ART পরিষেবা সম্ভব হলে সব অ্যাপের জন্য প্রোফাইল-নির্দেশিত কম্পাইলেশন (speed-profile) করে, সাধারণত ব্যাকগ্রাউন্ড dexopt চলাকালীন। তবে, এমন কিছু অ্যাপ আছে যেগুলি অন্য অ্যাপের দ্বারা ব্যবহৃত হয় (<uses-library>-এর মাধ্যমে বা Context#createPackageContext ব্যবহার করে ডায়নামিক লোড করা হয় এবং CONTEXT_INCLUDE_CODE-এর সাথে)। গোপনীয়তার কারণে এই ধরনের অ্যাপ স্থানীয় প্রোফাইল ব্যবহার করতে পারে না।

এই ধরনের অ্যাপের জন্য, প্রোফাইল-নির্দেশিত কম্পাইলেশনের অনুরোধ করা হলে, ART পরিষেবা প্রথমে ক্লাউড প্রোফাইল ব্যবহার করার চেষ্টা করে। ক্লাউড প্রোফাইল না থাকলে, ART পরিষেবা pm.dexopt.shared-এর মাধ্যমে নির্দিষ্ট করা কম্পাইলার ফিল্টার ব্যবহার করে।

অনুরোধ করা কম্পাইলেশন প্রোফাইল-নির্ভর না হলে, এই প্রপার্টির কোনও প্রভাব পড়ে না।

pm.dexopt.<reason>.concurrency (default: 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 এবং টাস্ক প্রোফাইল সবসময় CPU কোর ব্যবহারকে বেঁধে রাখে, একই সাথে চলতে থাকা থ্রেডের সর্বাধিক সংখ্যা নির্বিশেষে (উপরে আলোচনা করা হয়েছে)।

dalvik.vm.*dex2oat-threads যাই হোক না কেন, একটি dex2oat ইনভোকেশন সব সিপিইউ কোরকে সম্পূর্ণরূপে ব্যবহার নাও করতে পারে। তাই, dex2oat ইনভোকেশন (pm.dexopt.<reason>.concurrency) সংখ্যা বাড়ালে, dexopt-এর সামগ্রিক প্রসেসকে দ্রুততর করতে, CPU কোর আরও ভালোভাবে ব্যবহার করা যেতে পারে। এটি বিশেষ করে বুট করার সময় কাজে লাগে।

তবে, অনেক বেশি dex2oat ইনভোকেশন থাকলে, ডিভাইসের মেমরি শেষ হয়ে যেতে পারে, যদিও dalvik.vm.dex2oat-swap-এর মান true সেট করে সোয়াপ ফাইল ব্যবহার করার অনুমতি দিলে এটি কমানো যেতে পারে। এছাড়াও, অনেক বেশি ইনভোকেশন অপ্রয়োজনীয় কনটেক্সট সুইচিংয়ের কারণ হতে পারে। তাই, প্রতিটি প্রোডাক্টের জন্য এই সংখ্যাটি সাবধানে টিউন করা উচিত।

pm.dexopt.downgrade_after_inactive_days (ডিফল্ট: সেট করা নেই)

এই বিকল্প সেট করা থাকলে, ART পরিষেবা শুধুমাত্র শেষ প্রদত্ত দিনের সংখ্যার মধ্যে ব্যবহৃত অ্যাপগুলিকে dexopt করে।

এছাড়াও, স্টোরেজ প্রায় ভরে গেলে, ব্যাকগ্রাউন্ড dexopt চলাকালীন, ART Service গত কয়েক দিনে ব্যবহার করা হয়নি এমন অ্যাপের কম্পাইলার ফিল্টারকে ডাউনগ্রেড করে, যাতে জায়গা খালি করা যায়। এর জন্য কম্পাইলারের কারণ হল inactive, এবং কম্পাইলার ফিল্টার pm.dexopt.inactive দ্বারা নির্ধারিত হয়। এই ফিচার ট্রিগার করার জন্য স্পেসের থ্রেশহোল্ড হল স্টোরেজ ম্যানেজারের কম স্পেসের থ্রেশহোল্ড (গ্লোবাল সেটিংস sys_storage_threshold_percentage এবং sys_storage_threshold_max_bytes-এর মাধ্যমে কনফিগার করা যায়, ডিফল্ট: ৫০০ এমবি) এবং তার সাথে ৫০০ এমবি।

আপনি যদি ArtManagerLocal#setBatchDexoptStartCallback-এর মাধ্যমে প্যাকেজের তালিকা কাস্টমাইজ করেন, তাহলে BatchDexoptStartCallback-এর দেওয়া তালিকায় থাকা প্যাকেজগুলি bg-dexopt-এর জন্য কখনও ডাউনগ্রেড করা হয় না।

pm.dexopt.disable_bg_dexopt (default: false)

এটি শুধুমাত্র পরীক্ষার জন্য। এটি ART পরিষেবাকে ব্যাকগ্রাউন্ড dexopt জব শিডিউল করা থেকে আটকায়।

ব্যাকগ্রাউন্ড dexopt জব আগে থেকেই শিডিউল করা থাকলে কিন্তু এখনও রান না করলে, এই বিকল্পের কোনও প্রভাব নেই। অর্থাৎ, জবটি এখনও চলবে।

ব্যাকগ্রাউন্ড dexopt জব যাতে রান না করে তার জন্য সাজেস্ট করা কমান্ডের ক্রম হল:

setprop pm.dexopt.disable_bg_dexopt true
pm bg-dexopt-job --disable

প্রথম লাইনটি ব্যাকগ্রাউন্ড dexopt জব শিডিউল করা থেকে আটকায়, যদি এটি এখনও শিডিউল করা না হয়ে থাকে। দ্বিতীয় লাইনটি ব্যাকগ্রাউন্ড dexopt জব আনশিডিউল করে, যদি এটি আগে থেকেই শিডিউল করা থাকে এবং এটি ব্যাকগ্রাউন্ড dexopt জব অবিলম্বে বাতিল করে, যদি এটি চলছে।

ART Service API

ART পরিষেবা কাস্টমাইজেশনের জন্য Java API প্রকাশ করে। API-গুলি ArtManagerLocal-এ সংজ্ঞায়িত করা হয়েছে। ব্যবহারের (Android 14 সোর্স, প্রকাশ না করা ডেভেলপমেন্ট সোর্স) জন্য 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;

API-এর কিছু সাধারণ ব্যবহারের উদাহরণ নিচে দেওয়া হল।

কোনও অ্যাপের জন্য dexopt ট্রিগার করা

আপনি যেকোনও সময় 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();

এছাড়াও, আপনি ব্যাকগ্রাউন্ড dexopt বাতিল করতে পারবেন, যা ART পরিষেবা দ্বারা শুরু করা হয়।

getArtManagerLocal().cancelBackgroundDexoptJob();

dexopt ফলাফল পাওয়া

dexoptPackage কলের মাধ্যমে কোনও অপারেশন শুরু হলে, আপনি রিটার্ন ভ্যালু থেকে ফলাফল পেতে পারেন।

DexoptResult result;
try (var snapshot = getPackageManagerLocal().withFilteredSnapshot()) {
  result = getArtManagerLocal().dexoptPackage(...);
}

// Process the result here.
...

এছাড়াও, ART পরিষেবা অনেক পরিস্থিতিতে নিজেই dexopt অপারেশন শুরু করে, যেমন ব্যাকগ্রাউন্ড dexopt। dexoptPackage কল বা ART পরিষেবার মাধ্যমে অপারেশন শুরু করা হোক না কেন, সব dexopt ফলাফল শুনতে 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 প্যারামিটার কাস্টমাইজ করা

বুট ও ব্যাকগ্রাউন্ড dexopt চলাকালীন ART পরিষেবা নিজেই 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();

ব্যাকগ্রাউন্ড dexopt জবের প্যারামিটার কাস্টমাইজ করুন

ডিফল্ট হিসেবে, ডিভাইস চার্জে বসানো থাকলে এবং ব্যবহার না করা হলে, ব্যাকগ্রাউন্ড dexopt জব দিনে একবার রান করে। ArtManagerLocal#setScheduleBackgroundDexoptJobCallback ব্যবহার করে এটি পরিবর্তন করা যেতে পারে।

getArtManagerLocal().setScheduleBackgroundDexoptJobCallback(
    Runnable::run,
    builder -> {
      builder.setPeriodic(TimeUnit.DAYS.toMillis(2));
    });

আপনি সর্বাধিক একটি ScheduleBackgroundDexoptJobCallback সেট করতে পারবেন। আপনি না সরানো পর্যন্ত, কলব্যাক ভবিষ্যতে সব কলের জন্য অ্যাক্টিভ থাকবে।

আপনি কলব্যাক মুছে দিতে চাইলে, ArtManagerLocal#clearScheduleBackgroundDexoptJobCallback ব্যবহার করুন।

getArtManagerLocal().clearScheduleBackgroundDexoptJobCallback();

সাময়িকভাবে dexopt বন্ধ করুন

ART পরিষেবার মাধ্যমে শুরু করা যেকোনও dexopt অপারেশন একটি BatchDexoptStartCallback ট্রিগার করে। dexopt কার্যকরভাবে বন্ধ করতে, আপনি অপারেশন বাতিল করা চালিয়ে যেতে পারেন।

আপনি যে অপারেশন বাতিল করেছেন সেটি ব্যাকগ্রাউন্ড 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 কল করা থেকে আটকান।

নির্দিষ্ট প্যাকেজের জন্য কম্পাইলার ফিল্টার ওভাররাইড করুন (Android 15+)

setAdjustCompilerFilterCallback-এর মাধ্যমে কলব্যাক রেজিস্টার করে আপনি নির্দিষ্ট প্যাকেজের জন্য কম্পাইলার ফিল্টার ওভাররাইড করতে পারবেন। কোনও প্যাকেজ dexopt করা হলে, কলব্যাককে কল করা হয়। dexopt, বুট ও ব্যাকগ্রাউন্ড dexopt চলাকালীন 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 পরিষেবা কিছু অন্যান্য কাস্টমাইজেশন সমর্থন করে।

ব্যাকগ্রাউন্ড dexopt-এর জন্য থার্মাল থ্রেশহোল্ড সেট করা

ব্যাকগ্রাউন্ড dexopt জবের থার্মাল কন্ট্রোল জব শিডিউলারের মাধ্যমে পারফর্ম করা হয়। তাপমাত্রা THERMAL_STATUS_MODERATE-এ পৌঁছালে সাথে সাথেই জব বাতিল হয়ে যায়। THERMAL_STATUS_MODERATE-এর থ্রেশহোল্ড টিউন করা যায়।

ব্যাকগ্রাউন্ড dexopt চলছে কিনা তা নির্ধারণ করা

ব্যাকগ্রাউন্ড dexopt জব Job Scheduler ম্যানেজ করে এবং এর জব আইডি হল 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 ফাইলের নাম অবশ্যই APK ফাইলের নাম হতে হবে এবং এক্সটেনশনটি .dm দিয়ে পরিবর্তন করতে হবে। যেমন,

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 ফাইলের চেকমামের সাথে মিলছে না।)