การกำหนดค่า ART

หน้านี้อธิบายวิธีกำหนดค่า ART และตัวเลือกการรวบรวม หัวข้อที่กล่าวถึงในที่นี้รวมถึงการกำหนดค่าการคอมไพล์ล่วงหน้าของอิมเมจระบบ ตัวเลือกการคอมไพล์ dex2oat และวิธีแลกเปลี่ยนพื้นที่พาร์ติชั่นระบบ พื้นที่พาร์ติชั่นข้อมูล และประสิทธิภาพ

ดู ART และ Dalvik รูปแบบ Dalvik Executable และหน้าที่เหลือบน source.android.com เพื่อทำงานกับ ART ดู การตรวจสอบพฤติกรรมแอปบนรันไทม์ Android (ART) เพื่อให้แน่ใจว่าแอปของคุณทำงานอย่างถูกต้อง

ART ทำงานอย่างไร

ART ใช้การคอมไพล์ล่วงหน้า (AOT) และเริ่มต้นใน Android 7.0 (Nougat หรือ N) จะใช้การผสมผสานแบบไฮบริดของ AOT การคอมไพล์แบบทันเวลาพอดี (JIT) และการรวบรวมโปรไฟล์ที่แนะนำ การรวมกันของโหมดการคอมไพล์เหล่านี้สามารถกำหนดค่าได้ และจะกล่าวถึงในส่วนนี้ ตัวอย่างเช่น อุปกรณ์ Pixel ได้รับการกำหนดค่าด้วยโฟลว์การรวบรวมต่อไปนี้:

  1. เริ่มการติดตั้งแอปพลิเคชันโดยไม่มีการคอมไพล์ AOT ใดๆ สองสามครั้งแรกที่แอปพลิเคชันทำงาน จะถูกตีความ และเมธอดที่เรียกใช้งานบ่อยๆ จะถูกคอมไพล์ JIT
  2. เมื่อไม่ได้ใช้งานอุปกรณ์และกำลังชาร์จ daemon การคอมไพล์จะรันไปยังโค้ดที่ใช้บ่อยของ AOT ที่คอมไพล์ตามโปรไฟล์ที่สร้างขึ้นระหว่างการรันครั้งแรก
  3. การรีสตาร์ทแอปพลิเคชันครั้งถัดไปจะใช้โค้ดแนะนำโปรไฟล์และหลีกเลี่ยงการคอมไพล์ JIT ที่รันไทม์สำหรับวิธีการที่คอมไพล์แล้ว เมธอดที่ได้รับการคอมไพล์ JIT ระหว่างการรันใหม่จะถูกเพิ่มในโปรไฟล์ ซึ่งจะถูกเลือกโดย daemon การคอมไพล์

ART ประกอบด้วยคอมไพเลอร์ (เครื่องมือ dex2oat ) และรันไทม์ ( libart.so ) ที่โหลดสำหรับการเริ่มต้นไซโกต เครื่องมือ dex2oat ใช้ไฟล์ APK และสร้างไฟล์อาร์ติแฟกต์การคอมไพล์ตั้งแต่หนึ่งไฟล์ขึ้นไปที่รันไทม์โหลด จำนวนไฟล์ นามสกุล และชื่อสามารถเปลี่ยนแปลงได้ในทุกรุ่น แต่ในรุ่น Android O ไฟล์ที่สร้างขึ้นมีดังนี้:

  • .vdex : มีโค้ด DEX ที่ไม่บีบอัดของ APK พร้อมด้วยข้อมูลเมตาเพิ่มเติมเพื่อเพิ่มความเร็วในการตรวจสอบ
  • .odex : มีโค้ด AOT ที่คอมไพล์แล้วสำหรับเมธอดใน APK
  • .art (optional) : มีการแสดงแทนภายใน ART ของสตริงและคลาสบางรายการที่ระบุไว้ใน APK ซึ่งใช้เพื่อเพิ่มความเร็วในการเริ่มต้นแอปพลิเคชัน

ตัวเลือกการรวบรวม

