ภาพรวมของโปรไฟล์พื้นฐาน

Baseline Profiles ช่วยปรับปรุงความเร็วในการเรียกใช้โค้ดประมาณ 30% ตั้งแต่การเปิดตัวครั้งแรก โดยหลีกเลี่ยงขั้นตอนการตีความและการคอมไพล์แบบทันที (JIT) สำหรับ เส้นทางโค้ดที่รวมไว้

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

การเพิ่มประสิทธิภาพเหล่านี้ส่งผลโดยตรงต่อการปรับปรุงเมตริกทางธุรกิจ เช่น การคงผู้ใช้ไว้ ธุรกรรม และการให้คะแนน คุณอ่านเพิ่มเติมเกี่ยวกับวิธีที่ ประสิทธิภาพส่งผลต่อเมตริกทางธุรกิจได้ในเรื่องราวจาก Josh, Lyft, TikTok และ Zomato

ประโยชน์ของโปรไฟล์พื้นฐาน

โปรไฟล์พื้นฐานช่วยให้การโต้ตอบของผู้ใช้ทั้งหมด เช่น การเริ่มต้นแอป การไปยังส่วนต่างๆ ระหว่างหน้าจอ หรือการเลื่อนดูเนื้อหา ราบรื่นยิ่งขึ้นตั้งแต่ครั้งแรกที่เรียกใช้ การเพิ่มความเร็วและการตอบสนองของแอป โปรไฟล์พื้นฐานจะช่วยให้มีผู้ใช้ที่ใช้งานอยู่รายวันมากขึ้นและมีอัตราการกลับมาเข้าชมเฉลี่ยสูงขึ้น

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

เมื่อไม่ได้ใช้ Baseline Profile โค้ดแอปทั้งหมดจะได้รับการคอมไพล์ JIT ในหน่วยความจำ หลังจากได้รับการตีความ หรือเขียนลงในไฟล์ odex ในเบื้องหลังเมื่อ อุปกรณ์ไม่ได้ใช้งาน หลังจากติดตั้งหรืออัปเดตแอป ผู้ใช้จะได้รับประสบการณ์ที่ไม่ดีนัก ตั้งแต่ครั้งแรกที่เรียกใช้จนกว่าจะมีการเพิ่มประสิทธิภาพเส้นทางโค้ดใหม่ แอปจำนวนมากวัดการเพิ่มประสิทธิภาพได้ประมาณ 30% หลังจากเพิ่มประสิทธิภาพแล้ว

โปรไฟล์สตาร์ทอัพ

โปรไฟล์การเริ่มต้นจะคล้ายกับโปรไฟล์พื้นฐาน แต่มีความแตกต่างตรงที่โปรไฟล์การเริ่มต้น จะใช้ในเวลาคอมไพล์ ไม่ใช่เพื่อการเพิ่มประสิทธิภาพในอุปกรณ์ ระบบจะใช้โปรไฟล์การเริ่มต้น เพื่อเพิ่มประสิทธิภาพเลย์เอาต์ของไฟล์ DEX เพื่อปรับปรุงเวลาเริ่มต้น โค้ดที่ระบุในโปรไฟล์การเริ่มต้นจะอยู่ในclasses.dex ไฟล์หลัก ส่วนโค้ดอื่นๆ จะอยู่ในไฟล์ DEX แยกต่างหาก ซึ่งจะช่วยปรับปรุงเวลาเริ่มต้น โดยลดจำนวนข้อผิดพลาดของหน้าในระหว่างการเริ่มต้นแอป ดูข้อมูลเพิ่มเติมเกี่ยวกับ วิธีที่โปรไฟล์การเริ่มต้นและการเพิ่มประสิทธิภาพเลย์เอาต์ DEX ช่วยปรับปรุงเวลาเริ่มต้นของแอป ได้ที่การเพิ่มประสิทธิภาพเลย์เอาต์ DEX และโปรไฟล์การเริ่มต้น

เริ่มต้นใช้งาน

หากต้องการเริ่มเพิ่มประสิทธิภาพในแอปที่มีอยู่ ให้ดูสร้างโปรไฟล์พื้นฐาน

