กําหนดค่าการสร้างโปรไฟล์พื้นฐาน

ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานช่วยให้สร้างและดูแลรักษาโปรไฟล์พื้นฐานได้ง่ายขึ้น ซึ่งจะช่วยให้คุณดำเนินการต่อไปนี้ได้

หน้านี้จะอธิบายวิธีใช้ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานเพื่อปรับแต่งการสร้างโปรไฟล์พื้นฐาน

ข้อกำหนดของปลั๊กอิน

ใช้อุปกรณ์ที่มีการจัดการของ Gradle เพื่อสร้างโปรไฟล์พื้นฐาน

หากต้องการใช้ Gradle Managed Device (GMD) เพื่อสร้างโปรไฟล์พื้นฐาน ให้เพิ่มในการกำหนดค่า build.gradle.kts ของโมดูลที่สร้างโปรไฟล์ ซึ่งอาจเป็นโมดูลทดสอบ :baselineprofile ตามที่แสดงในตัวอย่างต่อไปนี้

Kotlin

android {
   testOptions.managedDevices.devices {
       create<com.android.build.api.dsl.ManagedVirtualDevice>("pixel6Api31") {
           device = "Pixel 6"
           apiLevel = 31
           systemImageSource = "aosp"
       }
   }
}

Groovy

android {
   testOptions.managedDevices.devices {
       pixel6Api31(ManagedVirtualDevice) {
           device 'Pixel 6'
           apiLevel = 31
           systemImageSource 'aosp'
       }
   }
}

ใช้ GMD เพื่อสร้างโปรไฟล์พื้นฐานโดยการเพิ่มลงในการกำหนดค่าปลั๊กอิน Gradle ของโปรไฟล์พื้นฐาน ดังนี้ ใน build.gradle.kts ของข้อบังคับการทดสอบ :baselineprofile

Kotlin

baselineProfile {
    managedDevices += "pixel6Api31"
}

Groovy

baselineProfile {
    managedDevices = ['pixel6Api31']
}

เมื่อใช้ GMD เพื่อสร้างโปรไฟล์พื้นฐาน ให้ตั้งค่า useConnectedDevices เป็น false ในข้อบังคับการทดสอบ :baselineprofile

Kotlin

baselineProfile {
    ...
    useConnectedDevices = false
}

Groovy

baselineProfile {
    ...
    useConnectedDevices false
}

สร้างโปรไฟล์พื้นฐานสําหรับตัวแปรต่างๆ

คุณสามารถสร้างโปรไฟล์พื้นฐานต่อตัวแปร ต่อรุ่น หรือเป็นไฟล์เดียวเพื่อใช้กับตัวแปรทั้งหมด ควบคุมลักษณะการทำงานนี้ผ่านการตั้งค่าการผสาน ดังที่แสดงในตัวอย่างต่อไปนี้ใน build.gradle.kts ของโมดูลแอปพลิเคชันหรือไลบรารี

Kotlin

baselineProfile {
    mergeIntoMain = true
}

Groovy

baselineProfile {
    mergeIntoMain true
}

หากต้องการผสานโปรไฟล์ที่สร้างขึ้นสําหรับตัวแปรทั้งหมดเข้าเป็นโปรไฟล์เดียว ให้ตั้งค่า mergeIntoMain เป็น true ระบบจะสร้างโปรไฟล์พื้นฐานตามตัวแปรไม่ได้เมื่อการตั้งค่านี้เป็น true ดังนั้นจึงมีงาน Gradle รายการเดียวที่ชื่อ generateBaselineProfile ระบบจะแสดงผลโปรไฟล์ที่ src/main/generated/baselineProfiles

หากต้องการปิดใช้การผสานและมีโปรไฟล์ 1 รายการต่อตัวแปร ให้ตั้งค่า mergeIntoMain เป็น false ในกรณีนี้ จะมีงาน Gradle สำหรับตัวแปรหลายรายการ ตัวอย่างเช่น เมื่อมีแฟลเวอร์ 2 รายการ เช่น ฟรีและแบบชำระเงิน และบิลด์รุ่น 1 ประเภท งานต่างๆ มีดังนี้

* `generateFreeReleaseBaselineProfile`
* `generatePaidReleaseBaselineProfile`
* `generateReleaseBaselineProfile`

หากต้องการระบุลักษณะการผสานต่อตัวแปร ให้ใช้โค้ดต่อไปนี้

Kotlin

baselineProfile {
    variants {
        freeRelease {
            mergeIntoMain = true
        }
    }
}

