ก่อนเริ่มต้น ให้ดูภาพรวมระดับสูงของบริการ 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)