ตัวเลือกการรวบรวมสำหรับ ART มีสองประเภท:

  1. การกำหนดค่า ROM ของระบบ: รหัสใดที่ได้รับการคอมไพล์ AOT เมื่อสร้างอิมเมจระบบ
  2. การกำหนดค่ารันไทม์: วิธีที่ ART รวบรวมและเรียกใช้แอปพลิเคชันบนอุปกรณ์

หนึ่งตัวเลือก ART หลักในการกำหนดค่าสองหมวดหมู่นี้คือ ตัวกรองคอมไพเลอร์ ตัวกรองคอมไพเลอร์ขับเคลื่อนวิธีที่ ART รวบรวมโค้ด DEX และเป็นตัวเลือกที่ส่งผ่านไปยังเครื่องมือ dex2oat เริ่มต้นใน Android O มีตัวกรองที่รองรับอย่างเป็นทางการสี่ตัว:

  • ตรวจสอบ : เรียกใช้การตรวจสอบรหัส DEX เท่านั้น
  • เร่งความเร็ว : เรียกใช้การตรวจสอบรหัส DEX และเพิ่มประสิทธิภาพคำแนะนำ DEX บางอย่างเพื่อให้ได้ประสิทธิภาพของล่ามที่ดีขึ้น
  • ความเร็ว : เรียกใช้การตรวจสอบรหัส DEX และรวบรวมวิธีการทั้งหมด AOT
  • speed-profile : เรียกใช้การตรวจสอบโค้ด DEX และวิธีคอมไพล์ AOT ที่ระบุไว้ในไฟล์โปรไฟล์

การกำหนดค่า ROM ระบบ

มีตัวเลือกบิลด์ ART มากมายสำหรับการกำหนดค่า ROM ของระบบ วิธีกำหนดค่าตัวเลือกเหล่านี้ขึ้นอยู่กับพื้นที่จัดเก็บสำหรับ /system และจำนวนแอปพลิเคชันที่ติดตั้งไว้ล่วงหน้า JAR/APK ที่คอมไพล์เป็น ROM ระบบสามารถแบ่งออกเป็นสี่ประเภท:

  • รหัสบูตคลาสพาธ: คอมไพล์ด้วยตัวกรองคอมไพเลอร์ ความเร็ว เป็นค่าเริ่มต้น
  • รหัสเซิร์ฟเวอร์ระบบ: คอมไพล์ด้วยตัวกรอง ความเร็ว คอมไพเลอร์เป็นค่าเริ่มต้น
  • แอปพลิเคชันหลักเฉพาะผลิตภัณฑ์: คอมไพล์ด้วยตัวกรอง ความเร็ว คอมไพเลอร์ตามค่าเริ่มต้น
  • แอปพลิเคชันอื่นๆ ทั้งหมด: คอมไพล์ด้วยตัวกรอง คอม ไพเลอร์แบบรวดเร็วโดยค่าเริ่มต้น