Groovy

baselineProfile {
    variants {
        freeRelease {
            mergeIntoMain true
        }
    }
}

ในตัวอย่างก่อนหน้านี้ ระบบจะผสานตัวแปรทั้งหมดที่มีการตั้งค่า Flag เป็น true ไว้ใน src/main/generated/baselineProfiles ส่วนโปรไฟล์ของตัวแปรที่มีการตั้งค่า Flag เป็น false จะเก็บไว้ในโฟลเดอร์ src/<variant>/generated/baselineProfiles

โดยค่าเริ่มต้น mergeIntoMain จะตั้งค่าเป็น true สำหรับคลัง และ false สำหรับแอป

สร้างโปรไฟล์พื้นฐานโดยอัตโนมัติเมื่อประกอบรุ่นใหม่

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

หากต้องการเปิดใช้การสร้างอัตโนมัติสําหรับบิลด์รุ่น ให้ใช้ Flag automaticGenerationDuringBuild ดังนี้

Kotlin

baselineProfile {
    automaticGenerationDuringBuild = true
}

Groovy

baselineProfile {
    automaticGenerationDuringBuild true
}

การตั้งค่า Flag automaticGenerationDuringBuild เป็น true จะทริกเกอร์การสร้างโปรไฟล์พื้นฐานใหม่สําหรับแต่ละแอสเซมบลีรุ่น ซึ่งหมายความว่าการเรียกใช้งานบิลด์รุ่นที่ประกอบ เช่น ./gradlew:app:assembleRelease จะทริกเกอร์ :app:generateReleaseBaselineProfile ด้วย รวมถึงเริ่มการทดสอบเครื่องมือวัดผลของโปรไฟล์พื้นฐาน และสร้างบิลด์โปรไฟล์พื้นฐานที่ใช้เรียกใช้ แม้ว่าการสร้างอัตโนมัติจะช่วยให้ผู้ใช้ได้รับประโยชน์ด้านประสิทธิภาพที่ดีที่สุด แต่ก็จะทำให้เวลาในการสร้างนานขึ้นด้วยเนื่องจากมีการสร้างและการทดสอบเครื่องมือวัดผล 2 ครั้ง

นอกจากนี้ คุณยังระบุลักษณะการทํางานนี้ต่อตัวแปรแต่ละรายการได้ด้วย ดังตัวอย่างต่อไปนี้

Kotlin

baselineProfile {
    variants {
        freeRelease {
            automaticGenerationDuringBuild = true
        }
    }
}

Groovy

baselineProfile {
    variants {
        freeRelease {
            automaticGenerationDuringBuild true
        }
    }
}

ในตัวอย่างก่อนหน้านี้ งาน generateFreeReleaseBaselineProfile จะทำงานเมื่อเริ่ม assembleFreeRelease ซึ่งจะมีประโยชน์เมื่อผู้ใช้ต้องการมี release สำหรับบิลด์การจัดจำหน่ายที่สร้างโปรไฟล์ทุกครั้งเมื่อสร้าง และบิลด์ releaseWithoutProfile สำหรับการทดสอบภายใน

จัดเก็บโปรไฟล์พื้นฐานไว้ในแหล่งที่มา

คุณสามารถจัดเก็บโปรไฟล์พื้นฐานในไดเรกทอรีต้นทางผ่าน Flag saveInSrc ใน build.gradle.kts ของโมดูลแอปพลิเคชันหรือไลบรารี ดังนี้

  • true: โปรไฟล์พื้นฐานจะจัดเก็บไว้ใน src/<variant>/generated/baselineProfiles ซึ่งจะช่วยให้คุณส่งโปรไฟล์ที่สร้างขึ้นล่าสุดไปยังแหล่งที่มาได้
  • false: โปรไฟล์พื้นฐานจะจัดเก็บไว้ในไฟล์กลางในไดเรกทอรีบิลด์ วิธีนี้ช่วยให้คุณไม่ต้องบันทึกโปรไฟล์ที่สร้างขึ้นล่าสุดเมื่อคอมมิตโค้ด

Kotlin

baselineProfile {
    saveInSrc = true
}

Groovy

baselineProfile {
    saveInSrc true
}

นอกจากนี้ คุณยังระบุลักษณะการทำงานนี้ตามตัวแปรได้ด้วย

Kotlin

baselineProfile {
    variants {
        freeRelease {
            saveInSrc = true
        }
    }
}

Groovy

