एआरटी सेवा विन्यास

शुरू करने से पहले, एआरटी सेवा का एक उच्च-स्तरीय अवलोकन देखें।

एंड्रॉइड 14 से शुरू होकर, ऐप्स के लिए ऑन-डिवाइस एओटी संकलन (उर्फ डेक्सॉप्ट) को एआरटी सेवा द्वारा नियंत्रित किया जाता है। एआरटी सेवा एआरटी मॉड्यूल का एक हिस्सा है, और आप इसे सिस्टम गुणों और एपीआई के माध्यम से अनुकूलित कर सकते हैं।

प्रणाली के गुण

एआरटी सेवा सभी प्रासंगिक dex2oat विकल्पों का समर्थन करती है।

इसके अतिरिक्त, एआरटी सेवा निम्नलिखित सिस्टम गुणों का समर्थन करती है:

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

एक एकल dex2oat आमंत्रण dalvik.vm.*dex2oat-threads की परवाह किए बिना, सभी CPU कोर का पूरी तरह से उपयोग नहीं कर सकता है। इसलिए, dex2oat आमंत्रणों की संख्या में वृद्धि ( pm.dexopt.<reason>.concurrency ) डेक्सॉप्ट की समग्र प्रगति को तेज करने के लिए सीपीयू कोर का बेहतर उपयोग कर सकती है। यह बूट के दौरान विशेष रूप से उपयोगी है।

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

pm.dexopt.downgrade_after_inactive_days (डिफ़ॉल्ट: सेट नहीं)

यदि यह विकल्प सेट किया गया है, तो एआरटी सेवा केवल पिछले दिए गए दिनों के भीतर उपयोग किए गए ऐप्स को हटा देती है।

इसके अलावा, यदि स्टोरेज लगभग कम है, तो बैकग्राउंड डेक्सॉप्ट के दौरान, एआरटी सेवा उन ऐप्स के कंपाइलर फ़िल्टर को डाउनग्रेड कर देती है, जिनका उपयोग स्थान खाली करने के लिए पिछले दिनों की संख्या के भीतर नहीं किया गया है। इसका कंपाइलर कारण 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 (डिफ़ॉल्ट: ग़लत)

यह केवल परीक्षण के लिए है. यह एआरटी सेवा को बैकग्राउंड डेक्सॉप्ट कार्य को शेड्यूल करने से रोकता है।

यदि पृष्ठभूमि डेक्सॉप्ट कार्य पहले से ही निर्धारित है लेकिन अभी तक नहीं चला है, तो इस विकल्प का कोई प्रभाव नहीं पड़ता है। यानी नौकरी फिर भी चलती रहेगी.

बैकग्राउंड डेक्सॉप्ट कार्य को चलने से रोकने के लिए आदेशों का एक अनुशंसित अनुक्रम है:

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

पहली पंक्ति पृष्ठभूमि डेक्सॉप्ट कार्य को शेड्यूल होने से रोकती है, यदि यह अभी तक शेड्यूल नहीं किया गया है। दूसरी पंक्ति बैकग्राउंड डेक्सॉप्ट जॉब को अनशेड्यूल कर देती है, यदि यह पहले से शेड्यूल है, और यह बैकग्राउंड डेक्सॉप्ट जॉब को तुरंत रद्द कर देती है, यदि यह चल रहा है।

एआरटी सेवा एपीआई