Makefile ตัวเลือก

  • WITH_DEXPREOPT
  • กำหนดว่า dex2oat ถูกเรียกใช้บนโค้ด DEX ที่ติดตั้งบนอิมเมจระบบหรือไม่ เปิดใช้งานโดยค่าเริ่มต้น

  • DONT_DEXPREOPT_PREBUILTS (ตั้งแต่ Android L)
  • การเปิดใช้งาน DONT_DEXPREOPT_PREBUILTS จะป้องกันการสร้างล่วงหน้าจากการเพิ่มประสิทธิภาพล่วงหน้า แอปเหล่านี้เป็นแอปที่มี include $(BUILD_PREBUILT) ระบุไว้ใน Android.mk เช่น Gmail การข้ามการเพิ่มประสิทธิภาพล่วงหน้าของแอปที่สร้างไว้ล่วงหน้าซึ่งมีแนวโน้มว่าจะอัปเดตผ่าน Google Play จะช่วยประหยัดพื้นที่ /system แต่จะเพิ่มเวลาในการบู๊ตครั้งแรก

  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (ตั้งแต่ Android 9)
  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER ระบุตัวกรองคอมไพเลอร์เริ่มต้นสำหรับแอปพลิเคชันที่ปรับให้เหมาะสมล่วงหน้า แอปเหล่านี้เป็นแอปที่มี include $(BUILD_PREBUILT) ระบุไว้ใน Android.mk เช่น Gmail หากไม่ระบุ ค่าเริ่มต้นจะเร่ง

  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY (ใหม่ใน Android O MR1)
  • การเปิดใช้งาน WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY จะปรับให้เหมาะสมล่วงหน้าเฉพาะ boot classpath และ jars ของเซิร์ฟเวอร์ระบบ

  • LOCAL_DEX_PREOPT
  • นอกจากนี้ยังสามารถเปิดหรือปิดการปรับให้เหมาะสมล่วงหน้าในแต่ละแอพโดยระบุตัวเลือก LOCAL_DEX_PREOPT ในคำจำกัดความของโมดูล ซึ่งจะมีประโยชน์สำหรับการปิดใช้งานการเพิ่มประสิทธิภาพล่วงหน้าของแอปที่อาจได้รับการอัปเดตจาก Google Play ทันที เนื่องจากการอัปเดตจะทำให้โค้ดที่ปรับให้เหมาะสมล่วงหน้าในอิมเมจระบบล้าสมัย สิ่งนี้ยังมีประโยชน์ในการประหยัดพื้นที่ในการอัพเกรด OTA เวอร์ชันหลัก เนื่องจากผู้ใช้อาจมีแอปเวอร์ชันใหม่กว่าในพาร์ติชั่นข้อมูลอยู่แล้ว

    LOCAL_DEX_PREOPT รองรับค่า 'จริง' หรือ 'เท็จ' เพื่อเปิดใช้งานหรือปิดใช้งานการปรับให้เหมาะสมล่วงหน้าตามลำดับ นอกจากนี้ คุณสามารถระบุ 'nostripping' ได้หากการเพิ่มประสิทธิภาพล่วงหน้าไม่ควรดึงไฟล์ classes.dex ออกจากไฟล์ APK หรือ JAR โดยปกติ ไฟล์นี้จะถูกถอดออกเนื่องจากไม่จำเป็นต้องใช้อีกต่อไปหลังจากการเพิ่มประสิทธิภาพล่วงหน้า แต่ตัวเลือกสุดท้ายนี้จำเป็นต่อการอนุญาตให้ลายเซ็น APK ของบุคคลที่สามยังคงใช้ได้

  • PRODUCT_DEX_PREOPT_BOOT_FLAGS
  • ส่งผ่านตัวเลือกไปยัง dex2oat เพื่อควบคุมวิธีการคอมไพล์อิมเมจสำหรับบูต สามารถใช้เพื่อระบุรายการคลาสรูปภาพที่กำหนดเอง รายการคลาสที่คอมไพล์ และตัวกรองคอมไพเลอร์

  • PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
  • ส่งผ่านตัวเลือกไปยัง dex2oat เพื่อควบคุมวิธีการคอมไพล์ทุกอย่างนอกเหนือจากบูตอิมเมจ

  • PRODUCT_DEX_PREOPT_MODULE_CONFIGS
  • ให้ความสามารถในการส่งผ่านตัวเลือก dex2oat สำหรับโมดูลเฉพาะและการกำหนดค่าผลิตภัณฑ์ มันถูกตั้งค่าในไฟล์ device.mk ของผลิตภัณฑ์โดย $(call add-product-dex-preopt-module-config,<modules>,<option>) โดยที่ <modules> คือรายชื่อ LOCAL_MODULE และ LOCAL_PACKAGE สำหรับ JAR และ APK ไฟล์ ตามลำดับ

  • PRODUCT_DEXPREOPT_SPEED_APPS (New in Android O)
  • รายการแอปพลิเคชันที่ได้รับการระบุว่าเป็นแกนหลักของผลิตภัณฑ์และควรคอมไพล์ด้วยตัวกรอง ความเร็ว คอมไพเลอร์ ตัวอย่างเช่น แอปแบบถาวร เช่น SystemUI จะได้รับโอกาสในการใช้การคอมไพล์แบบแนะนำโปรไฟล์ในการรีบูตครั้งถัดไปเท่านั้น ดังนั้นอาจเป็นการดีกว่าสำหรับผลิตภัณฑ์ที่จะมีแอปเหล่านี้ที่คอมไพล์ด้วย AOT เสมอ

  • PRODUCT_SYSTEM_SERVER_APPS (New in Android O)
  • รายการแอปพลิเคชันที่โหลดโดยเซิร์ฟเวอร์ระบบ แอปพลิเคชันเหล่านี้จะถูกคอมไพล์ตามค่าเริ่มต้นด้วยตัวกรอง ความเร็ว คอมไพเลอร์

  • PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD(Post Android O)
  • จะรวม ART เวอร์ชันแก้ไขข้อบกพร่องบนอุปกรณ์หรือไม่ โดยค่าเริ่มต้น สิ่งนี้จะเปิดใช้งานสำหรับ userdebug และ eng builds ลักษณะการทำงานสามารถถูกแทนที่โดยการตั้งค่าตัวเลือกให้ เป็นจริง หรือ เท็จ อย่างชัดเจน

    โดยค่าเริ่มต้น อุปกรณ์จะใช้เวอร์ชันที่ไม่มีการแก้ไขข้อบกพร่อง ( libart.so ) หากต้องการสลับ ให้ตั้งค่าคุณสมบัติของระบบ persist.sys.dalvik.vm.lib.2 เป็น libartd.so

  • WITH_DEXPREOPT_PIC (Removed in Android O)
  • ใน Android 5.1.0 ถึง Android 6.0.1 สามารถระบุ WITH_DEXPREOPT_PIC เพื่อเปิดใช้งานโค้ดที่ไม่ขึ้นกับตำแหน่ง (PIC) ด้วยเหตุนี้ โค้ดที่คอมไพล์จากอิมเมจจึงไม่จำเป็นต้องย้ายจาก /system ไปที่ /data/dalvik-cache ซึ่งช่วยประหยัดพื้นที่ในพาร์ติชั่นข้อมูล อย่างไรก็ตาม มีผลกระทบรันไทม์เล็กน้อยเนื่องจากปิดใช้งานการปรับให้เหมาะสมที่ใช้ประโยชน์จากโค้ดที่ขึ้นกับตำแหน่ง โดยทั่วไป อุปกรณ์ที่ต้องการประหยัดพื้นที่ใน /data ควรเปิดใช้งานการรวบรวม PIC

    ใน Android 7.0 การรวบรวม PIC ถูกเปิดใช้งานโดยค่าเริ่มต้น

  • WITH_DEXPREOPT_BOOT_IMG_ONLY (ถูกลบใน Android O MR1)
  • อ็อพชันนี้ถูกแทนที่ด้วย WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY ที่ preopt เซิร์ฟเวอร์ระบบ jars