baselineProfile {
    variants {
        freeRelease {
            saveInSrc true
        }
    }
}

ปิดใช้คำเตือน

โดยค่าเริ่มต้น ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานจะเตือนคุณเกี่ยวกับสถานการณ์ที่อาจก่อให้เกิดปัญหา หากต้องการปิดใช้คำเตือน ให้ตั้งค่าตัวเลือกที่เกี่ยวข้องเป็น false ในไฟล์ build.gradle.kts ตัวเลือกคำเตือนมีดังนี้

baselineProfile {
    warnings {

        /**
        * Warn when the Android Gradle Plugin version is higher than the max
        * tested one.
        */
        maxAgpVersion = true

        /**
        * Warn when a benchmark or baseline profile variant has been disabled.
        */
        disabledVariants = true

        /**
        * Warn that running `generateBaselineProfile` with AGP 8.0 doesn't
        * support running instrumentation tests for multiple build types at
        * once.
        */
        multipleBuildTypesWithAgp80 = true

        /**
        * Warn when no baseline profiles are generated after running the
        * generate baseline profile command.
        */
        noBaselineProfileRulesGenerated = true

        /**
        * Warn when no startup profiles are generated after running the generate
        * baseline profile command.
        */
        noStartupProfileRulesGenerated = true
    }
}

กรองกฎโปรไฟล์

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

ข้อกําหนดของตัวกรองอาจเป็นค่าใดค่าหนึ่งต่อไปนี้

  • ชื่อแพ็กเกจที่ลงท้ายด้วยไวลด์การ์ดคู่เพื่อให้ตรงกับแพ็กเกจที่ระบุและแพ็กเกจย่อยทั้งหมด เช่น com.example.** ตรงกับ com.example.method และ com.example.method.bar
  • ชื่อแพ็กเกจที่ลงท้ายด้วยไวลด์การ์ดเพื่อจับคู่กับแพ็กเกจที่ระบุเท่านั้น เช่น com.example.* ตรงกับ com.example.method แต่ไม่ตรงกับ com.example.method.bar
  • ชื่อคลาสเพื่อจับคู่กับคลาสที่เฉพาะเจาะจง เช่น com.example.MyClass

ตัวอย่างต่อไปนี้แสดงวิธีรวมและยกเว้นแพ็กเกจที่เฉพาะเจาะจง

Kotlin

baselineProfile {
    filter {
        include("com.somelibrary.widget.grid.**")
        exclude("com.somelibrary.widget.grid.debug.**")
        include("com.somelibrary.widget.list.**")
        exclude("com.somelibrary.widget.list.debug.**")
        include("com.somelibrary.widget.text.**")
        exclude("com.somelibrary.widget.text.debug.**")
    }
}

Groovy

baselineProfile {
    filter {
        include 'com.somelibrary.widget.grid.**'
        exclude 'com.somelibrary.widget.grid.debug.**'
        include 'com.somelibrary.widget.list.**'
        exclude 'com.somelibrary.widget.list.debug.**'
        include 'com.somelibrary.widget.text.**'
        exclude 'com.somelibrary.widget.text.debug.**'
    }
}

ปรับแต่งกฎตัวกรองสําหรับตัวแปรต่างๆ ดังนี้

Kotlin

// Non-specific filters applied to all the variants.
baselineProfile {
    filter { include("com.myapp.**") }
}

// Flavor-specific filters.
baselineProfile {
    variants {
        free {
            filter {
                include("com.myapp.free.**")
            }
        }
        paid {
            filter {
                include("com.myapp.paid.**")
            }
        }
    }
}

// Build-type-specific filters.
baselineProfile {
    variants {
        release {
            filter {
                include("com.myapp.**")
            }
        }
    }
}

// Variant-specific filters.
baselineProfile {
    variants {
        freeRelease {
            filter {
                include("com.myapp.**")
            }
        }
    }
}

Groovy

// Non-specific filters applied to all the variants.
baselineProfile {
    filter { include 'com.myapp.**' }
}

// Flavor-specific filters.
baselineProfile {
    variants {
        free {
            filter {
                include 'com.myapp.free.**'
            }
        }
        paid {
            filter {
                include 'com.myapp.paid.**'
            }
        }
    }
}

// Build-type specific filters.
baselineProfile {
    variants {
        release {
            filter {
                include 'com.myapp.**'
            }
        }
    }
}

// Variant-specific filters.
baselineProfile {
    variants {
        freeRelease {
            filter {
                include 'com.myapp.**'
            }
        }
    }
}