ห่วงโซ่การอ้างอิงมีเวอร์ชันการเผยแพร่ที่เสถียรและเวอร์ชันที่กำลังพัฒนา หากต้องการ สร้างและติดตั้ง Baseline Profile ให้ใช้ปลั๊กอิน Android Gradle, ไลบรารี Macrobenchmark และ Profile Installer เวอร์ชันที่รองรับต่อไปนี้หรือสูงกว่า การขึ้นต่อกันเหล่านี้จำเป็นต้องใช้ในเวลาที่ต่างกันและทำงานร่วมกันเป็น เครื่องมือเพื่อเปิดใช้ Baseline Profile ที่เหมาะสม

  • ปลั๊กอิน Android Gradle: com.android.tools.build:8.0.0
  • ไลบรารี Macrobenchmark androidx.benchmark:benchmark-macro-junit4:1.3.4
  • โปรแกรมติดตั้งโปรไฟล์ androidx.profileinstaller:profileinstaller:1.4.1

เราขอแนะนำให้ใช้ AGP เวอร์ชันล่าสุดเพื่อสร้างและจัดการ Baseline Profiles ฟังก์ชันการทำงานหลักๆ ที่มาพร้อมกับ AGP เวอร์ชันต่างๆ มีดังนี้

เวอร์ชัน AGP ฟีเจอร์
8.4 การติดตั้งแอปในเครื่องของบิลด์ที่แก้ไขข้อบกพร่องไม่ได้โดยใช้ เครื่องมือบรรทัดคำสั่ง Gradle Wrapper หรือ Android Studio จะติดตั้ง Baseline Profile เพื่อให้ประสิทธิภาพ ของบิลด์รุ่นที่เผยแพร่ในเครื่องตรงกับการใช้งานจริงมากขึ้น การอัปเดตนี้ไม่ส่งผลต่อประสิทธิภาพการทำงานของ Baseline Profile ในเวอร์ชันที่ใช้งานจริง
8.3
  • รองรับไดเรกทอรีชุดแหล่งที่มาแบบเต็ม (โมดูลไลบรารี): ประกาศไฟล์แหล่งที่มาของ Baseline Profile หลายไฟล์ และใช้ ไดเรกทอรีที่รับรู้ถึงตัวแปร เช่น src/free/generated/baselineProfiles/baseline-prof1.txt สำหรับโมดูลไลบรารีและโมดูลแอป
  • โปรไฟล์พื้นฐานประกอบด้วย คลาสที่ยกเลิกการเพิ่มน้ำตาล
8.2
  • การเขียนกฎใหม่ของ R8: D8 และ R8 สามารถแปลงกฎพื้นฐานและกฎโปรไฟล์การเริ่มต้นที่มนุษย์อ่านได้ เพื่อบันทึกกฎทั้งหมดที่คุณต้องใช้ในการเพิ่มประสิทธิภาพแอปได้อย่างเต็มที่ เพิ่ม ความครอบคลุมของวิธีการในโปรไฟล์พื้นฐานประมาณ 30% และเพิ่มประสิทธิภาพของแอป ประมาณ 15%
  • โปรไฟล์การเริ่มต้น: สร้างโปรไฟล์พื้นฐานประเภทใหม่นี้เพื่อแจ้งเลย์เอาต์ของ โค้ดภายใน DEX เพิ่มประสิทธิภาพการเริ่มต้นขึ้นอีกประมาณ 15% หรือมากกว่านั้นอย่างมากสำหรับแอปขนาดใหญ่
8.0 เวอร์ชันขั้นต่ำที่แนะนำ: ใช้ปลั๊กอิน Gradle ของ Baseline Profile เพื่อสร้าง Baseline Profile ด้วยงาน Gradle เดียว
  • รองรับไดเรกทอรีชุดแหล่งที่มาทั้งหมด (โมดูลแอป): ประกาศไฟล์แหล่งที่มาของ Baseline Profile หลายไฟล์ และใช้ไดเรกทอรีที่รับรู้ถึงตัวแปร เช่น src/free/generated/baselineProfiles/baseline-prof1.txt
7.4 เวอร์ชันต่ำสุดที่รองรับ: แอปสามารถใช้ Baseline Profile จากไลบรารี และระบุ Baseline Profile ของตนเองในไฟล์ src/main/baseline-prof.txt
  • Baseline Profile จะได้รับการแพ็กอย่างถูกต้องเมื่อสร้าง APK จาก App Bundle (ปัญหา #230361284)
  • สำหรับแอปที่มีไฟล์ .dex มากกว่า 1 ไฟล์ ระบบจะแพ็กเกจโปรไฟล์ Baseline อย่างถูกต้องสำหรับไฟล์ .dex หลัก

ตัวอย่างการสร้างโปรไฟล์

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

@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            // App startup journey.
            startActivityAndWait()

            device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
            device.findObject(By.res("myLazyColumn")).also {
                it.fling(Direction.DOWN)
                it.fling(Direction.UP)
            }
            device.pressBack()
        }
    }
}

