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

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

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

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

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

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

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

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 ตัวอย่างนี้ โปรดทราบว่าเครื่องมือสํารวจคอมไพเลอร์รองรับเฉพาะรูปแบบโปรไฟล์ ART ที่มนุษย์อ่านได้ (HRF) จึงไม่รองรับไวลด์การ์ด

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

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

[FLAGS][CLASS_DESCRIPTOR]->[METHOD_SIGNATURE]

กฎระดับชั้นใช้รูปแบบต่อไปนี้

[CLASS_DESCRIPTOR]

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

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

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

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

เมธอดที่มี Flag 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

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

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

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

กฎโปรไฟล์พื้นฐานรองรับประเภทต่อไปนี้ ดูรายละเอียดเกี่ยวกับประเภทเหล่านี้ได้ที่รูปแบบ Dalvik Executable (DEX)

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

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

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

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

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

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

    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

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

    adb shell am broadcast -a androidx.profileinstaller.action.SKIP_FILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver
  3. เรียกใช้แอปและไปยังส่วนต่างๆ ของเส้นทางของผู้ใช้ที่สําคัญซึ่งคุณต้องการรวบรวมโปรไฟล์ด้วยตนเอง
  4. แจ้งให้ ART ถ่ายโอนโปรไฟล์ หาก APK ของคุณมีทรัพยากร Dependency ของไลบรารีเครื่องมือติดตั้งโปรไฟล์ Jetpack ให้ใช้ไลบรารีดังกล่าวเพื่อถ่ายโอนโปรไฟล์ ดังนี้

    adb shell am broadcast -a androidx.profileinstaller.action.SAVE_FILE $PACKAGE_NAME/androidx.profileinstaller.ProfileInstallReceiver
    adb shell am force-stop $PACKAGE_NAME
    หากไม่ได้ใช้โปรแกรมติดตั้งโปรไฟล์ ให้ถ่ายโอนโปรไฟล์ด้วยตนเองในโปรแกรมจำลองโดยใช้คำสั่งต่อไปนี้

    adb root
    adb shell killall -s SIGUSR1 $PACKAGE_NAME
    adb shell am force-stop $PACKAGE_NAME
  5. รออย่างน้อย 5 วินาทีเพื่อให้การสร้างโปรไฟล์เสร็จสมบูรณ์
  6. แปลงโปรไฟล์ฐานสองที่สร้างขึ้นเป็นข้อความ

    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

    ทํา Conversion

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

  7. ใช้ 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 ทําเมื่อสร้างโปรไฟล์พื้นฐานเวอร์ชันไบนารีแบบกะทัดรัด

Profgen-cli ช่วยในการคอมไพล์โปรไฟล์ การตรวจสอบตนเอง และการแปลงโปรไฟล์ 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

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

นอกจากนี้ 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

แผนที่การสร้างความสับสน

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

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

โดยทั่วไปแล้ว โปรไฟล์พื้นฐานจะส่งไปยังอุปกรณ์ด้วยวิธีใดวิธีหนึ่งต่อไปนี้

ใช้ 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 ในอุปกรณ์

โหลดโปรไฟล์พื้นฐานจากภายนอก

ส่วนนี้จะอธิบายวิธีติดตั้งโปรไฟล์พื้นฐานจาก 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 ส่วนใหญ่ที่มีโปรไฟล์พื้นฐาน ซึ่งอยู่ในแอปประมาณ 77,000 แอปจาก 450,000 แอปใน Play แต่มีอยู่ใน APK เกือบทุกแอปที่ใช้ Compose เนื่องจากไลบรารีสามารถระบุโปรไฟล์ได้โดยไม่ต้องประกาศการพึ่งพา ProfileInstaller การเพิ่มทรัพยากรในไลบรารีแต่ละรายการที่มีโปรไฟล์จะมีผลตั้งแต่ 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

การยืนยัน

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

แสดงเนื้อหาของโปรไฟล์ไบนารี

หากต้องการสํารวจเนื้อหาของโปรไฟล์พื้นฐานเวอร์ชันไบนารีแบบกะทัดรัด ให้ใช้ตัวเลือก 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 แต่ในกรณีส่วนใหญ่ คุณควรเปิดใช้โหมดเข้มงวดไว้

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