एआरटी सेवा का कॉन्फ़िगरेशन

शुरू करने से पहले, ART सेवा की खास जानकारी देखें.

Android 14 और इसके बाद के वर्शन में, डिवाइस पर मौजूद एओटी के डेटा को कंपाइलेशन ऐप्लिकेशन (जैसे, dexopt) को ART सर्विस मैनेज करती है. एआरटी सेवा, एआरटी का हिस्सा है मॉड्यूल का इस्तेमाल किया जा सकता है और सिस्टम प्रॉपर्टी और एपीआई की मदद से इसे कस्टमाइज़ किया जा सकता है.

सिस्टम की प्रॉपर्टी

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 (डिफ़ॉल्ट: गति)

यह दूसरे ऐप्लिकेशन में इस्तेमाल किए जाने वाले ऐप्लिकेशन के लिए फ़ॉलबैक कंपाइलर फ़िल्टर है.

सिद्धांत के तौर पर, ART सर्विस प्रोफ़ाइल के हिसाब से कंपाइलेशन (speed-profile) सभी ऐप्लिकेशन के लिए उपलब्ध है. आम तौर पर, यह बैकग्राउंड में अपने-आप बंद हो जाता है. हालांकि, ऐसे कई तरीके हैं कुछ ऐप्लिकेशन जिनका इस्तेमाल दूसरे ऐप्लिकेशन करते हैं (<uses-library> से या लोड किए गए ऐप्लिकेशन के ज़रिए) डाइनैमिक तौर पर, Context#createPackageContext का इस्तेमाल इन चीज़ों के साथ किया जा रहा है CONTEXT_INCLUDE_CODE). ऐसे ऐप्लिकेशन, लोकल नेटवर्क का इस्तेमाल नहीं कर सकते प्रोफ़ाइल.

ऐसे ऐप्लिकेशन के लिए, अगर प्रोफ़ाइल के हिसाब से डेटा को कंपाइल करने का अनुरोध किया जाता है, तो पहले एआरटी सेवा क्लाउड प्रोफ़ाइल का इस्तेमाल करने की कोशिश करता है. अगर क्लाउड प्रोफ़ाइल मौजूद नहीं है, तो ART सर्विस pm.dexopt.shared के बताए गए कंपाइलर फ़िल्टर का इस्तेमाल करने पर वापस आ जाता है.

अगर अनुरोध किया गया कंपाइलेशन प्रोफ़ाइल के हिसाब से नहीं है, तो इस प्रॉपर्टी का कोई असर नहीं होगा.

pm.dexopt.< reason>.concurrency (डिफ़ॉल्ट: 1)

यह पहले से तय कुछ कंपाइलेशन के लिए dex2oat शुरू करने वालों की संख्या है वजहें (first-boot, boot-after-ota, boot-after-mainline-update, और bg-dexopt).

ध्यान दें कि इस विकल्प का असर इनके साथ दिया जाता है: 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 और टास्क प्रोफ़ाइलें हमेशा सीपीयू कोर की सुरक्षा करती हैं इस्तेमाल, एक साथ कई थ्रेड की संख्या पर ध्यान दिए बिना (इस बारे में चर्चा की गई है) ऊपर).

ऐसा हो सकता है कि एक dex2oat शुरू करने से, सभी सीपीयू कोर का इस्तेमाल न हो dalvik.vm.*dex2oat-threads पेज चुने जा सकते हैं. इसलिए, dex2oat की संख्या बढ़ाना शुरू करने की सुविधा (pm.dexopt.<reason>.concurrency), सीपीयू कोर का बेहतर इस्तेमाल कर सकती है, Dexopt की पूरी प्रोग्रेस को तेज़ किया जा सकता है. यह खास तौर पर इस दौरान उपयोगी होता है बूट करें.

हालांकि, बहुत ज़्यादा dex2oat बोले जाने पर, डिवाइस बंद हो सकता है मेमोरी को कम किया जा सकता है. हालांकि, dalvik.vm.dex2oat-swap को इस पर सेट करके इसे कम किया जा सकता है स्वैप फ़ाइल के इस्तेमाल की अनुमति देने के लिए true. बहुत ज़्यादा बार शुरू करने की वजह से भी ग़ैर-ज़रूरी कॉन्टेक्स्ट स्विचिंग को न करें. इसलिए, इस संख्या को सावधानी से कॉन्फ़िगर किया जाना चाहिए अलग-अलग प्रॉडक्ट के हिसाब से तय होता है.

pm.dexopt.downgrade_ बाद_enabled_days (डिफ़ॉल्ट: सेट नहीं)

अगर यह विकल्प सेट है, तो ART सर्विस सिर्फ़ आखिरी बार इस्तेमाल किए गए ऐप्लिकेशन को बंद करती है दिनों की संख्या.