การกำหนดค่าบูตคลาสพาธ

  • รายการชั้นเรียนที่โหลดไว้ล่วงหน้า
  • รายการคลาสที่โหลดไว้ล่วงหน้าเป็นรายการของคลาสที่ไซโกตเริ่มต้นเมื่อเริ่มทำงาน วิธีนี้จะช่วยไม่ให้แต่ละแอปต้องเรียกใช้ตัวเริ่มต้นคลาสเหล่านี้แยกกัน ช่วยให้เริ่มต้นเร็วขึ้นและแชร์หน้าในหน่วยความจำ ไฟล์รายการคลาสที่โหลดไว้ล่วงหน้าจะอยู่ที่ frameworks/base/config/preloaded-classes โดยค่าเริ่มต้น และมีรายการที่ปรับแต่งสำหรับการใช้งานโทรศัพท์ทั่วไป อาจแตกต่างกันไปสำหรับอุปกรณ์อื่นๆ เช่น อุปกรณ์สวมใส่ และต้องได้รับการปรับแต่งตามนั้น ระวังเมื่อปรับแต่งสิ่งนี้ การเพิ่มคลาสมากเกินไปทำให้สูญเสียหน่วยความจำเมื่อโหลดคลาสที่ไม่ได้ใช้ การเพิ่มคลาสน้อยเกินไปทำให้แต่ละแอปต้องมีสำเนาของตัวเอง ซึ่งจะทำให้หน่วยความจำเสียอีก

    ตัวอย่างการใช้งาน (ในผลิตภัณฑ์ device.mk):

    PRODUCT_COPY_FILES += <filename>:system/etc/preloaded-classes
    

    หมายเหตุ: ต้องวางบรรทัดนี้ก่อนที่จะรับค่า makefile การกำหนดค่าผลิตภัณฑ์ที่ได้รับค่าดีฟอลต์จาก: build/target/product/base.mk

  • รายการคลาสรูปภาพ
  • รายการคลาสรูปภาพคือรายการของคลาสที่ dex2oat เริ่มต้นล่วงหน้าและเก็บไว้ในไฟล์ boot.art สิ่งนี้ทำให้ไซโกตโหลดผลลัพธ์เหล่านี้จากไฟล์ boot.art เมื่อเริ่มต้น แทนที่จะรันตัวเริ่มต้นสำหรับคลาสเหล่านี้เองในระหว่างการโหลดล่วงหน้า คุณลักษณะสำคัญของสิ่งนี้คือหน้าที่โหลดจากรูปภาพและแชร์ระหว่างกระบวนการต่างๆ สามารถสะอาดได้ ทำให้สามารถเปลี่ยนหน้าเหล่านั้นได้อย่างง่ายดายในสถานการณ์ที่มีหน่วยความจำเหลือน้อย ใน L โดยค่าเริ่มต้น รายการคลาสรูปภาพใช้รายการเดียวกันกับรายการคลาสที่โหลดไว้ล่วงหน้า เริ่มต้น post-L ใน AOSP รายการคลาสรูปภาพที่กำหนดเองสามารถระบุได้โดยใช้:

    PRODUCT_DEX_PREOPT_BOOT_FLAGS
    

    ตัวอย่างการใช้งาน (ในผลิตภัณฑ์ device.mk ):

    PRODUCT_DEX_PREOPT_BOOT_FLAGS += --image-classes=<filename>
    
  • รวบรวมรายชื่อคลาส
  • ใน post-L AOSP สามารถระบุชุดย่อยของคลาสจาก boot classpath เพื่อคอมไพล์ในระหว่างการปรับแต่งล่วงหน้าโดยใช้รายการคลาสที่คอมไพล์แล้ว นี่อาจเป็นตัวเลือกที่มีประโยชน์สำหรับอุปกรณ์ที่มีพื้นที่จำกัดและไม่พอดีกับอิมเมจสำหรับบูตที่ปรับให้เหมาะสมล่วงหน้าทั้งหมด อย่างไรก็ตาม คลาสหมายเหตุที่ไม่ได้ระบุในรายการนี้จะไม่ถูกคอมไพล์ - แม้แต่ในอุปกรณ์ - และต้องได้รับการตีความ ซึ่งอาจส่งผลกระทบต่อประสิทธิภาพรันไทม์ ตามค่าเริ่มต้น dex2oat จะค้นหารายการคลาสที่คอมไพล์แล้วใน $OUT/system/etc/compiled-classes ดังนั้น device.mk จึงสามารถคัดลอกคลาสที่กำหนดเองไปยังตำแหน่งนั้นได้ ตำแหน่งไฟล์เฉพาะสามารถระบุได้โดยใช้:

    PRODUCT_DEX_PREOPT_BOOT_FLAGS
    

    ตัวอย่างการใช้งาน (ในผลิตภัณฑ์ device.mk ):

    PRODUCT_COPY_FILES += <filename>:system/etc/compiled-classes
    

    หมายเหตุ: ต้องวางบรรทัดนี้ก่อนที่จะรับค่า makefile การกำหนดค่าผลิตภัณฑ์ที่ได้รับค่าดีฟอลต์จาก: build/target/product/base.mk

