การกําหนดค่าบริการ ART

ก่อนเริ่มต้น ให้ดูภาพรวมระดับสูงของบริการ ART

ตั้งแต่ Android 14 เป็นต้นไป การคอมไพล์ AOT ในอุปกรณ์สำหรับแอป (หรือที่เรียกว่า dexopt) จะจัดการโดยบริการ ART ART Service เป็นส่วนหนึ่งของ 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 (ค่าเริ่มต้น: ความเร็ว)

นี่คือตัวกรองคอมไพเลอร์สำรองสำหรับแอปที่แอปอื่นๆ ใช้

โดยหลักการแล้ว บริการ ART จะทำการคอมไพล์โดยอิงตามโปรไฟล์ (speed-profile) สำหรับแอปทั้งหมดเมื่อเป็นไปได้ ซึ่งโดยปกติจะดำเนินการระหว่างการ DexOpt เบื้องหลัง อย่างไรก็ตาม มี แอปบางแอปที่แอปอื่นใช้ (ทั้งผ่าน <uses-library> หรือแบบโหลด แบบไดนามิกโดยใช้ Context#createPackageContext กับ CONTEXT_INCLUDE_CODE) แอปดังกล่าวใช้ในเครื่องไม่ได้ โปรไฟล์ด้วยเหตุผลด้านความเป็นส่วนตัว

สําหรับแอปดังกล่าว หากมีการขอการคอมไพล์ที่แนะนําโดยโปรไฟล์ บริการ ART จะพยายามใช้โปรไฟล์ระบบคลาวด์ก่อน หากไม่มีโปรไฟล์ในระบบคลาวด์ บริการ 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 กล่าวคือ จํานวนเธรดสูงสุดที่ทํางานพร้อมกันคือผลคูณของพร็อพเพอร์ตี้ระบบ 2 รายการ
  • dalvik.vm.*dex2oat-cpu-set และโปรไฟล์งานจะเชื่อมโยงกับการใช้งานแกน CPU เสมอ โดยไม่คำนึงถึงจำนวนชุดข้อความสูงสุดที่ทำงานพร้อมกัน (ตามที่ได้อธิบายไว้ข้างต้น)

การเรียกใช้ dex2oat ครั้งเดียวอาจไม่ได้ใช้แกน CPU ทั้งหมดอย่างเต็มประสิทธิภาพ ไม่ว่า dalvik.vm.*dex2oat-threads จะเป็นอย่างไรก็ตาม ดังนั้น การเพิ่มจำนวนการเรียกใช้ dex2oat (pm.dexopt.<reason>.concurrency) จะช่วยใช้แกน CPU ได้ดียิ่งขึ้น เพื่อเร่งความคืบหน้าโดยรวมของ dexopt ซึ่งจะเป็นประโยชน์อย่างยิ่งในระหว่าง Boot

แต่การมีการเรียกใช้ dex2oat มากเกินไปอาจทำให้อุปกรณ์ทำงานไม่เต็มประสิทธิภาพ หน่วยความจำนี้ โดยสามารถลดทอนได้โดยการตั้งค่า dalvik.vm.dex2oat-swap เป็น true เพื่ออนุญาตให้ใช้ไฟล์การสลับ การเรียกใช้มากเกินไปอาจทำให้ การสลับบริบทโดยไม่จำเป็น ดังนั้น ตัวเลขนี้ควรผ่านการปรับแต่งอย่างระมัดระวัง เป็นรายผลิตภัณฑ์

pm.dexopt.downgrad_after_inactive_days (ค่าเริ่มต้น: ไม่ได้ตั้งค่า)

หากตั้งค่าตัวเลือกนี้ไว้ บริการ ART จะยกเลิกการเลือกแอปที่ใช้ภายในจำนวนวันที่ผ่านมาเท่านั้น

นอกจากนี้ หากพื้นที่เก็บข้อมูลเหลือน้อย ในช่วง Dexopt พื้นหลัง บริการ ART ดาวน์เกรดตัวกรองคอมไพเลอร์ของแอปที่ไม่ได้ใช้ภายในครั้งสุดท้าย จำนวนวัน เพื่อเพิ่มพื้นที่ว่าง เหตุผลที่คอมไพเลอร์ทำเช่นนี้คือ inactive และตัวกรองคอมไพเลอร์จะกำหนดโดย pm.dexopt.inactive พื้นที่ทำงาน เกณฑ์ที่จะทริกเกอร์ฟีเจอร์นี้คือเกณฑ์พื้นที่ต่ำของตัวจัดการพื้นที่เก็บข้อมูล (กำหนดค่าได้ผ่านการตั้งค่าส่วนกลาง sys_storage_threshold_percentage และ sys_storage_threshold_max_bytes, ค่าเริ่มต้น: 500 MB) บวก 500 MB

หากคุณปรับแต่งรายการแพ็กเกจผ่าน ArtManagerLocal#setBatchDexoptStartCallback ระบบจะไม่ดาวน์เกรดแพ็กเกจในรายการที่ BatchDexoptStartCallback ระบุสำหรับ bg-dexopt

pm.dexopt.disable_bg_dexopt (ค่าเริ่มต้น: เท็จ)

การดำเนินการนี้มีไว้เพื่อการทดสอบเท่านั้น ป้องกันไม่ให้บริการ 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 ดู Javadoc ใน art/libartservice/service/java/com/android/server/art/ArtManagerLocal.java สำหรับ (แหล่งที่มาของ Android 14, แหล่งที่มาของการพัฒนาที่ยังไม่เปิดตัว)

ArtManagerLocal เป็น Singleton ที่ LocalManagerRegistry ถือครอง ผู้ช่วย ฟังก์ชัน com.android.server.pm.DexOptHelper#getArtManagerLocal ช่วยให้คุณ หาได้

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

API ส่วนใหญ่ต้องใช้อินสแตนซ์ของ PackageManagerLocal.FilteredSnapshot ซึ่งเก็บข้อมูลของแอปทั้งหมด คุณรับค่านี้ได้โดยเรียกใช้ PackageManagerLocal#withFilteredSnapshot โดยที่ PackageManagerLocal ก็เป็น Singleton ที่ LocalManagerRegistry ถือครองอยู่และรับได้จาก com.android.server.pm.PackageManagerServiceUtils#getPackageManagerLocal

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

ต่อไปนี้คือกรณีการใช้งานทั่วไปของ API

ทริกเกอร์ dexopt สําหรับแอป

คุณเรียกใช้ dexopt สําหรับแอปใดก็ได้ทุกเมื่อโดยเรียกใช้ ArtManagerLocal#dexoptPackage

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 ในเบื้องหลัง หากต้องการฟังผลลัพธ์ dexopt ทั้งหมด ไม่ว่าจะเรียกใช้การดำเนินการโดยdexoptPackage call หรือโดยบริการ ART ก็ตาม ให้ใช้ArtManagerLocal#addDexoptDoneCallback

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

อาร์กิวเมนต์แรกจะกำหนดว่าจะรวมเฉพาะการอัปเดตไว้ในผลลัพธ์หรือไม่ หากต้องการฟังเฉพาะแพ็กเกจที่อัปเดตโดย dexopt ให้ตั้งค่าเป็น true

อาร์กิวเมนต์ที่ 2 คือตัวดำเนินการของ Callback หากต้องการเรียกใช้การเรียกกลับในเธรดเดียวกับที่ดำเนินการ dexopt ให้ใช้ Runnable::run หากไม่ต้องการให้การเรียกกลับบล็อก dexopt ให้ใช้ตัวดำเนินการแบบไม่พร้อมกัน

คุณเพิ่ม Callback หลายรายการได้ แล้วบริการ ART จะดำเนินการทั้งหมด อย่างเป็นลำดับ การติดต่อกลับทั้งหมดจะยังคงทำงานอยู่สำหรับการโทรในอนาคตทั้งหมด เว้นแต่คุณจะนำออก

หากคุณต้องการนำ Callback ออก ให้เก็บการอ้างอิง Callback ไว้เมื่อคุณ เพิ่มและใช้ 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 จะเริ่มต้นการดำเนินการ 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 ได้สูงสุด 1 รายการ การโทรกลับจะยังคงทำงานอยู่สำหรับการโทรทั้งหมดในอนาคต เว้นแต่คุณจะล้างข้อมูล

หากต้องการล้างการโทรกลับ ให้ใช้ ArtManagerLocal#clearBatchDexoptStartCallback

getArtManagerLocal().clearBatchDexoptStartCallback();

ปรับแต่งพารามิเตอร์ของงาน dexopt เบื้องหลัง

โดยค่าเริ่มต้น งาน dexopt ในเบื้องหลังจะทำงานวันละครั้งเมื่ออุปกรณ์ไม่ได้ใช้งานและกำลังชาร์จ ซึ่งเปลี่ยนแปลงได้โดยใช้ ArtManagerLocal#setScheduleBackgroundDexoptJobCallback

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

คุณตั้งค่า ScheduleBackgroundDexoptJobCallback ได้สูงสุด 1 รายการ การเรียกกลับจะ ยังใช้ได้สำหรับการโทรทั้งหมดในอนาคต เว้นแต่คุณจะล้างข้อมูลเอาไว้

หากคุณต้องการล้างการเรียกกลับ ให้ใช้ ArtManagerLocal#clearScheduleBackgroundDexoptJobCallback

getArtManagerLocal().clearScheduleBackgroundDexoptJobCallback();

ปิดใช้ dexopt ชั่วคราว

การดำเนินการ dexopt ที่เริ่มต้นโดยบริการ ART จะทริกเกอร์ BatchDexoptStartCallback คุณสามารถยกเลิกการดำเนินการเพื่อปิดใช้ dexopt ได้อย่างมีประสิทธิภาพ

หากการดำเนินการที่คุณยกเลิกเป็นการทำงานในเบื้องหลัง 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 ได้สูงสุด 1 รายการ หากต้องการใช้ BatchDexoptStartCallback เพื่อปรับแต่งรายการแพ็กเกจหรือพารามิเตอร์ dexopt คุณต้องรวมโค้ดไว้ใน Callback เดียว

// 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 เพื่อลบล้างตัวกรองคอมไพเลอร์สำหรับแพ็กเกจหลายรายการ คุณต้องรวมโค้ดไว้ในการเรียกกลับรายการเดียว Callback ยังคงอยู่ ใช้ได้กับการโทรทั้งหมดในอนาคต เว้นแต่ว่าคุณจะล้างข้อมูล

หากคุณต้องการล้างการเรียกกลับ ให้ใช้ ArtManagerLocal#clearAdjustCompilerFilterCallback

getArtManagerLocal().clearAdjustCompilerFilterCallback();

การปรับแต่งอื่นๆ

บริการ ART ยังรองรับการปรับแต่งอื่นๆ บางอย่างด้วย

ตั้งค่าเกณฑ์ความร้อนสำหรับการเพิ่มประสิทธิภาพ Dex ในเบื้องหลัง

ตัวจัดตารางงานจะควบคุมความร้อนของงาน dexopt ในเบื้องหลัง งานถูกยกเลิกทันทีเมื่ออุณหภูมิถึง THERMAL_STATUS_MODERATE เกณฑ์ของ รองรับเสียง THERMAL_STATUS_MODERATE

ตรวจสอบว่า dexopt ทำงานอยู่เบื้องหลังหรือไม่

งาน dexopt ในเบื้องหลังได้รับการจัดการโดยตัวจัดตารางงาน และรหัสงานคือ 27873780 หากต้องการตรวจสอบว่างานกำลังทำงานอยู่หรือไม่ ให้ใช้ API ของ Job Scheduler

// 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 ให้วางไฟล์ .prof หรือไฟล์ .dm ข้าง APK

ไฟล์ .prof ต้องเป็นไฟล์โปรไฟล์แบบไบนารี และชื่อไฟล์ต้องเป็น ชื่อไฟล์ของ APK + .prof ตัวอย่างเช่น

base.apk.prof

ชื่อไฟล์ของไฟล์ .dm ต้องเป็นชื่อไฟล์ APK ที่มี ส่วนขยายถูกแทนที่ด้วย .dm ตัวอย่างเช่น

base.dm

หากต้องการยืนยันว่ามีการใช้โปรไฟล์สำหรับ dexopt ให้เรียกใช้ 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 ใช้งานได้ บรรทัดที่สองจะเรียกใช้ dexopt ด้วย 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 (การตรวจสอบข้อผิดพลาดในโปรไฟล์ไม่ จับคู่การตรวจสอบข้อผิดพลาดของไฟล์ .dex ใน APK)