โปรไฟล์อิมเมจบูต

Android 11 ขึ้นไปรองรับการสร้างโปรไฟล์อิมเมจบูต ซึ่งจะสรุปข้อมูลเกี่ยวกับโค้ดของคอมโพเนนต์ระดับระบบต่างๆ เช่น เซิร์ฟเวอร์ระบบและคลาสพาธบูต Android Runtime (ART) ใช้ข้อมูลนี้เพื่อทำการเพิ่มประสิทธิภาพทั่วทั้งระบบ ซึ่งบางส่วนมีความสำคัญต่อประสิทธิภาพของ Android และส่งผลต่อการดำเนินการโค้ดที่ไม่ใช่โค้ดดั้งเดิมทั้งหมด (ระดับระบบหรือแอป) ในบางกรณี โปรไฟล์อิมเมจบูตอาจส่งผลต่อประสิทธิภาพการดำเนินการและการใช้หน่วยความจำในระดับเปอร์เซ็นต์ที่เป็นเลข 2 หลัก

รับข้อมูลโปรไฟล์การบูต

โปรไฟล์อิมเมจบูตได้มาจากโปรไฟล์ของแอปที่ดำเนินการระหว่างเส้นทางของผู้ใช้ที่สำคัญ (CUJ) ในการกำหนดค่าอุปกรณ์ที่เฉพาะเจาะจง ART จะบันทึก (เป็นส่วนหนึ่งของโปรไฟล์ JIT) เมธอดและคลาสเส้นทางคลาสบูตที่แอปใช้ จากนั้นบันทึกข้อมูลดังกล่าวในโปรไฟล์แอป (เช่น /data/misc/profiles/cur/0/com.android.chrome/primary.prof) โดยจะจัดทำดัชนีตามไฟล์ Dalvik EXecutable (DEX) ของเส้นทางคลาสบูต (ดูรูปแบบโปรไฟล์ ART)

ตรวจสอบโปรไฟล์แอปที่บันทึกไว้ระหว่าง CUJ เพื่อกำหนดส่วนของคลาสพาธบูตที่ใช้มากที่สุดและสำคัญที่สุดในการเพิ่มประสิทธิภาพ (ดูตัวอย่างในรูปแบบโปรไฟล์ ART) การรวมเมธอดหรือคลาสทั้งหมดจะส่งผลเสียต่อประสิทธิภาพ ดังนั้นให้มุ่งเน้นไปที่เส้นทางโค้ดที่ใช้กันโดยทั่วไปมากที่สุด ตัวอย่างเช่น หากแอปเดียวใช้เมธอดจากเส้นทางคลาสบูต เมธอดนั้นไม่ควรเป็นส่วนหนึ่งของโปรไฟล์การบูต อุปกรณ์แต่ละเครื่องควรกำหนดค่าการเลือกเมธอด/คลาสตามการเลือก CUJ และปริมาณข้อมูลที่ได้จากการทดสอบ

หากต้องการรวบรวมข้อมูลคลาสพาธสำหรับบูตจากโปรไฟล์แอปแต่ละรายการในอุปกรณ์ ให้เรียกใช้คำสั่ง adb shell cmd package snapshot-profile android คุณสามารถใช้ข้อมูลที่รวบรวมเป็นพื้นฐานสำหรับการประมวลผลและการเลือกเมธอด/คลาสได้โดยไม่ต้องรวบรวมโปรไฟล์แต่ละรายการด้วยตนเอง (แม้ว่าคุณจะทำเช่นนั้นได้หากต้องการ)

โปรไฟล์อิมเมจบูต

รูปที่ 1 กระบวนการรับโปรไฟล์อิมเมจบูต

ข้อมูลโปรไฟล์อิมเมจบูต