การกำหนดค่ารันไทม์

จิตตัวเลือก

ตัวเลือกต่อไปนี้มีผลกับรุ่น Android ที่มีคอมไพเลอร์ ART JIT เท่านั้น

  • dalvik.vm.usejit: เปิดใช้งาน JIT หรือไม่
  • dalvik.vm.jitinitialsize (ค่าเริ่มต้น 64K): ความจุเริ่มต้นของรหัสแคช รหัสแคชจะ GC เป็นประจำและเพิ่มขึ้นหากจำเป็น
  • dalvik.vm.jitmaxsize (ค่าเริ่มต้น 64M): ความจุสูงสุดของรหัสแคช
  • dalvik.vm.jitthreshold: (default 10000) - นี่คือขีดจำกัดที่ตัวนับ "hotness" ของเมธอดต้องผ่านเพื่อที่เมธอดจะถูกคอมไพล์ JIT ตัวนับ "hotness" เป็นเมตริกภายในรันไทม์ รวมถึงจำนวนการโทร สาขาย้อนหลัง และปัจจัยอื่นๆ
  • dalvik.vm.usejitprofiles: เปิดใช้งานโปรไฟล์ JIT หรือไม่ อาจใช้แม้ว่า dalvik.vm.usejit จะเป็นเท็จ โปรดทราบว่าหากเป็นเท็จ คอมไพเลอร์ฟิลเตอร์ speed-profile จะไม่คอมไพล์วิธีการใดๆ ของ AOT และเทียบเท่ากับ quicken
  • dalvik.vm.jitprithreadweight (ค่าเริ่มต้นคือ dalvik.vm.jitthreshold / 20) - น้ำหนักของ "ตัวอย่าง" ของ JIT (ดู jitthreshold) สำหรับเธรด UI ของแอปพลิเคชัน ใช้เพื่อเพิ่มความเร็วในการรวบรวมวิธีการที่ส่งผลโดยตรงต่อประสบการณ์ของผู้ใช้เมื่อโต้ตอบกับแอป
  • dalvik.vm.jittransitionweight: (ค่าเริ่มต้นเป็น dalvik.vm.jitthreshold / 10) น้ำหนักของการเรียกใช้เมธอดที่เปลี่ยนระหว่างโค้ดคอมไพล์และล่าม วิธีนี้ช่วยให้แน่ใจว่ามีการรวบรวมวิธีการที่เกี่ยวข้องเพื่อลดช่วงการเปลี่ยนภาพให้เหลือน้อยที่สุด (ซึ่งมีราคาแพง)