คุณดูโค้ดนี้ในบริบททั้งหมดและรายละเอียดเพิ่มเติมได้ในส่วน ตัวอย่างประสิทธิภาพใน GitHub

ข้อมูลที่ต้องระบุ

เมื่อใช้ Baseline Profile ในแอป คุณจะใส่โค้ดการเริ่มต้นแอปและ การโต้ตอบของผู้ใช้ทั่วไป เช่น การไปยังส่วนต่างๆ ระหว่างหน้าจอหรือการเลื่อน ได้ นอกจากนี้ คุณยังรวบรวมโฟลว์ทั้งหมด เช่น การลงทะเบียน การเข้าสู่ระบบ หรือการชำระเงินได้ด้วย เส้นทางของผู้ใช้ที่คุณถือว่ามีความสําคัญจะได้รับประโยชน์จากโปรไฟล์พื้นฐานด้วยการปรับปรุงประสิทธิภาพรันไทม์

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

ไลบรารีสามารถจัดทำ Baseline Profile ของตนเองและจัดส่งพร้อมกับรุ่นต่างๆ เพื่อ ปรับปรุงประสิทธิภาพของแอป เช่น ดูส่วนการใช้ Baseline Profile ใน ประสิทธิภาพของ Jetpack Compose

วิธีการทำงานของโปรไฟล์พื้นฐาน

ขณะพัฒนาแอปหรือไลบรารี ให้พิจารณากําหนด Baseline Profile เพื่อ ครอบคลุมการโต้ตอบของผู้ใช้ทั่วไปที่เวลาในการแสดงผลหรือเวลาในการตอบสนองมีความสําคัญ วิธีการทำงานมีดังนี้

  1. ระบบจะสร้างกฎโปรไฟล์ที่มนุษย์อ่านได้สำหรับแอปของคุณและคอมไพล์เป็น รูปแบบไบนารีในแอป คุณสามารถดูกฎเหล่านี้ได้ใน assets/dexopt/baseline.prof จากนั้นคุณจะอัปโหลด AAB ไปยัง Google Play ได้ตามปกติ

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

  3. เวิร์กโฟลว์นี้จะทำงานร่วมกับการรวบรวมโปรไฟล์ในระบบคลาวด์เพื่อปรับแต่ง ประสิทธิภาพตามการใช้งานแอปจริงเมื่อเวลาผ่านไป

รูปที่ 1 แผนภาพนี้แสดงเวิร์กโฟลว์ของ Baseline Profile ตั้งแต่การอัปโหลดไปจนถึงการนำส่งให้ผู้ใช้ปลายทาง และวิธีที่เวิร์กโฟลว์นั้นเกี่ยวข้องกับ Cloud Profile

โปรไฟล์ Cloud

โปรไฟล์ในระบบคลาวด์เป็น PGO อีกรูปแบบหนึ่งที่รวบรวมโดย Google Play Store และเผยแพร่เพื่อการคอมไพล์เวลาติดตั้งพร้อมกับโปรไฟล์พื้นฐาน

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

ลักษณะการทำงานของการคอมไพล์ใน Android เวอร์ชันต่างๆ

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