โปรไฟล์อิมเมจบูตมีไฟล์และข้อมูลต่อไปนี้

  • โปรไฟล์สำหรับเส้นทางคลาสบูต (frameworks/base/config/boot-image-profile.txt. กำหนดเมธอดจากเส้นทางคลาสบูตที่จะได้รับการเพิ่มประสิทธิภาพและคลาส ที่จะรวมอยู่ในอิมเมจ .art ของการบูต

  • รายการคลาสที่โหลดล่วงหน้า กำหนดคลาสที่จะโหลดล่วงหน้าใน Zygote

  • โปรไฟล์สำหรับคอมโพเนนต์เซิร์ฟเวอร์ระบบ (frameworks/base/services/art-profile) กำหนดเมธอดจากเซิร์ฟเวอร์ระบบที่จะได้รับการเพิ่มประสิทธิภาพ/คอมไพล์, คลาสที่จะรวมอยู่ในอิมเมจ .art ของการบูต และวิธีจัดวางไฟล์ DEX ที่เกี่ยวข้อง

รูปแบบโปรไฟล์ ART

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

ตัวอย่างเช่น ดัมพ์โปรไฟล์อิมเมจบูตดิบด้วยคำสั่งต่อไปนี้

adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof

ซึ่งจะสร้างเอาต์พุตที่คล้ายกับเอาต์พุตต่อไปนี้

=== Dex files  ===
=== profile ===
ProfileInfo [012]

core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
        hot methods: 520[], 611[] …
        startup methods: …
        classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
        hot methods: 520[], 521[]…
        startup methods: …
        classes: …

ในตัวอย่างข้างต้น

  • core-oj.jar ใช้โดย com.google.android.ext.services และ com.android.systemui แต่ละรายการจะแสดงแพ็กเกจ 2 รายการที่ใช้จาก core-oj.jar

  • ทั้ง 2 กระบวนการใช้เมธอดที่มีดัชนี DEX 520 แต่มีเพียงกระบวนการ systemui เท่านั้นที่ใช้เมธอดที่มีดัชนี DEX 521 เหตุผลเดียวกันนี้ใช้กับส่วนโปรไฟล์อื่นๆ (เช่น คลาสเริ่มต้น)

ระหว่างการประมวลผลข้อมูล ให้กรองเมธอด/คลาสตามการใช้งาน โดยให้ความสำคัญกับกระบวนการระดับระบบ (เช่น เซิร์ฟเวอร์ระบบหรือ systemui) หรือเมธอดที่อาจไม่ได้ใช้กันโดยทั่วไปแต่ยังคงมีความสำคัญ (เช่น เมธอดที่แอปกล้องใช้)

รูปแบบโปรไฟล์จะใส่คำอธิบายประกอบในแต่ละเมธอดด้วยแฟล็กหลายรายการ (เริ่มต้น, หลังเริ่มต้น, ความถี่, abi) ภายใน ซึ่งมีมากกว่าที่แสดงในรูปแบบการทิ้งข้อมูลเท่านั้น หากต้องการใช้สัญญาณทั้งหมด ให้แก้ไขสคริปต์ที่มีอยู่

คำแนะนำ

ใช้หลักเกณฑ์ต่อไปนี้เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด

  • ติดตั้งใช้งานการกำหนดค่าสำหรับการสร้างโปรไฟล์อิมเมจบูตในอุปกรณ์ทดสอบหลายเครื่องและรวบรวมผลลัพธ์ก่อนสร้างโปรไฟล์อิมเมจบูตสุดท้าย เครื่องมือ profman รองรับการรวบรวมและเลือกโปรไฟล์อิมเมจดิสก์บูตหลายรายการ แต่จะทำงานกับอิมเมจดิสก์บูตเวอร์ชันเดียวกันเท่านั้น (เส้นทางคลาสบูตเดียวกัน)

  • ให้ความสำคัญกับการเลือกเมธอด/คลาสที่กระบวนการของระบบใช้ เมธอด/คลาสเหล่านี้อาจใช้โค้ดที่แอปอื่นๆ ไม่ได้ใช้บ่อย แต่ยังคงมีความสำคัญในการเพิ่มประสิทธิภาพ

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

กำหนดค่าอุปกรณ์

หากต้องการเปิดใช้การกำหนดค่าโปรไฟล์การบูตผ่านพร็อพเพอร์ตี้ของระบบ ให้ใช้วิธีใดวิธีหนึ่งต่อไปนี้

  • ตัวเลือกที่ 1: ตั้งค่าพร็อพด้วยตนเอง (ใช้ได้จนกว่าจะรีบูต)

    adb root
    adb shell stop
    adb shell setprop dalvik.vm.profilebootclasspath true
    adb shell setprop dalvik.vm.profilesystemserver true
    adb shell start
  • ตัวเลือกที่ 2: ใช้ local.prop (มีผลถาวรจนกว่าจะลบไฟล์) โดยมีวิธีการดังนี้

    1. สร้างไฟล์ local.prop ที่มีเนื้อหาต่อไปนี้

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. เรียกใช้คำสั่งต่อไปนี้

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
  • ตัวเลือกที่ 3: ใช้การกำหนดค่าอุปกรณ์เพื่อตั้งค่าพร็อพเพอร์ตี้ฝั่งเซิร์ฟเวอร์ต่อไปนี้

    adb shell device_config put runtime_native_boot profilebootclasspath true
    adb shell device_config put runtime_native_boot profilesystemserver true
    

สร้างโปรไฟล์อิมเมจบูต

ใช้คำแนะนำต่อไปนี้เพื่อสร้างโปรไฟล์อิมเมจบูตพื้นฐานโดยใช้การทดสอบในอุปกรณ์เครื่องเดียว

  1. ตั้งค่าอุปกรณ์

    1. กำหนดค่าอุปกรณ์ตามที่อธิบายไว้ใน การกำหนดค่า อุปกรณ์

    2. (ไม่บังคับ) รูปแบบโปรไฟล์ใหม่ต้องใช้เวลาในการล้างและแทนที่โปรไฟล์อื่นๆ หากต้องการเร่งการรวบรวมโปรไฟล์ ให้รีเซ็ตโปรไฟล์ทั้งหมดในอุปกรณ์

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
    3. เรียกใช้ CUJ ในอุปกรณ์

  2. บันทึกโปรไฟล์โดยใช้คำสั่งต่อไปนี้

    adb shell cmd package snapshot-profile android
  3. แยกโปรไฟล์โดยใช้คำสั่งต่อไปนี้

    adb pull /data/misc/profman/android.prof
  4. ไปที่ไฟล์ JAR ของคลาสพาธสำหรับบูตโดยใช้คำสั่งต่อไปนี้

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
  5. สร้างโปรไฟล์อิมเมจบูตโดยใช้คำสั่ง profman ต่อไปนี้

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
  6. ใช้ข้อมูลเพื่อปรับแต่งคำสั่ง profman โดยใช้แฟล็กเกณฑ์การเลือกที่มีอยู่

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    หากต้องการดูรายการทั้งหมด โปรดดูหน้าความช่วยเหลือหรือซอร์สโค้ดของ profman