ตัวเลือกตัวจัดการแพ็คเกจ

ตั้งแต่ Android 7.0 เป็นต้นไป มีวิธีทั่วไปในการระบุระดับการรวบรวม/การตรวจสอบที่เกิดขึ้นในขั้นตอนต่างๆ ระดับการคอมไพล์สามารถกำหนดคอนฟิกได้ผ่านคุณสมบัติของระบบโดยค่าเริ่มต้นคือ:

  • pm.dexopt.install=speed-profile
  • นี่คือตัวกรองการรวบรวมที่ใช้เมื่อติดตั้งแอปพลิเคชันผ่าน Google Play เราขอแนะนำให้ตั้งค่าตัวกรองการติดตั้งเป็นโปรไฟล์ความเร็วเพื่อเปิดใช้งานการใช้โปรไฟล์จากไฟล์ข้อมูลเมตาของ dex โปรดทราบว่าหากไม่มีการระบุโปรไฟล์หรือหากไม่มีโปรไฟล์ความเร็วที่ว่างเปล่าจะเทียบเท่ากับการเร่งความเร็ว

  • pm.dexopt.bg-dexopt=speed-profile
  • นี่คือตัวกรองการรวบรวมที่ใช้เมื่อไม่ได้ใช้งานอุปกรณ์ กำลังชาร์จและชาร์จเต็ม ลองใช้ตัวกรองคอมไพเลอร์ โปรไฟล์ความเร็ว เพื่อใช้ประโยชน์จากการคอมไพล์ที่แนะนำโปรไฟล์และประหยัดพื้นที่จัดเก็บ

  • pm.dexopt.boot=verify
  • ตัวกรองการรวบรวมที่ใช้หลังจากการอัพเดตแบบ over-the-air เรา ขอ แนะนำอย่างยิ่งให้ ตรวจสอบ ตัวกรองคอมไพเลอร์สำหรับตัวเลือกนี้เพื่อหลีกเลี่ยงเวลาในการบู๊ตที่นานมาก

  • pm.dexopt.first-boot=quicken
  • ตัวกรองการรวบรวมเป็นครั้งแรกที่อุปกรณ์บู๊ต ตัวกรองที่ใช้ในที่นี้จะมีผลกับเวลาบูตหลังจากโรงงานเท่านั้น เราขอแนะนำให้กรองตัวกรองอย่าง รวดเร็ว เพื่อหลีกเลี่ยงเวลานานก่อนที่ผู้ใช้จะได้ใช้โทรศัพท์เป็นครั้งแรก โปรดทราบว่าหากแอปพลิเคชันทั้งหมดใน /system ถูกคอมไพล์ด้วยตัวกรองคอมไพเลอร์ quicken หรือคอมไพล์ด้วยตัวกรอง speed -profile หรือ speed-profile แล้ว pm.dexopt.first-boot จะไม่มีผลใดๆ

