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

เราขอแนะนำอย่างยิ่งให้สร้างกฎโปรไฟล์โดยอัตโนมัติโดยใช้ไลบรารี 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 แสดงว่าเป็นเมธอด "Hot" ซึ่งหมายความว่ามีการเรียกใช้หลายครั้งในระหว่างอายุการใช้งานของแอป

เมธอดที่มีแฟล็ก 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

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

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

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

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

อักขระ ประเภท คำอธิบาย
B ไบต์ ไบต์แบบมีเครื่องหมาย
C char Code Point ของอักขระ Unicode ที่เข้ารหัสใน UTF-16
D คู่ ค่าจุดลอยตัวแบบความแม่นยำ 2 เท่า
F float ค่าจุดลอยตัวแบบความแม่นยำเดียว
I Int จำนวนเต็ม
J ยาว จำนวนเต็มยาว
S วิดีโอสั้น วิดีโอสั้นแบบมีเครื่องหมาย
V void 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 มีทรัพยากร Dependency กับไลบรารี 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 ทำเมื่อสร้างโปรไฟล์พื้นฐานเวอร์ชันไบนารีขนาดกะทัดรัด

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

อาร์กิวเมนต์แรกแสดงถึงเส้นทางไปยัง 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

แผนที่การทำให้สับสน

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

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

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

ใช้ install-multiple กับ DexMetadata

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

ระบบจะติดตั้ง 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 เนื่องจากไลบรารีสามารถให้โปรไฟล์ได้โดยไม่ต้องประกาศทรัพยากร 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

การยืนยัน

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

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

หากต้องการตรวจสอบเนื้อหาของโปรไฟล์พื้นฐานเวอร์ชันไบนารีขนาดกะทัดรัด ให้ใช้ตัวเลือก dumpProfile ของ Profgen-cli โดยใช้คำสั่งต่อไปนี้

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 เท่านั้น จึงต้องใช้เพื่อสร้างชื่อคลาสและเมธอดใหม่

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

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