เวอร์ชัน Android วิธีการรวบรวม แนวทางการเพิ่มประสิทธิภาพ
5 ถึง 6 (API ระดับ 21 ถึง 23) AOT แบบเต็ม ระบบจะเพิ่มประสิทธิภาพแอปทั้งแอป ในระหว่างการติดตั้ง ซึ่งส่งผล ให้ต้องรอนานกว่าจะใช้ แอปได้ มีการใช้ RAM และ พื้นที่ดิสก์มากขึ้น และ ใช้เวลานานขึ้นในการโหลดโค้ด จากดิสก์ ซึ่งอาจ ทำให้เวลาในการเริ่มต้นระบบแบบ Cold Start นานขึ้น
7 ถึง 8.1 (API ระดับ 24 ถึง 27) AOT บางส่วน (โปรไฟล์พื้นฐาน) Baseline Profiles จะได้รับการติดตั้งโดย androidx.profileinstaller ในการเรียกใช้ครั้งแรกเมื่อโมดูลแอปกำหนดการอ้างอิงนี้ ART สามารถปรับปรุง สิ่งนี้ได้เพิ่มเติมโดยการเพิ่ม กฎโปรไฟล์เพิ่มเติม ขณะที่ใช้แอป และ คอมไพล์กฎเหล่านั้นเมื่อ อุปกรณ์ไม่ได้ใช้งาน ซึ่งจะช่วย เพิ่มประสิทธิภาพพื้นที่ดิสก์ และเวลาในการโหลดโค้ดจาก ดิสก์ จึงช่วยลด เวลารอของแอป
9 (API ระดับ 28) และ สูงกว่า AOT บางส่วน (Baseline + โปรไฟล์ Cloud) Play ใช้ Baseline Profile ระหว่างการติดตั้งแอปเพื่อ เพิ่มประสิทธิภาพ APK และ Cloud Profile หากมี หลังจากติดตั้งแล้ว ระบบจะอัปโหลดโปรไฟล์ ART ไปยัง Play จากนั้นจะรวบรวมและแสดงเป็นโปรไฟล์ในระบบคลาวด์แก่ผู้ใช้รายอื่นเมื่อผู้ใช้ติดตั้งหรืออัปเดตแอป

ปัญหาที่ทราบ

ปัญหาและวิธีแก้ปัญหาที่อาจเกิดขึ้น หรือปัญหาที่อยู่ระหว่างการพัฒนาวิธีแก้ไขเบื้องต้นมีดังนี้

  • การสร้าง Baseline Profile อาจล้มเหลวเนื่องจากการตั้งค่าสิทธิ์ในอุปกรณ์บางเครื่อง ซึ่งรวมถึงอุปกรณ์ OnePlus หากต้องการหลีกเลี่ยงปัญหานี้ ให้ปิดตัวเลือกปิดใช้การตรวจสอบสิทธิ์ในการตั้งค่าตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์

  • อุปกรณ์ Firebase Test Lab ไม่รองรับการสร้าง Baseline Profile รวมถึงอุปกรณ์ Test Lab ที่จัดการโดย Gradle (ปัญหา #285187547)

  • หากต้องการจัดเตรียม Baseline Profile สำหรับไลบรารีให้สำเร็จ ให้ใช้ ปลั๊กอิน Baseline Profile Gradle 1.2.3 หรือ AGP 8.3 เป็นอย่างน้อย (ปัญหา #313992099)

  • หากคุณสร้างโปรไฟล์พื้นฐานด้วยคำสั่ง ./gradlew app:generateBaselineProfile ระบบจะเรียกใช้การเปรียบเทียบในโมดูลทดสอบ ด้วย และจะทิ้งผลลัพธ์ หากเกิดกรณีนี้ คุณจะสร้างได้ เฉพาะ Baseline Profiles โดยเรียกใช้คำสั่งที่มี -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile ปัญหานี้ได้รับการแก้ไขแล้วใน AGP 8.2

  • คำสั่งในการสร้างโปรไฟล์พื้นฐานสำหรับการสร้างทุกประเภท - ./gradlew app:generateBaselineProfile - จะสร้างโปรไฟล์พื้นฐานสำหรับการสร้างประเภทรีลีสเท่านั้น ปัญหานี้ได้รับการแก้ไขแล้วใน AGP 8.1

  • ช่องทางการเผยแพร่แอปที่ไม่ใช่ Google Play Store อาจไม่รองรับการใช้ Baseline Profile ในการติดตั้ง ผู้ใช้แอปที่ติดตั้งผ่านช่องทางเหล่านี้จะไม่เห็นสิทธิประโยชน์จนกว่า dexopt ในเบื้องหลังจะทำงาน ซึ่งอาจใช้เวลาข้ามคืน

  • การแชร์แอปภายในของ Play Store ไม่รองรับ Baseline Profile แต่แทร็กการทดสอบภายใน รองรับ

  • การเพิ่มประสิทธิภาพแบตเตอรี่ในอุปกรณ์บางรุ่น เช่น อุปกรณ์ Huawei อาจรบกวน การติดตั้งโปรไฟล์ หากต้องการให้มั่นใจว่าโปรไฟล์ได้รับการติดตั้งอย่างมีประสิทธิภาพ ให้ปิดการเพิ่มประสิทธิภาพแบตเตอรี่ในอุปกรณ์เปรียบเทียบ

แหล่งข้อมูลเพิ่มเติม