ตัวเลือก Dex2oat

โปรดทราบว่าตัวเลือกเหล่านี้มีผล dex2oat ในระหว่างการคอมไพล์บนอุปกรณ์และในระหว่างการปรับให้เหมาะสมล่วงหน้า ในขณะที่ตัวเลือกส่วนใหญ่ที่กล่าวถึงข้างต้นมีผลกับการปรับให้เหมาะสมล่วงหน้าเท่านั้น

วิธีควบคุม dex2oat ขณะคอมไพล์อิมเมจสำหรับบูต:

  • dalvik.vm.image-dex2oat-Xms: ขนาดฮีปเริ่มต้น
  • dalvik.vm.image-dex2oat-Xmx: ขนาดฮีปสูงสุด
  • dalvik.vm.image-dex2oat-filter: ตัวเลือกตัวกรองคอมไพเลอร์
  • dalvik.vm.image-dex2oat-threads: จำนวนเธรดที่จะใช้

วิธีควบคุม dex2oat ในขณะที่รวบรวมทุกอย่างนอกเหนือจากอิมเมจสำหรับบูต:

  • dalvik.vm.dex2oat-Xms: ขนาดฮีปเริ่มต้น
  • dalvik.vm.dex2oat-Xmx: ขนาดฮีปสูงสุด
  • dalvik.vm.dex2oat-filter: ตัวเลือกตัวกรองคอมไพเลอร์

ในการเผยแพร่ผ่าน Android 6.0 มีตัวเลือกเพิ่มเติมหนึ่งตัวเลือกสำหรับการรวบรวมทุกอย่างนอกเหนือจากอิมเมจสำหรับบูต:

  • dalvik.vm.dex2oat-threads: จำนวนเธรดที่จะใช้

เริ่มต้นด้วย Android 6.1 สิ่งนี้กลายเป็นสองตัวเลือกเพิ่มเติมสำหรับการรวบรวมทุกอย่างนอกเหนือจากอิมเมจสำหรับบูต:

  • dalvik.vm.boot-dex2oat-threads: จำนวนเธรดที่จะใช้ในช่วงเวลาบูต
  • dalvik.vm.dex2oat-threads: จำนวนเธรดที่จะใช้หลังจากเวลาบูต

เริ่มต้นด้วย Android 7.1 มีสองตัวเลือกในการควบคุมวิธีการใช้หน่วยความจำเมื่อรวบรวมทุกอย่างนอกเหนือจากอิมเมจสำหรับบูต:

  • dalvik.vm.dex2oat-very-large: ขนาดไฟล์ dex รวมขั้นต่ำเป็นไบต์เพื่อปิดใช้งานการคอมไพล์ AOT
  • dalvik.vm.dex2oat-swap: ใช้ไฟล์สลับ dex2oat (สำหรับอุปกรณ์หน่วยความจำต่ำ)

ไม่ควรลดตัวเลือกที่ควบคุมขนาดเริ่มต้นและขนาดฮีปสูงสุดสำหรับ dex2oat เนื่องจากอาจจำกัดแอปพลิเคชันที่สามารถคอมไพล์ได้

เริ่มต้นด้วย Android 11 มีตัวเลือกความสัมพันธ์ของ CPU สามตัวเพื่ออนุญาตให้เธรดของคอมไพเลอร์ถูกจำกัดเฉพาะกลุ่มของ CPU เฉพาะ:

  • dalvik.vm.boot-dex2oat-cpu-set: CPU ที่รันเธรด dex2oat ระหว่างเวลาบูต
  • dalvik.vm.image-dex2oat-cpu-set: CPU ที่รัน dex2oat ขณะคอมไพล์บูตอิมเมจ
  • dalvik.vm.dex2oat-cpu-set: CPU ที่รันเธรด dex2oat หลังจากเวลาบูต