एआरटी सेवा अनुकूलन के लिए जावा एपीआई को उजागर करती है। एपीआई को ArtManagerLocal में परिभाषित किया गया है। उपयोग के लिए art/libartservice/service/java/com/android/server/art/ArtManagerLocal.java में Javadoc देखें ( 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();

आप बैकग्राउंड डेक्सॉप्ट को भी रद्द कर सकते हैं, जो एआरटी सेवा द्वारा शुरू किया गया है।

getArtManagerLocal().cancelBackgroundDexoptJob();

डेक्सॉप्ट परिणाम प्राप्त करें

यदि कोई ऑपरेशन dexoptPackage कॉल द्वारा शुरू किया गया है, तो आप रिटर्न वैल्यू से परिणाम प्राप्त कर सकते हैं।

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

// Process the result here.
...

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

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

पहला तर्क यह निर्धारित करता है कि परिणाम में केवल अपडेट शामिल करना है या नहीं। यदि आप केवल उन पैकेजों को सुनना चाहते हैं जो डेक्सॉप्ट द्वारा अपडेट किए गए हैं, तो इसे सत्य पर सेट करें।

दूसरा तर्क कॉलबैक का निष्पादक है। उसी थ्रेड पर कॉलबैक निष्पादित करने के लिए जो डेक्सॉप्ट करता है, Runnable::run का उपयोग करें। यदि आप नहीं चाहते कि कॉलबैक डेक्सॉप्ट को अवरुद्ध करे, तो एक एसिंक्रोनस निष्पादक का उपयोग करें।

आप एकाधिक कॉलबैक जोड़ सकते हैं, और एआरटी सेवा उन सभी को क्रमिक रूप से निष्पादित करेगी। जब तक आप उन्हें हटा नहीं देते, सभी कॉलबैक भविष्य की सभी कॉलों के लिए सक्रिय रहेंगे।

यदि आप कॉलबैक हटाना चाहते हैं, तो कॉलबैक जोड़ते समय उसका संदर्भ रखें और 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();

डेक्सॉप्ट को अस्थायी रूप से अक्षम करें

एआरटी सेवा द्वारा शुरू किया गया कोई भी डेक्सॉप्ट ऑपरेशन 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();

ऐप इंस्टॉल पर निष्पादित डेक्सॉप्ट ऑपरेशन एआरटी सेवा द्वारा शुरू नहीं किया गया है। इसके बजाय, इसे पैकेज मैनेजर द्वारा dexoptPackage कॉल के माध्यम से शुरू किया जाता है। इसलिए, यह BatchDexoptStartCallback ट्रिगर नहीं करता है। ऐप इंस्टॉल पर डेक्सॉप्ट को अक्षम करने के लिए, पैकेज मैनेजर को dexoptPackage कॉल करने से रोकें।

कुछ पैकेजों के लिए कंपाइलर फ़िल्टर को ओवरराइड करें (Android 15 (AOSP प्रयोगात्मक)+)

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

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

// 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.
  ...
}

डेक्सॉप्ट के लिए एक प्रोफ़ाइल प्रदान करें

डेक्सॉप्ट का मार्गदर्शन करने के लिए प्रोफ़ाइल का उपयोग करने के लिए, एपीके के आगे एक .prof फ़ाइल या एक .dm फ़ाइल रखें।

.prof फ़ाइल एक बाइनरी-प्रारूप प्रोफ़ाइल फ़ाइल होनी चाहिए, और फ़ाइल नाम APK + .prof का फ़ाइल नाम होना चाहिए। उदाहरण के लिए,

base.apk.prof

.dm फ़ाइल का फ़ाइल नाम .dm द्वारा प्रतिस्थापित एक्सटेंशन के साथ APK का फ़ाइल नाम होना चाहिए। उदाहरण के लिए,

base.dm

यह सत्यापित करने के लिए कि प्रोफ़ाइल का उपयोग डेक्सॉप्ट के लिए किया जा रहा है, speed-profile के साथ डेक्सॉप्ट चलाएँ और परिणाम की जाँच करें।

pm art clear-app-profiles <package-name>
pm compile -m speed-profile -f -v <package-name>

पहली पंक्ति रनटाइम द्वारा निर्मित सभी प्रोफाइल (यानी, /data/misc/profiles ) को साफ़ करती है, यदि कोई हो, तो यह सुनिश्चित करने के लिए कि एपीके के आगे वाली प्रोफ़ाइल एकमात्र प्रोफ़ाइल है जिसे एआरटी सेवा संभवतः उपयोग कर सकती है। दूसरी पंक्ति 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}

एआरटी सेवा द्वारा प्रोफ़ाइल का उपयोग न करने के विशिष्ट कारणों में निम्नलिखित शामिल हैं:

  • प्रोफ़ाइल में गलत फ़ाइल नाम है या यह एपीके के आगे नहीं है।
  • प्रोफ़ाइल गलत प्रारूप में है.
  • प्रोफ़ाइल एपीके से मेल नहीं खाती. (प्रोफ़ाइल में चेकसम एपीके में .dex फ़ाइलों के चेकसम से मेल नहीं खाते हैं।)