สร้างและวัดโปรไฟล์พื้นฐานด้วยตนเอง

เราขอแนะนำอย่างยิ่งให้สร้างกฎโปรไฟล์โดยอัตโนมัติโดยใช้ไลบรารี Jetpack Macrobenchmark เพื่อลดการทำงานด้วยตนเองและเพิ่มความสามารถในการปรับขนาดโดยทั่วไป อย่างไรก็ตาม คุณสามารถสร้างและวัดกฎโปรไฟล์ในแอปด้วยตนเองได้

กำหนดกฎโปรไฟล์ด้วยตนเอง

คุณสามารถกำหนดกฎโปรไฟล์ด้วยตนเองในแอปหรือโมดูลไลบรารีได้โดยสร้างไฟล์ชื่อ baseline-prof.txt ซึ่งอยู่ในไดเรกทอรี src/main ซึ่งเป็นโฟลเดอร์เดียวกับที่มีไฟล์ AndroidManifest.xml

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

ไวยากรณ์สำหรับกฎเหล่านี้เป็นซูเปอร์เซ็ตของรูปแบบโปรไฟล์ ART ที่มนุษย์อ่านได้ (HRF) เมื่อใช้ adb shell profman --dump-classes-and-methods ไวยากรณ์จะคล้ายกับไวยากรณ์สำหรับข้อบ่งชี้และลายเซ็น แต่จะอนุญาตให้ใช้อักขระไวลด์การ์ดเพื่อลดความซับซ้อนของกระบวนการเขียนกฎ

ตัวอย่างต่อไปนี้แสดงกฎโปรไฟล์พื้นฐานบางส่วนที่รวมอยู่ในไลบรารี Jetpack Compose

HSPLandroidx/compose/runtime/ComposerImpl;->updateValue(Ljava/lang/Object;)V
HSPLandroidx/compose/runtime/ComposerImpl;->updatedNodeCount(I)I
HLandroidx/compose/runtime/ComposerImpl;->validateNodeExpected()V
PLandroidx/compose/runtime/CompositionImpl;->applyChanges()V
HLandroidx/compose/runtime/ComposerKt;->findLocation(Ljava/util/List;I)I
Landroidx/compose/runtime/ComposerImpl;

คุณลองแก้ไขกฎโปรไฟล์ได้ในโปรเจ็กต์ Compiler Explorer ตัวอย่างนี้ โปรดทราบว่า Compiler Explorer รองรับเฉพาะรูปแบบโปรไฟล์ ART ที่มนุษย์อ่านได้ (HRF) เท่านั้น จึงไม่รองรับไวลด์การ์ด

ไวยากรณ์ของกฎ

กฎเหล่านี้ใช้รูปแบบใดรูปแบบหนึ่งจาก 2 รูปแบบเพื่อกำหนดเป้าหมายเมธอดหรือคลาส ดังนี้

[FLAGS][CLASS_DESCRIPTOR]->[METHOD_SIGNATURE]

กฎคลาสจะใช้รูปแบบต่อไปนี้

[CLASS_DESCRIPTOR]

ดูคำอธิบายโดยละเอียดได้ในตารางต่อไปนี้

ไวยากรณ์ คำอธิบาย
FLAGS แสดงอักขระ H, S และ P อย่างน้อย 1 ตัวเพื่อระบุว่าต้องแจ้งว่าเมธอดนี้เป็น Hot, Startup หรือ Post Startup เกี่ยวกับประเภทการเริ่มต้นระบบหรือไม่

เมธอดที่มีแฟล็ก H บ่งบอกว่าเป็นเมธอด "ยอดนิยม" ซึ่งหมายความว่ามีการเรียกใช้เมธอดหลายครั้งตลอดอายุการใช้งานของแอป

เมธอดที่มีแฟล็ก S บ่งบอกว่าเป็นเมธอดที่เรียกใช้เมธอดระหว่างการเริ่มต้นระบบ

เมธอดที่มีแฟล็ก P บ่งบอกว่าเป็นเมธอดที่เรียกใช้หลังจากเริ่มต้นระบบ