ควรระบุ CPU เป็นรายการรหัส CPU ที่คั่นด้วยเครื่องหมายจุลภาค ตัวอย่างเช่นหากต้องการทำงานบน dex2oat บน CPU 0-3 ให้ตั้งค่า:

dalvik.vm.dex2oat-cpu-set=0,1,2,3

เมื่อตั้งค่าคุณสมบัติความสัมพันธ์ของ CPU เราแนะนำให้จับคู่คุณสมบัติที่สอดคล้องกันสำหรับจำนวนของเธรด dex2oat เพื่อให้ตรงกับจำนวน CPU ที่เลือกเพื่อหลีกเลี่ยงหน่วยความจำที่ไม่จำเป็นและความขัดแย้งของ I/O:

dalvik.vm.dex2oat-cpu-set=0,1,2,3
dalvik.vm.dex2oat-threads=4

เริ่มต้นด้วย Android 12 ตัวเลือกต่อไปนี้ถูกเพิ่มเข้ามา:

  • dalvik.vm.ps-min-first-save-ms: เวลาที่ต้องรอรันไทม์เพื่อสร้างโปรไฟล์ของแอปพลิเคชัน ในครั้งแรกที่แอปพลิเคชันเปิดตัว
  • dalvik.vm.ps-min-save-period-ms: เวลาต่ำสุดที่ต้องรอก่อนอัปเดตโปรไฟล์ของแอป
  • dalvik.vm.systemservercompilerfilter: ตัวกรองคอมไพเลอร์ที่อุปกรณ์จะใช้เมื่อทำการคอมไพล์เซิร์ฟเวอร์ระบบใหม่

การกำหนดค่าเฉพาะ A/B

การกำหนดค่า ROM

เริ่มต้นใน Android 7.0 อุปกรณ์อาจใช้พาร์ติชันระบบสองพาร์ติชันเพื่อเปิดใช้ งานการอัปเดตระบบ A/B หากต้องการบันทึกขนาดของพาร์ติชันระบบ ไฟล์ที่เลือกไว้ล่วงหน้าสามารถติดตั้งได้ในพาร์ติชันระบบที่สองที่ไม่ได้ใช้ จากนั้นจะถูกคัดลอกไปยังพาร์ติชั่นข้อมูลในการบู๊ตครั้งแรก

ตัวอย่างการใช้งาน (ใน device-common.mk ):

PRODUCT_PACKAGES += \
     cppreopts.sh
PRODUCT_PROPERTY_OVERRIDES += \
     ro.cp_system_other_odex=1

และใน BoardConfig.mk ของอุปกรณ์:

BOARD_USES_SYSTEM_OTHER_ODEX := true

โปรดทราบว่ารหัสบูตคลาสพาธ รหัสเซิร์ฟเวอร์ระบบ และแอปพลิเคชันหลักเฉพาะผลิตภัณฑ์จะคอมไพล์ไปยังพาร์ติชันระบบเสมอ โดยค่าเริ่มต้น แอปพลิเคชันอื่นๆ ทั้งหมดจะได้รับการคอมไพล์ไปยังพาร์ติชันระบบที่สองที่ไม่ได้ใช้ สามารถควบคุมได้ด้วย SYSTEM_OTHER_ODEX_FILTER ซึ่งมีค่าเป็นค่าเริ่มต้น:

SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%

พื้นหลัง dexopt OTA

ด้วยอุปกรณ์ที่เปิดใช้งาน A/B แอปพลิเคชันสามารถคอมไพล์ในพื้นหลังเพื่ออัปเดตเป็นอิมเมจระบบใหม่ ดู การคอมไพล์แอปในพื้นหลัง เพื่อเลือกรวมสคริปต์การคอมไพล์และไบนารีในอิมเมจระบบ ตัวกรองการคอมไพล์ที่ใช้สำหรับการคอมไพล์นี้ถูกควบคุมด้วย:

pm.dexopt.ab-ota=speed-profile

เราขอแนะนำให้ใช้ โปรไฟล์ความเร็ว เพื่อใช้ประโยชน์จากการรวบรวมโปรไฟล์ที่แนะนำและประหยัดพื้นที่จัดเก็บ