इसके अलावा, अगर बैकग्राउंड में डेटा इस्तेमाल करने के दौरान स्टोरेज कम है, तो ART Service उन ऐप्लिकेशन के कंपाइलर फ़िल्टर को डाउनग्रेड करता है जिनका इस्तेमाल आखिरी बार दिए गए में नहीं किया गया है जगह खाली करने के लिए दिनों की संख्या. इसकी कंपाइलर वजह inactive है, और कंपाइलर फ़िल्टर pm.dexopt.inactive से तय किया जाता है. स्पेस यह सुविधा को ट्रिगर करने का थ्रेशोल्ड, स्टोरेज मैनेजर के कम स्टोरेज का थ्रेशोल्ड है (ग्लोबल सेटिंग sys_storage_threshold_percentage और sys_storage_threshold_max_bytes, डिफ़ॉल्ट: 500 एमबी) और 500 एमबी.

अगर पैकेज की सूची को ArtManagerLocal#setBatchDexoptStartCallback, दी गई सूची में मौजूद पैकेज BatchDexoptStartCallback के ज़रिए bg-dexopt के लिए कभी भी डाउनग्रेड नहीं किया जाता.

pm.dexopt.disable_bg_dexopt (डिफ़ॉल्ट: गलत)

यह सिर्फ़ जांच के लिए है. यह एआरटी सेवा को बैकग्राउंड शेड्यूल करने से रोकता है काम हटा देता है.

अगर बैकग्राउंड डेक्सप्ट जॉब पहले से शेड्यूल है, लेकिन अभी तक नहीं चला है, तो विकल्प से कोई असर नहीं पड़ता. इसका मतलब है कि जॉब अब भी चलेगा.

बैकग्राउंड में होने वाले निर्देशों का पालन करने से रोकने के लिए, निर्देशों का एक सुझाया गया क्रम चल रहा है:

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

अगर ऐसा है, तो पहली लाइन, बैकग्राउंड डीक्सप्ट जॉब को शेड्यूल होने से रोकती है अभी तक शेड्यूल नहीं की गई है. अगर दूसरी लाइन, बैकग्राउंड में होने वाले बदलावों को रद्द करती है, तो इसे पहले ही शेड्यूल किया जा चुका है और अगर अभी यह चालू है.

एआरटी सर्विस एपीआई

ART सेवा, कस्टमाइज़ेशन के लिए Java API उपलब्ध कराती है. एपीआई की जानकारी इसमें दी गई है ArtManagerLocal. Java फ़ाइलें देखने के लिए इसके लिए art/libartservice/service/java/com/android/server/art/ArtManagerLocal.java इस्तेमाल (Android 14 का सोर्स, रिलीज़ नहीं किया गया डेवलपमेंट सोर्स).

ArtManagerLocal एक सिंगलटन है, जो LocalManagerRegistry के पास है. हेल्पर com.android.server.pm.DexOptHelper#getArtManagerLocal फ़ंक्शन आपकी मदद करता है उसे प्राप्त करें.

import static com.android.server.pm.DexOptHelper.getArtManagerLocal;

ज़्यादातर एपीआई को PackageManagerLocal.FilteredSnapshot के इंस्टेंस की ज़रूरत होती है, जिसमें सभी ऐप्लिकेशन की जानकारी मौजूद होती है. कॉल करके जानकारी पाई जा सकती है PackageManagerLocal#withFilteredSnapshot, जहां PackageManagerLocal भी है एक सिंगलटन LocalManagerRegistry के पास है और इसे यहां से हासिल किया जा सकता है com.android.server.pm.PackageManagerServiceUtils#getPackageManagerLocal.

import static com.android.server.pm.PackageManagerServiceUtils.getPackageManagerLocal;

नीचे एपीआई के इस्तेमाल के कुछ सामान्य उदाहरण दिए गए हैं.

किसी ऐप्लिकेशन के लिए डेक्सऑप्ट ट्रिगर करें

आप जब चाहें, कॉल करके किसी भी ऐप्लिकेशन के लिए डेक्सऑप्ट को ट्रिगर कर सकते हैं ArtManagerLocal#dexoptPackage.

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 कॉल से कोई कार्रवाई शुरू की जाती है, तो आप रद्द करने वाला सिग्नल. इसकी मदद से, किसी समय पर कार्रवाई को रद्द किया जा सकता है. यह काम कर सकता है यह तब उपयोगी होगा, जब आप एसिंक्रोनस रूप से डीक्सऑप्ट चलाएं.

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 Service की ओर से शुरू की जाती है.

getArtManagerLocal().cancelBackgroundDexoptJob();

डिकोड की गई क्वेरी के नतीजे पाएं

अगर dexoptPackage कॉल पर कोई कार्रवाई शुरू की जाती है, तो आपको नतीजा मिल सकता है को वापस कर सकते हैं.

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

// Process the result here.
...

एआरटी सेवा कई स्थितियों में खुद ही डेक्सप्ट ऑपरेशन शुरू करती है. जैसे बैकग्राउंड डीक्ज़ॉप्ट. सभी डेक्सऑप्ट परिणामों को सुनने के लिए, चाहे कार्रवाई dexoptPackage कॉल या ART सर्विस द्वारा शुरू किया गया, इनका उपयोग करें ArtManagerLocal#addDexoptDoneCallback.