คลาสที่อยู่ในไฟล์นี้บ่งบอกว่ามีการใช้งานระหว่างการเริ่มต้นระบบ และต้องจัดสรรไว้ล่วงหน้าในฮีปเพื่อหลีกเลี่ยงค่าใช้จ่ายในการโหลดคลาส คอมไพเลอร์ ART ใช้กลยุทธ์การเพิ่มประสิทธิภาพที่หลากหลาย เช่น การคอมไพล์ AOT ของเมธอดเหล่านี้และการเพิ่มประสิทธิภาพเลย์เอาต์ในไฟล์ AOT ที่สร้างขึ้น
CLASS_DESCRIPTOR ข้อบ่งชี้สำหรับคลาสของเมธอดที่กำหนดเป้าหมาย เช่น androidx.compose.runtime.SlotTable มีข้อบ่งชี้เป็น Landroidx/compose/runtime/SlotTable; ระบบจะใส่ L ไว้ข้างหน้าตามรูปแบบ Dalvik Executable (DEX)
METHOD_SIGNATURE ซิกเนเจอร์ของเมธอด ซึ่งรวมถึงชื่อ ประเภทพารามิเตอร์ และประเภทการแสดงผลของเมธอด ตัวอย่างเช่น

// LayoutNode.kt

fun isPlaced():Boolean {
// ...
}

ใน LayoutNode มีลายเซ็น isPlaced()Z

รูปแบบเหล่านี้สามารถมีไวลด์การ์ดเพื่อให้กฎเดียวครอบคลุมเมธอดหรือคลาสหลายรายการ หากต้องการความช่วยเหลือแบบมีคำแนะนำเมื่อเขียนด้วยไวยากรณ์ของกฎใน Android Studio โปรดดูปลั๊กอิน Android Baseline Profiles

ตัวอย่างของกฎไวลด์การ์ดอาจมีลักษณะดังนี้