นอกจากนี้ คุณยังกรองกฎได้โดยใช้อาร์กิวเมนต์ filterPredicate ใน BaselineProfileRule.collect() แต่เราขอแนะนำให้ใช้ปลั๊กอิน Gradle เพื่อกรอง เนื่องจากเป็นวิธีที่ง่ายกว่าในการกรองแพ็กเกจย่อยและที่เดียวในการกำหนดค่าทั้งโมดูล

ปรับแต่งประเภทบิลด์ของการเปรียบเทียบและโปรไฟล์พื้นฐาน

ปลั๊กอิน Gradle ของโปรไฟล์พื้นฐานจะสร้างประเภทบิลด์เพิ่มเติมเพื่อสร้างโปรไฟล์และเรียกใช้การเปรียบเทียบ ประเภทบิลด์เหล่านี้จะมีคำนำหน้าเป็น benchmark และ nonMinified เช่น สําหรับประเภทบิลด์ release ปลั๊กอินจะสร้างประเภทบิลด์ benchmarkRelease และ nonMinifiedRelease ระบบจะกําหนดค่าประเภทบิลด์เหล่านี้โดยอัตโนมัติสําหรับ Use Case ที่เฉพาะเจาะจง และโดยทั่วไปไม่จําเป็นต้องปรับแต่ง แต่ก็มีบางกรณีที่การใช้ตัวเลือกที่กำหนดเองอาจยังคงมีประโยชน์ เช่น การใช้การกำหนดค่าการรับรองที่แตกต่างกัน

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

Kotlin

android {
    buildTypes {
        release {
            ...
        }
        create("benchmarkRelease") {
            // Customize properties for the `benchmarkRelease` build type here.
            // For example, you can change the signing config (by default
            // it's the same as for the `release` build type).
            signingConfig = signingConfigs.getByName("benchmarkRelease")
        }
        create("nonMinifiedRelease") {
            // Customize properties for the `nonMinifiedRelease` build type here.
            signingConfig = signingConfigs.getByName("nonMinifiedRelease")

            // From Baseline Profile Gradle plugin 1.2.4 and higher, you can't
            // customize the following properties, which are always overridden to
            // avoid breaking Baseline Profile generation:
            //
            // isJniDebuggable = false
            // isDebuggable = false
            // isMinifyEnabled = false
            // isShrinkResources = false
            // isProfileable = true
            // enableAndroidTestCoverage = false
            // enableUnitTestCoverage = false
        }
    }
}

Groovy

android {
    buildTypes {
        release {
            ...
        }
        benchmarkRelease {
            // Customize properties for the `benchmarkRelease` build type here.
            // For example, you can change the signing config (by default it's the
            // same as for the `release` build type.)
            signingConfig = signingConfigs.benchmarkRelease
        }
        nonMinifiedRelease {
            // Customize properties for the `nonMinifiedRelease` build type here.
            signingConfig = signingConfigs.nonMinifiedRelease

            // From Baseline Profile Gradle plugin 1.2.4 and higher, you can't use
            // the following properties, which are always overridden to avoid breaking
            // Baseline Profile generation:
            //
            // isJniDebuggable = false
            // isDebuggable = false
            // isMinifyEnabled = false
            // isShrinkResources = false
            // isProfileable = true
            // enableAndroidTestCoverage = false
            // enableUnitTestCoverage = false       
        }
    }
}

หมายเหตุเพิ่มเติม

สิ่งที่ควรทราบเพิ่มเติมเมื่อสร้างโปรไฟล์พื้นฐานมีดังนี้

  • โปรไฟล์พื้นฐานที่คอมไพล์แล้วต้องมีขนาดเล็กกว่า 1.5 MB การดำเนินการนี้ไม่ส่งผลต่อรูปแบบข้อความในไฟล์ต้นทาง ซึ่งโดยทั่วไปจะมีขนาดใหญ่กว่ามากก่อนการคอมไพล์ ยืนยันขนาดของโปรไฟล์พื้นฐานแบบไบนารีโดยค้นหาในอาร์ติแฟกต์เอาต์พุตในส่วน assets/dexopt/baseline.prof สำหรับ APK หรือ BUNDLE-METADATA/com.android.tools.build.profiles/baseline.prof สำหรับ AAB

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

Codelabs

สร้างโปรไฟล์พื้นฐานที่กําหนดเองซึ่งปรับให้เหมาะกับแอป Android และยืนยันประสิทธิภาพของโปรไฟล์