getArtManagerLocal().addDexoptDoneCallback(
    false /* onlyIncludeUpdates */,
    Runnable::run,
    (result) -> {
      // Process the result here.
      ...
    });

पहला आर्ग्युमेंट यह तय करता है कि नतीजे में सिर्फ़ अपडेट शामिल करने हैं या नहीं. अगर आपने आपको सिर्फ़ उन पैकेज को सुनना है जिन्हें डेक्सटॉप की मदद से अपडेट किया गया है. इसके लिए, इसे 'सही है' पर सेट करें.

दूसरा आर्ग्युमेंट, कॉलबैक का एक्ज़ीक्यूटर होता है. कॉलबैक को चालू करने के लिए वही थ्रेड जो डेक्सऑप्ट करता है, 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);

पैकेज सूची को पसंद के मुताबिक बनाएं और पैरामीटर को डीक्सॉप्ट करें

एआरटी सेवा, बूट और बैकग्राउंड के दौरान खुद ही डेक्सप्ट ऑपरेशन शुरू करती है डीक्ज़ॉप्ट. इन कार्रवाइयों के लिए पैकेज सूची को पसंद के मुताबिक बनाने या पैरामीटर डीक्सऑप्ट करने के लिए, 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. इन कार्रवाइयों को रद्द किया जा सकता है: हटाने की सुविधा को असरदार तरीके से बंद कर सकती है.

अगर आपने जिस कार्रवाई को रद्द किया है वह बैकग्राउंड डीक्सप्ट है, तो यह डिफ़ॉल्ट कार्रवाई को फ़ॉलो करता है फिर से कोशिश करने की नीति (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 का इस्तेमाल किया जा सकता है. अगर आपको यह भी इस्तेमाल करना है कि पैकेज सूची को पसंद के मुताबिक बनाने या पैरामीटर डीक्सॉप्ट करने के लिए, BatchDexoptStartCallback, तो आपको कोड को एक कॉलबैक में जोड़ना होगा.

// Bad example.

// Disable dexopt.
getArtManagerLocal().unscheduleBackgroundDexoptJob();

// Re-enable dexopt.
getArtManagerLocal().scheduleBackgroundDexoptJob();

ऐप्लिकेशन इंस्टॉल करने के बाद, डीएक्सप्ट की कार्रवाई करने की प्रक्रिया ART ने शुरू नहीं की है सेवा. इसके बजाय, इसे पैकेज मैनेजर dexoptPackage कॉल. इसलिए, यह ट्रिगर नहीं होता BatchDexoptStartCallback. ऐप्लिकेशन इंस्टॉल करने पर Dexopt को बंद करने के लिए, dexoptPackage को कॉल करने वाला पैकेज मैनेजर.

कुछ पैकेज के लिए कंपाइलर फ़िल्टर को बदलना (Android 15 और उसके बाद वाले वर्शन)

इसे रजिस्टर करके, कुछ पैकेज के लिए कंपाइलर फ़िल्टर को बदला जा सकता है setAdjustCompilerFilterCallback के ज़रिए कॉलबैक. कॉलबैक को कॉल किया जाता है जब किसी पैकेज को हटाया जाना है, तो इससे कोई फ़र्क़ नहीं पड़ता कि डिवाइस बूट और बैकग्राउंड डीक्सप्ट करने के दौरान या dexoptPackage एपीआई कॉल के दौरान ART सेवा.

अगर किसी पैकेज को अडजस्टमेंट की ज़रूरत नहीं है, तो कॉलबैक को वापस करना होगा 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. यह तय करने के लिए कि जॉब चल रहा है या नहीं, जॉब शेड्यूलर एपीआई का इस्तेमाल करें.

// 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 के लिए प्रोफ़ाइल उपलब्ध कराएं

डेक्सटॉप की सुविधा इस्तेमाल करने के लिए, प्रोफ़ाइल का इस्तेमाल करने के लिए,.prof फ़ाइल या .dm फ़ाइल को फ़ाइल के बगल में रखें APK के साथ दिखेगा.

.prof फ़ाइल, बाइनरी फ़ॉर्मैट वाली प्रोफ़ाइल फ़ाइल होनी चाहिए. साथ ही, फ़ाइल का नाम APK + .prof का फ़ाइल नाम. उदाहरण के लिए,

base.apk.prof

.dm फ़ाइल का फ़ाइल नाम, एक्सटेंशन को .dm से बदला गया. उदाहरण के लिए,

base.dm

इस बात की पुष्टि करने के लिए कि प्रोफ़ाइल का इस्तेमाल, डेक्सऑप्ट के लिए किया जा रहा है, dexopt को चालू करें 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 के साथ है और यह ज़्यादा शब्दों में लिखे गए नतीजे को प्रिंट करने के लिए -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 फ़ाइलों के चेकसम से मेल खा सकता है.)