HSPLandroidx/compose/ui/layout/**->**(**)**

ประเภทที่รองรับในกฎโปรไฟล์พื้นฐาน

กฎ Baseline Profile รองรับประเภทต่อไปนี้ ดูรายละเอียดเกี่ยวกับประเภทเหล่านี้ได้ที่รูปแบบ Dalvik Executable (DEX)

ตัวละคร ประเภท คำอธิบาย
B ไบต์ ไบต์ที่มีเครื่องหมาย
C char Code Point ของอักขระ Unicode ที่เข้ารหัสใน UTF-16
D คู่ ค่าจุดลอยตัวที่มีความแม่นยำแบบ Double
F float ค่าจุดลอยตัวความแม่นยำเดี่ยว
I Int จำนวนเต็ม
J ยาว จำนวนเต็มแบบยาว
S วิดีโอสั้น Shorts ที่ลงชื่อเข้าใช้
V void เป็นโมฆะ
Z บูลีน จริงหรือเท็จ
L (ชื่อชั้นเรียน) การอ้างอิง อินสแตนซ์ของชื่อคลาส

นอกจากนี้ ไลบรารียังกำหนดกฎที่แพ็กเกจในอาร์ติแฟกต์ AAR ได้ด้วย เมื่อคุณสร้าง APK เพื่อรวมอาร์ติแฟกต์เหล่านี้ ระบบจะผสานกฎเข้าด้วยกัน ซึ่งคล้ายกับวิธีการผสานไฟล์ Manifest และคอมไพล์เป็นโปรไฟล์ ART แบบไบนารีขนาดกะทัดรัดซึ่งเจาะจงสำหรับ APK

ART จะใช้ประโยชน์จากโปรไฟล์นี้เมื่อใช้ APK ในอุปกรณ์เพื่อคอมไพล์ AOT ของแอปบางส่วนที่เฉพาะเจาะจง ณ เวลาติดตั้งใน Android 9 (ระดับ API 28) หรือ Android 7 (ระดับ API 24) เมื่อใช้ ProfileInstaller

รวบรวมโปรไฟล์พื้นฐานด้วยตนเอง

คุณสามารถสร้างโปรไฟล์พื้นฐานด้วยตนเองโดยไม่ต้องตั้งค่าไลบรารี Macrobenchmark และสร้างการทำงานอัตโนมัติของ UI สำหรับเส้นทางของผู้ใช้ที่สำคัญ แม้ว่าเราจะแนะนำให้ใช้ Macrobenchmark แต่ก็อาจทำไม่ได้เสมอไป เช่น หากใช้ระบบบิลด์ที่ไม่ใช่ Gradle คุณจะใช้ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานไม่ได้ ในกรณีเช่นนี้ คุณสามารถรวบรวมกฎโปรไฟล์พื้นฐานด้วยตนเองได้ ซึ่งจะทำได้ง่ายขึ้นมากหากคุณใช้อุปกรณ์หรือโปรแกรมจำลองที่ใช้ API 34 ขึ้นไป แม้ว่าจะยังคงทำได้ด้วยระดับ API ที่ต่ำกว่า แต่ก็ต้องมีสิทธิ์เข้าถึงระดับรูท และคุณต้องใช้โปรแกรมจำลองที่เรียกใช้รูปภาพ AOSP คุณสามารถรวบรวมกฎได้โดยตรงโดยทำดังนี้

  1. ติดตั้งแอปเวอร์ชันที่เผยแพร่ในอุปกรณ์ทดสอบ ประเภทบิลด์ของแอปต้องไม่ได้รับการเพิ่มประสิทธิภาพด้วย R8 และต้องไม่แก้ไขข้อบกพร่องได้เพื่อบันทึกโปรไฟล์ที่ระบบบิลด์ใช้ได้
  2. ปิดใช้การติดตั้งโปรไฟล์และปิดแอป

    หาก APK ของคุณขึ้นอยู่กับไลบรารี Jetpack Profile Installer ไลบรารีจะบูตสแตรปโปรไฟล์ในการเปิด APK ครั้งแรก ซึ่งอาจรบกวนกระบวนการสร้างโปรไฟล์ ดังนั้นให้ปิดใช้ด้วยคำสั่งต่อไปนี้

    adb shell am broadcast -a androidx.profileinstaller.action.SKIP_FILE WRITE_SKIP_FILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver
  3. รีเซ็ตการคอมไพล์แอปและล้างโปรไฟล์ทั้งหมด

    API 34 ขึ้นไป

    adb shell cmd package compile -f -m verify $PACKAGE_NAME
    adb shell pm art clear-app-profiles $PACKAGE_NAME

    API ระดับ 33 และต่ำกว่า

    adb root
    adb shell cmd package compile --reset $PACKAGE_NAME

  4. เรียกใช้แอปและไปยังเส้นทางของผู้ใช้ที่สําคัญซึ่งคุณต้องการรวบรวมโปรไฟล์ด้วยตนเอง

  5. รออย่างน้อย 5 วินาทีเพื่อให้โปรไฟล์เสถียร

  6. ดำเนินการบันทึกและรอให้การบันทึกเสร็จสมบูรณ์ หาก APK ของคุณขึ้นอยู่กับไลบรารี Jetpack Profile Installer ให้ใช้ไลบรารีดังกล่าวเพื่อดัมป์โปรไฟล์ ดังนี้

    adb shell am broadcast -a androidx.profileinstaller.action.SAVE_PROFILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver
    sleep 1 # wait 1 second
    adb shell am force-stop $PACKAGE_NAME
    หากไม่ได้ใช้ Profile Installer ให้ดัมพ์โปรไฟล์ด้วยตนเองในโปรแกรมจำลองโดยใช้คำสั่งต่อไปนี้

    adb root
    adb shell killall -s SIGUSR1 $PACKAGE_NAME
    sleep 1 # wait 1 second
    adb shell am force-stop $PACKAGE_NAME

  7. แปลงโปรไฟล์ไบนารีที่สร้างขึ้นเป็นข้อความโดยทำดังนี้

    API 34 ขึ้นไป

    adb shell pm dump-profiles --dump-classes-and-methods $PACKAGE_NAME

    API ระดับ 33 และต่ำกว่า

    ตรวจสอบว่ามีการสร้างโปรไฟล์อ้างอิงหรือโปรไฟล์ปัจจุบันแล้วหรือยัง โปรไฟล์อ้างอิงจะอยู่ในตำแหน่งต่อไปนี้

    /data/misc/profiles/ref/$$PACKAGE_NAME/primary.prof

    โปรไฟล์ปัจจุบันอยู่ในตำแหน่งต่อไปนี้

    /data/misc/profiles/cur/0/$PACKAGE_NAME/primary.prof

    ระบุตำแหน่งของ APK โดยทำดังนี้

    adb root
    adb shell pm path $PACKAGE_NAME

    ดำเนินการแปลง:

    adb root
    adb shell profman --dump-classes-and-methods --profile-file=$PROFILE_PATH --apk=$APK_PATH > /data/misc/profman/$PACKAGE_NAME-primary.prof.txt

  8. ใช้ adb เพื่อดึงข้อมูลโปรไฟล์ที่ดัมพ์จากอุปกรณ์

    adb pull /data/misc/profman/$PACKAGE_NAME-primary.prof.txt PATH_TO_APP_MODULE/src/main/

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

วัดการปรับปรุงแอปด้วยตนเอง

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

PACKAGE_NAME=com.example.app
# Force Stop App
adb shell am force-stop $PACKAGE_NAME
# Reset compiled state
adb shell cmd package compile --reset $PACKAGE_NAME
# Measure App startup
# This corresponds to `Time to initial display` metric.
adb shell am start-activity -W -n $PACKAGE_NAME/.ExampleActivity \
 | grep "TotalTime"

ถัดไป ให้ไซด์โหลดโปรไฟล์พื้นฐาน

# Unzip the Release APK first.
unzip release.apk
# Create a ZIP archive.
# The name should match the name of the APK.
# Copy `baseline.prof{m}` and rename it `primary.prof{m}`.
cp assets/dexopt/baseline.prof primary.prof
cp assets/dexopt/baseline.profm primary.profm
# Create an archive.
zip -r release.dm primary.prof primary.profm
# Confirm that release.dm only contains the two profile files:
unzip -l release.dm
# Archive:  release.dm
#   Length      Date    Time    Name
# ---------  ---------- -----   ----
#      3885  1980-12-31 17:01   primary.prof
#      1024  1980-12-31 17:01   primary.profm
# ---------                     -------
#                               2 files
# Install APK + Profile together.
adb install-multiple release.apk release.dm

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

# Check dexopt state.
adb shell dumpsys package dexopt | grep -A 1 $PACKAGE_NAME

เอาต์พุตต้องระบุว่าคอมไพล์แพ็กเกจแล้ว ดังนี้

[com.example.app]
  path: /data/app/~~YvNxUxuP2e5xA6EGtM5i9A==/com.example.app-zQ0tkJN8tDrEZXTlrDUSBg==/base.apk
  arm64: [status=speed-profile] [reason=install-dm]

ตอนนี้คุณสามารถวัดประสิทธิภาพการเริ่มต้นแอปได้เหมือนเดิม แต่ไม่ต้องรีเซ็ตสถานะที่คอมไพล์แล้ว ตรวจสอบว่าคุณไม่ได้รีเซ็ตสถานะที่คอมไพล์แล้วสำหรับแพ็กเกจ

# Force stop app
adb shell am force-stop $PACKAGE_NAME
# Measure app startup
adb shell am start-activity -W -n $PACKAGE_NAME/.ExampleActivity \
 | grep "TotalTime"

โปรไฟล์พื้นฐานและ profgen

ส่วนนี้จะอธิบายสิ่งที่เครื่องมือ profgen ทำเมื่อสร้างเวอร์ชันไบนารีแบบกะทัดรัดของ Baseline Profile

Profgen-cli ช่วยในการคอมไพล์โปรไฟล์ การตรวจสอบภายใน และการทำ Transpile โปรไฟล์ ART เพื่อให้ติดตั้งในอุปกรณ์ที่ทำงานด้วยระบบ Android ได้ ไม่ว่าจะเป็น SDK เวอร์ชันเป้าหมายใดก็ตาม

Profgen-cli เป็น CLI ที่คอมไพล์ HRF ของโปรไฟล์พื้นฐานเป็นรูปแบบที่คอมไพล์แล้ว นอกจากนี้ CLI ยังมาพร้อมกับที่เก็บ cmdline-tools ซึ่งเป็นส่วนหนึ่งของ Android SDK ด้วย

ฟีเจอร์เหล่านี้พร้อมใช้งานในสาขา studio-main

➜ ../cmdline-tools/latest/bin
apkanalyzer
avdmanager
lint
profgen
retrace
screenshot2
sdkmanager

สร้างโปรไฟล์ไบนารีแบบกะทัดรัดด้วย Profgen-cli

คำสั่งที่ใช้ได้กับ Profgen-cli ได้แก่ bin, validate และ dumpProfile หากต้องการดูคำสั่งที่ใช้ได้ ให้ใช้ profgen --help ดังนี้

➜  profgen --help
Usage: profgen options_list
Subcommands:
    bin - Generate Binary Profile
    validate - Validate Profile
    dumpProfile - Dump a binary profile to a HRF

Options:
    --help, -h -> Usage info

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

profgen bin ./baseline-prof.txt \
  --apk ./release.apk \
  --map ./obfuscation-map.txt \
  --profile-format v0_1_0_p \
  --output ./baseline.prof \

หากต้องการดูตัวเลือกที่ใช้ได้ ให้ใช้ profgen bin options_list ดังนี้

Usage: profgen bin options_list
Arguments:
    profile -> File path to Human Readable profile { String }
Options:
    --apk, -a -> File path to apk (always required) { String }
    --output, -o -> File path to generated binary profile (always required)
    --map, -m -> File path to name obfuscation map { String }
    --output-meta, -om -> File path to generated metadata output { String }
    --profile-format, -pf [V0_1_0_P] -> The ART profile format version
      { Value should be one of [
         v0_1_5_s, v0_1_0_p, v0_0_9_omr1, v0_0_5_o, v0_0_1_n
        ]
      }
    --help, -h -> Usage info

อาร์กิวเมนต์แรกแสดงเส้นทางไปยัง HRF ของ baseline-prof.txt

นอกจากนี้ Profgen-cli ยังต้องใช้เส้นทางไปยังบิลด์ที่เผยแพร่ของ APK และการแมปการสร้างความสับสนที่ใช้เพื่อสร้างความสับสนให้กับ APK เมื่อใช้ R8 หรือ Proguard วิธีนี้ช่วยให้ profgen สามารถแปลสัญลักษณ์ต้นทางใน HRF เป็นชื่อที่สร้างความสับสนที่เกี่ยวข้องเมื่อสร้างโปรไฟล์ที่คอมไพล์แล้ว

เนื่องจากรูปแบบโปรไฟล์ ART ไม่สามารถส่งต่อหรือเข้ากันได้แบบย้อนหลัง ให้ระบุรูปแบบโปรไฟล์เพื่อให้ profgen จัดแพ็กเกจข้อมูลเมตาของโปรไฟล์ (profm) ที่คุณสามารถใช้เพื่อแปลงรูปแบบโปรไฟล์ ART หนึ่งเป็นอีกรูปแบบหนึ่งได้เมื่อจำเป็น

รูปแบบโปรไฟล์และเวอร์ชันแพลตฟอร์ม

ตัวเลือกต่อไปนี้จะใช้ได้เมื่อเลือกรูปแบบโปรไฟล์

รูปแบบโปรไฟล์ เวอร์ชันของแพลตฟอร์ม ระดับ API
v0_1_5_s Android S ขึ้นไป 31+
v0_1_0_p Android P, Q และ R 28-30
v0_0_9_omr1 Android O MR1 27
v0_0_5_o Android O 26
v0_0_1_n Android N 24-25

คัดลอกไฟล์เอาต์พุต baseline.prof และ baseline.profm ไปยังโฟลเดอร์ assets หรือ dexopt ใน APK

แผนที่การปรับให้ยากต่อการอ่าน (Obfuscation)

คุณต้องระบุแผนที่การสร้างความสับสนก็ต่อเมื่อ HRF ใช้สัญลักษณ์ต้นทางเท่านั้น หาก HRF สร้างขึ้นจากบิลด์ที่เผยแพร่ซึ่งมีการสร้างความสับสนอยู่แล้วและไม่จำเป็นต้องมีการแมป คุณสามารถข้ามตัวเลือกนั้นและคัดลอกเอาต์พุตไปยังโฟลเดอร์ assets หรือ dexopt ได้

การติดตั้งโปรไฟล์พื้นฐานแบบดั้งเดิม

โดยปกติแล้ว ระบบจะส่ง Baseline Profile ไปยังอุปกรณ์ด้วยวิธีใดวิธีหนึ่งจาก 2 วิธี

ใช้ install-multiple กับ DexMetadata

ในอุปกรณ์ที่ใช้ API 28 ขึ้นไป ไคลเอ็นต์ Play จะดาวน์โหลด APK และเพย์โหลด DexMetadata (DM) สำหรับเวอร์ชัน APK ที่กำลังติดตั้ง DM มีข้อมูลโปรไฟล์ที่ส่งไปยังเครื่องมือจัดการแพ็กเกจในอุปกรณ์

APK และ DM จะได้รับการติดตั้งเป็นส่วนหนึ่งของเซสชันการติดตั้งเดียวโดยใช้คำสั่งต่อไปนี้

adb install-multiple base.apk base.dm

Jetpack ProfileInstaller

ในอุปกรณ์ที่ใช้ระดับ API 29 ขึ้นไป ไลบรารี Jetpack ProfileInstaller จะมีกลไกทางเลือกในการติดตั้งโปรไฟล์ที่รวมอยู่ใน assetsหรือ dexopt หลังจากติดตั้ง APK ในอุปกรณ์แล้ว ProfileInstaller จะถูกเรียกใช้โดย ProfileInstallReceiver หรือโดยแอปโดยตรง

ไลบรารี ProfileInstaller จะแปลงโปรไฟล์ตามเวอร์ชัน SDK ของอุปกรณ์เป้าหมาย และคัดลอกโปรไฟล์ไปยังไดเรกทอรี cur ในอุปกรณ์ (ไดเรกทอรีสำหรับการทดลองใช้เฉพาะแพ็กเกจสำหรับโปรไฟล์ ART ในอุปกรณ์)

เมื่ออุปกรณ์ไม่มีการใช้งาน โปรไฟล์จะถูกเลือกโดยกระบวนการที่เรียกว่า bg-dexopt ในอุปกรณ์

ไซด์โหลดโปรไฟล์พื้นฐาน

ส่วนนี้จะอธิบายวิธีติดตั้ง Baseline Profile ที่มี APK

ประกาศด้วย androidx.profileinstaller

ในอุปกรณ์ที่ใช้ API 24 ขึ้นไป คุณสามารถประกาศคำสั่งเพื่อติดตั้งโปรไฟล์ได้ดังนี้

# Broadcast the install profile command - moves binary profile from assets
#     to a location where ART uses it for the next compile.
#     When successful, the following command prints "1":
adb shell am broadcast \
    -a androidx.profileinstaller.action.INSTALL_PROFILE \
    <pkg>/androidx.profileinstaller.ProfileInstallReceiver

# Kill the process
am force-stop <pkg>

# Compile the package based on profile
adb shell cmd package compile -f -m speed-profile <pkg>

ProfileInstaller ไม่ปรากฏใน APK ส่วนใหญ่ที่มีโปรไฟล์พื้นฐาน ซึ่งมีอยู่ในแอปประมาณ 7.7 หมื่นแอปจาก 4.5 แสนแอปใน Play แม้ว่าจะปรากฏใน APK ทุกรายการที่ใช้ Compose อย่างมีประสิทธิภาพก็ตาม เนื่องจากไลบรารีสามารถจัดทำโปรไฟล์ได้โดยไม่ต้องประกาศทรัพยากร Dependency ใน ProfileInstaller การเพิ่มทรัพยากร Dependency ในแต่ละไลบรารีที่มีโปรไฟล์จะมีผลตั้งแต่ Jetpack เป็นต้นไป

ใช้ install-multiple กับ profgen หรือ DexMetaData

ในอุปกรณ์ที่ใช้ API 28 ขึ้นไป คุณสามารถไซด์โหลดโปรไฟล์พื้นฐานได้โดยไม่ต้องมีไลบรารี ProfileInstaller ในแอป

โดยใช้ Profgen-cli ดังนี้

profgen extractProfile \
        --apk app-release.apk \
        --output-dex-metadata app-release.dm \
        --profile-format V0_1_5_S # Select based on device and the preceding table.

# Install APK and the profile together
adb install-multiple appname-release.apk appname-release.dm

หากต้องการรองรับ APK แยก ให้เรียกใช้ขั้นตอนการแยกโปรไฟล์ก่อนหน้า 1 ครั้งต่อ APK เมื่อติดตั้ง ให้ส่ง APK แต่ละรายการและไฟล์ .dm ที่เกี่ยวข้อง โดยตรวจสอบว่าชื่อ APK และ .dm ตรงกัน

adb install-multiple appname-base.apk appname-base.dm \
appname-split1.apk appname-split1.dm

การยืนยัน

หากต้องการยืนยันว่าติดตั้งโปรไฟล์อย่างถูกต้องแล้ว คุณสามารถใช้ขั้นตอนจากวัดการปรับปรุงแอปด้วยตนเอง

ดัมพ์เนื้อหาของโปรไฟล์ไบนารี

หากต้องการตรวจสอบเนื้อหาของ Baseline Profile เวอร์ชันไบนารีแบบกะทัดรัด ให้ใช้ตัวเลือก Profgen-cli dumpProfile ดังนี้

Usage: profgen dumpProfile options_list
Options:
    --profile, -p -> File path to the binary profile (always required)
    --apk, -a -> File path to apk (always required) { String }
    --map, -m -> File path to name obfuscation map { String }
    --strict, -s [true] -> Strict mode
    --output, -o -> File path for the HRF (always required) { String }
    --help, -h -> Usage info

dumpProfile ต้องใช้ APK เนื่องจากรูปแบบไบนารีแบบกะทัดรัดจะจัดเก็บเฉพาะออฟเซ็ต DEX เท่านั้น จึงต้องใช้ APK เพื่อสร้างชื่อคลาสและเมธอดใหม่

โหมดเข้มงวดจะเปิดใช้โดยค่าเริ่มต้น และจะตรวจสอบความเข้ากันได้ของโปรไฟล์กับไฟล์ DEX ใน APK หากคุณพยายามแก้ไขข้อบกพร่องของโปรไฟล์ที่สร้างโดยเครื่องมืออื่น คุณอาจพบความล้มเหลวด้านความเข้ากันได้ซึ่งทำให้คุณไม่สามารถดัมพ์เพื่อตรวจสอบได้ ในกรณีดังกล่าว คุณสามารถปิดใช้โหมดเข้มงวดด้วย --strict false อย่างไรก็ตาม ในกรณีส่วนใหญ่ คุณควรเปิดใช้โหมดเข้มงวดไว้

แผนที่การสร้างความสับสนเป็นตัวเลือกที่ไม่บังคับ แต่หากระบุไว้จะช่วยแมปสัญลักษณ์ที่สร้างความสับสนใหม่เป็นเวอร์ชันที่มนุษย์อ่านได้เพื่อให้ใช้งานง่าย