โปรไฟล์รูปภาพเปิดเครื่อง

Android 11 ขึ้นไปรองรับการสร้างโปรไฟล์ภาพสำหรับบูต ซึ่งจะรวมข้อมูลเกี่ยวกับโค้ดของคอมโพเนนต์ระดับระบบต่างๆ เช่น เซิร์ฟเวอร์ระบบและ classpath ของบูต 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 และปริมาณข้อมูลที่ได้จากการทดสอบ

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

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

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

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

โปรไฟล์ภาพสำหรับบูตประกอบด้วยไฟล์และข้อมูลต่อไปนี้

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

  • รายการคลาสที่โหลดล่วงหน้า กำหนดคลาสที่จะโหลดล่วงหน้าใน 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: …

ในตัวอย่างด้านบน

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

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

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

รูปแบบโปรไฟล์จะกำกับเนื้อหาแต่ละเมธอดด้วย Flag หลายรายการ (startup, post-startup, hotness, 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: ใช้การกำหนดค่าอุปกรณ์เพื่อตั้งค่าพร็อพเพอร์ตี้ฝั่งเซิร์ฟเวอร์ต่อไปนี้

    persist.device_config.runtime_native_boot.profilesystemserver
    persist.device_config.runtime_native_boot.profilebootclasspath`
    

สร้างโปรไฟล์รูปภาพสำหรับบูต

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

  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 ของ classpath ของบูตโดยใช้คำสั่งต่อไปนี้

    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 โดยใช้ Flag เกณฑ์การเลือกที่มี

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

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