ระบบบิลด์ Gradle ใน Android Studio ช่วยให้คุณรวมไบนารีภายนอกหรือ โมดูลไลบรารีอื่นๆ ไว้ในบิลด์เป็นทรัพยากร Dependency ได้ โดยขึ้นอยู่กับว่าอยู่ที่เครื่องของคุณหรือในที่เก็บข้อมูลระยะไกล และระบบจะรวมการอ้างอิงแบบทรานซิทีฟที่ประกาศไว้โดยอัตโนมัติด้วย หน้านี้ อธิบายวิธีใช้ทรัพยากร Dependency กับโปรเจ็กต์ Android รวมถึงรายละเอียด เกี่ยวกับลักษณะการทำงานและการกำหนดค่าที่เฉพาะเจาะจงกับ Android Gradle Plugin (AGP) ดูคำแนะนำเชิงแนวคิดเกี่ยวกับทรัพยากร Dependency ของ Gradle เพิ่มเติมได้ที่คำแนะนำ Gradle สำหรับการจัดการทรัพยากร Dependency แต่โปรดทราบว่าโปรเจ็กต์ Android ต้องใช้เฉพาะการกำหนดค่าทรัพยากร Dependency ที่กำหนดไว้ในหน้านี้เท่านั้น
เพิ่มทรัพยากร Dependency ของไลบรารีหรือปลั๊กอิน
วิธีที่ดีที่สุดในการเพิ่มและจัดการทรัพยากร Dependency ของบิลด์คือการใช้แคตตาล็อกเวอร์ชัน ซึ่งเป็นวิธีที่โปรเจ็กต์ใหม่ใช้โดยค่าเริ่มต้น ส่วนนี้ครอบคลุมการกำหนดค่าประเภทที่พบบ่อยที่สุด ที่ใช้สำหรับโปรเจ็กต์ Android โปรดดูตัวเลือกเพิ่มเติมใน เอกสารประกอบของ Gradle ดูตัวอย่างแอปที่ใช้แคตตาล็อกเวอร์ชันได้ที่ Now in Android หากคุณตั้งค่าการขึ้นต่อกันของบิลด์ไว้แล้ว โดยไม่มีแคตตาล็อกเวอร์ชันและมีโปรเจ็กต์แบบหลายโมดูล เราขอแนะนำให้ย้ายข้อมูล
ดูคำแนะนำเกี่ยวกับการเพิ่มและจัดการทรัพยากร Dependency เนทีฟ (ไม่พบบ่อย) ได้ที่ ทรัพยากร Dependency เนทีฟ
ในตัวอย่างต่อไปนี้ เราจะเพิ่มทรัพยากร Dependency แบบไบนารีระยะไกล (ไลบรารี Jetpack Macrobenchmark) ทรัพยากร Dependency ของโมดูลไลบรารีในเครื่อง (myLibrary) และทรัพยากร Dependency ของปลั๊กอิน (ปลั๊กอิน Android Gradle) ลงในโปรเจ็กต์ ต่อไปนี้เป็นขั้นตอนทั่วไป
ในการเพิ่มทรัพยากร Dependency เหล่านี้ลงในโปรเจ็กต์
เพิ่มนามแฝงสำหรับเวอร์ชันของทรัพยากร Dependency ที่ต้องการในส่วน
[versions]ของไฟล์แคตตาล็อกเวอร์ชันที่ชื่อlibs.versions.toml(ในไดเรกทอรีgradleในมุมมองโปรเจ็กต์หรือสคริปต์ Gradle ในมุมมอง Android)[versions] agp = "8.3.0" androidx-macro-benchmark = "1.2.2" my-library = "1.4" [libraries] ... [plugins] ...
นามแฝงอาจมีขีดกลางหรือขีดล่าง โดยชื่อแทนเหล่านี้จะสร้างค่าที่ซ้อนกัน ซึ่งคุณอ้างอิงได้ในสคริปต์บิลด์ การอ้างอิงจะเริ่มต้นด้วยชื่อของ แคตตาล็อก ซึ่งเป็นส่วนหนึ่งของ
libs.versions.tomllibsเมื่อ ใช้แคตตาล็อกเวอร์ชันเดียว เราขอแนะนำให้คงค่าเริ่มต้นเป็น "libs"เพิ่มนามแฝงสำหรับทรัพยากร Dependency ในส่วน
[libraries](สำหรับไบนารีระยะไกลหรือโมดูลไลบรารีในเครื่อง) หรือ[plugins](สำหรับปลั๊กอิน) ของไฟล์libs.versions.toml[versions] ... [libraries] androidx-benchmark-macro = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "androidx-macro-benchmark" } my-library = { group = "com.myapplication", name = "mylibrary", version.ref = "my-library" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" }ไลบรารีบางรายการมีอยู่ในรายการวัสดุ (BOM) ที่เผยแพร่แล้ว ซึ่ง จัดกลุ่มตระกูลของไลบรารีและเวอร์ชันของไลบรารี คุณสามารถใส่ BOM ในแคตตาล็อกเวอร์ชันและไฟล์บิลด์ แล้วให้แคตตาล็อกจัดการเวอร์ชันเหล่านั้นให้คุณ ดูรายละเอียดได้ที่การใช้รายการวัสดุ
เพิ่มการอ้างอิงไปยังนามแฝงของทรัพยากร Dependency ลงในสคริปต์บิลด์ของโมดูลที่ต้องใช้ทรัพยากร Dependency แปลงขีดล่างและขีดกลางของชื่อแทน เป็นจุดเมื่ออ้างอิงจากสคริปต์บิลด์ สคริปต์บิลด์ระดับโมดูล จะมีลักษณะดังนี้
Kotlin
plugins { alias(libs.plugins.androidApplication) } dependencies { implementation(libs.androidx.benchmark.macro) implementation(libs.my.library) }
Groovy
plugins { alias 'libs.plugins.androidApplication' } dependencies { implementation libs.androidx.benchmark.macro implementation libs.my.library }
การอ้างอิงปลั๊กอินจะมี
pluginsต่อท้ายชื่อแคตตาล็อก และ การอ้างอิงเวอร์ชันจะมีversionsต่อท้ายชื่อแคตตาล็อก (การอ้างอิงเวอร์ชัน ไม่ค่อยพบ โปรดดูตัวอย่างการอ้างอิงเวอร์ชันในการอ้างอิง ที่มีหมายเลขเวอร์ชันเดียวกัน) การอ้างอิงไลบรารี ไม่มีตัวระบุlibrariesคุณจึงใช้versionsหรือpluginsที่จุดเริ่มต้นของนามแฝงไลบรารี ไม่ได้
กำหนดค่าทรัพยากร Dependency
ภายในบล็อก dependencies คุณสามารถประกาศการอ้างอิงไลบรารีโดยใช้การกำหนดค่าการอ้างอิงหลายแบบ (เช่น implementation ที่แสดง
ก่อนหน้านี้) การกำหนดค่าการขึ้นต่อกันแต่ละรายการจะให้คำสั่งที่แตกต่างกันแก่ Gradle เกี่ยวกับวิธีใช้การขึ้นต่อกัน
ตารางต่อไปนี้อธิบายการกำหนดค่าแต่ละรายการที่คุณใช้สำหรับ Dependency ในโปรเจ็กต์ Android ได้
| การกำหนดค่า | ลักษณะการทำงาน |
|---|---|
implementation |
Gradle จะเพิ่มทรัพยากร Dependency ลงในเส้นทางการจัดประเภทการคอมไพล์และ
แพ็กเกจทรัพยากร Dependency ลงในเอาต์พุตบิลด์ เมื่อโมดูลกำหนดค่าimplementationการอ้างอิง จะเป็นการแจ้งให้ Gradle ทราบว่าคุณไม่ต้องการให้โมดูลรั่วไหลการอ้างอิงไปยังโมดูลอื่นๆ ในเวลาคอมไพล์ กล่าวคือ ระบบจะไม่ทำให้โมดูลอื่นๆ ที่ขึ้นอยู่กับโมดูลปัจจุบัน
ใช้ทรัพยากร Dependency ได้
การใช้การกำหนดค่าการขึ้นต่อกันนี้แทน
|
api |
Gradle จะเพิ่มทรัพยากร Dependency ไปยังเส้นทางคลาสการคอมไพล์และเอาต์พุตบิลด์
เมื่อโมดูลมีทรัพยากร Dependency api Gradle จะทราบว่าโมดูลต้องการส่งออกทรัพยากร Dependency นั้นไปยังโมดูลอื่นๆ โดยอ้อม เพื่อให้โมดูลอื่นๆ ใช้ทรัพยากร Dependency นั้นได้ทั้งในเวลาคอมไพล์และรันไทม์
ใช้การกำหนดค่านี้ด้วยความระมัดระวังและใช้เฉพาะกับการอ้างอิงที่คุณต้องส่งออกแบบทรานซิทีฟไปยังผู้ใช้ปลายทางอื่นๆ หากการอ้างอิง |
compileOnly |
Gradle จะเพิ่มการอ้างอิงไปยัง classpath ของการคอมไพล์เท่านั้น
(กล่าวคือ จะไม่เพิ่มลงในเอาต์พุตการสร้าง) ซึ่งจะเป็นประโยชน์เมื่อ
คุณสร้างโมดูล Android และต้องการการอ้างอิงระหว่าง
การคอมไพล์ แต่จะเลือกให้มีการอ้างอิงในเวลาเรียกใช้หรือไม่ก็ได้ ตัวอย่างเช่น หากคุณใช้ไลบรารีที่มีเฉพาะคำอธิบายประกอบในเวลาคอมไพล์ ซึ่งโดยปกติจะใช้เพื่อสร้างโค้ดแต่ไม่ได้รวมไว้ในเอาต์พุตบิลด์ คุณก็ทำเครื่องหมายไลบรารีนั้นเป็น compileOnly ได้
หากใช้การกำหนดค่านี้ โมดูลไลบรารีต้องมี เงื่อนไขรันไทม์เพื่อตรวจสอบว่ามีการขึ้นต่อกันหรือไม่ และเปลี่ยนลักษณะการทำงานอย่างราบรื่นเพื่อให้ยังคง ทำงานได้แม้ว่าจะไม่มีการระบุการขึ้นต่อกัน ซึ่งจะช่วยลดขนาดของ แอปสุดท้ายโดยไม่เพิ่มการอ้างอิงชั่วคราวที่ไม่สำคัญ
หมายเหตุ: คุณใช้การกำหนดค่า |
runtimeOnly |
Gradle จะเพิ่มการอ้างอิงไปยังเอาต์พุตบิลด์เท่านั้น เพื่อใช้
ในระหว่างรันไทม์ กล่าวคือ จะไม่มีการเพิ่มลงใน classpath ของการคอมไพล์
โดยปกติแล้วจะไม่ค่อยได้ใช้ใน Android แต่จะใช้ในแอปพลิเคชันเซิร์ฟเวอร์
เพื่อใช้การบันทึก เช่น ไลบรารีอาจใช้ Logging API ที่ไม่มีการติดตั้งใช้งาน ผู้ใช้ไลบรารีนั้นสามารถเพิ่มเป็นimplementationการอ้างอิงและรวมruntimeOnlyการอ้างอิงสำหรับการติดตั้งใช้งานการบันทึกจริงเพื่อใช้ได้
|
ksp |
การกำหนดค่าเหล่านี้จะจัดหาไลบรารีที่ประมวลผลคำอธิบายประกอบ และสัญลักษณ์อื่นๆ ในโค้ดก่อนที่จะคอมไพล์ โดยปกติแล้วเครื่องมือเหล่านี้จะ ตรวจสอบโค้ดหรือสร้างโค้ดเพิ่มเติม ซึ่งจะช่วยลดโค้ดที่คุณ ต้องเขียน หากต้องการเพิ่มการอ้างอิงดังกล่าว คุณต้องเพิ่มการอ้างอิงลงในคลาสพาธของโปรเซสเซอร์คำอธิบายประกอบโดยใช้การกำหนดค่า ปลั๊กอิน Android Gradle จะถือว่าทรัพยากร Dependency เป็นตัวประมวลผลคำอธิบายประกอบ หากไฟล์ JAR มีไฟล์ต่อไปนี้
หากปลั๊กอินตรวจพบ Annotation Processor ที่อยู่ใน compile classpath ปลั๊กอินจะสร้างข้อผิดพลาดในการสร้าง
เมื่อตัดสินใจว่าจะใช้การกำหนดค่าใด ให้พิจารณาสิ่งต่อไปนี้
ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้โปรเซสเซอร์สำหรับคำอธิบายประกอบได้ที่ เพิ่มโปรเซสเซอร์สำหรับคำอธิบายประกอบ |
lintChecks |
ใช้การกำหนดค่านี้เพื่อรวมไลบรารีที่มีการตรวจสอบ Lint ที่คุณต้องการให้ Gradle ดำเนินการเมื่อสร้างโปรเจ็กต์แอป Android โปรดทราบว่า AAR ที่มีไฟล์ |
lintPublish |
ใช้การกำหนดค่านี้ในโปรเจ็กต์ไลบรารี Android เพื่อรวมการตรวจสอบ lint
ที่คุณต้องการให้ Gradle คอมไพล์เป็นไฟล์ lint.jar
และแพ็กเกจใน AAR ซึ่งทำให้โปรเจ็กต์ที่ใช้ AAR ของคุณ
ใช้การตรวจสอบ Lint เหล่านั้นด้วย หากก่อนหน้านี้คุณใช้
การกำหนดค่าการขึ้นต่อกันของ lintChecks เพื่อรวมการตรวจสอบ Lint
ใน AAR ที่เผยแพร่ คุณจะต้องย้ายข้อมูลการขึ้นต่อกันเหล่านั้น
เพื่อใช้การกำหนดค่า lintPublish แทน
Kotlindependencies { // Executes lint checks from the ":checks" project at build time. lintChecks(project(":checks")) // Compiles lint checks from the ":checks-to-publish" into a // lint.jar file and publishes it to your Android library. lintPublish(project(":checks-to-publish")) } Groovydependencies { // Executes lint checks from the ':checks' project at build time. lintChecks project(':checks') // Compiles lint checks from the ':checks-to-publish' into a // lint.jar file and publishes it to your Android library. lintPublish project(':checks-to-publish') } |
กำหนดค่าการขึ้นต่อกันสำหรับตัวแปรของบิลด์ที่เฉพาะเจาะจง
การกำหนดค่าก่อนหน้านี้ทั้งหมดจะใช้การขึ้นต่อกันกับตัวแปรบิลด์ทั้งหมด หากต้องการประกาศการขึ้นต่อกันสำหรับชุดแหล่งที่มาของตัวแปรบิลด์ที่เฉพาะเจาะจงเท่านั้น หรือสำหรับชุดแหล่งที่มาสำหรับการทดสอบ คุณต้องขึ้นต้นชื่อการกำหนดค่าด้วยตัวพิมพ์ใหญ่และนำหน้าด้วยชื่อของตัวแปรบิลด์หรือชุดแหล่งที่มาสำหรับการทดสอบ
เช่น หากต้องการเพิ่มการอ้างอิงไบนารีระยะไกลเฉพาะในผลิตภัณฑ์ "ฟรี" ที่ใช้การกำหนดค่า implementation ให้ใช้การกำหนดค่าต่อไปนี้
Kotlin
dependencies { freeImplementation("com.google.firebase:firebase-ads:21.5.1") }
Groovy
dependencies { freeImplementation 'com.google.firebase:firebase-ads:21.5.1' }
อย่างไรก็ตาม หากต้องการเพิ่มการขึ้นต่อกันสำหรับตัวแปรที่รวม Product Flavor และประเภทบิลด์ คุณต้องเริ่มต้นชื่อการกำหนดค่าดังนี้
Kotlin
// Initializes a placeholder for the freeDebugImplementation dependency configuration. val freeDebugImplementation by configurations.creating dependencies { freeDebugImplementation(project(":free-support")) }
Groovy
configurations { // Initializes a placeholder for the freeDebugImplementation dependency configuration. freeDebugImplementation {} } dependencies { freeDebugImplementation project(":free-support") }
หากต้องการเพิ่มการอ้างอิง implementation สำหรับการทดสอบในเครื่องและการทดสอบที่มีการวัด ให้ทำดังนี้
Kotlin
dependencies { // Adds a remote binary dependency only for local tests. testImplementation("junit:junit:4.12") // Adds a remote binary dependency only for the instrumented test APK. androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") }
Groovy
dependencies { // Adds a remote binary dependency only for local tests. testImplementation 'junit:junit:4.12' // Adds a remote binary dependency only for the instrumented test APK. androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' }
อย่างไรก็ตาม การกำหนดค่าบางอย่างอาจไม่สมเหตุสมผลในสถานการณ์นี้ เช่น
เนื่องจากโมดูลอื่นๆ ไม่สามารถขึ้นอยู่กับ androidTest คุณจะได้รับคำเตือนต่อไปนี้
หากใช้การกำหนดค่า androidTestApi
WARNING: Configuration 'androidTestApi' is obsolete and has been replaced with 'androidTestImplementation'.
ลำดับการขึ้นต่อกัน
ลำดับที่คุณแสดงรายการทรัพยากร Dependency จะบ่งบอกถึงลำดับความสำคัญของแต่ละรายการ ไลบรารีแรกมีลำดับความสำคัญสูงกว่าไลบรารีที่สอง ไลบรารีที่สองมีลำดับความสำคัญสูงกว่า ไลบรารีที่สาม และต่อไปเรื่อยๆ ลำดับนี้มีความสำคัญในกรณีที่ ผสานรวมทรัพยากรหรือ ผสานรวมองค์ประกอบ Manifest เข้ากับแอปจากไลบรารี
เช่น หากโปรเจ็กต์ประกาศสิ่งต่อไปนี้
- การขึ้นต่อกันของ
LIB_AและLIB_B(ตามลำดับ) - และ
LIB_Aขึ้นอยู่กับLIB_CและLIB_D(ตามลำดับ) - และ
LIB_Bยังขึ้นอยู่กับLIB_Cด้วย
จากนั้นลำดับการขึ้นต่อกันแบบแบนจะเป็นดังนี้
LIB_ALIB_DLIB_BLIB_C
ซึ่งจะช่วยให้ทั้ง LIB_A และ LIB_B ลบล้าง
LIB_C ได้ และ LIB_D ยังคงมีลำดับความสำคัญสูงกว่า
LIB_B เนื่องจาก LIB_A (ซึ่งขึ้นอยู่กับ LIB_D)
มีลำดับความสำคัญสูงกว่า LIB_B
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีผสานไฟล์ Manifest จากแหล่งที่มา/การอ้างอิงของโปรเจ็กต์ต่างๆ ได้ที่ ผสานไฟล์ Manifest หลายไฟล์
ข้อมูลการขึ้นต่อกันสำหรับ Play Console
เมื่อสร้างแอป AGP จะรวมข้อมูลเมตาที่อธิบายทรัพยากร Dependency ของไลบรารี ที่คอมไพล์ลงในแอปของคุณ เมื่ออัปโหลดแอป Play Console จะตรวจสอบข้อมูลเมตานี้เพื่อแจ้งเตือนปัญหาที่ทราบเกี่ยวกับ SDK และ ทรัพยากร Dependency ที่แอปของคุณใช้ และในบางกรณีจะให้ความคิดเห็นที่นำไปใช้ได้จริงเพื่อ แก้ไขปัญหาเหล่านั้น
ระบบจะบีบอัดข้อมูล เข้ารหัสด้วยคีย์การลงนามของ Google Play และจัดเก็บไว้ใน
บล็อกการลงนามของแอปเวอร์ชันที่เผยแพร่ เราขอแนะนำให้เก็บไฟล์การอ้างอิงนี้ไว้
เพื่อประสบการณ์การใช้งานที่ปลอดภัยและดีของผู้ใช้ คุณเลือกไม่ใช้ได้โดยใส่บล็อกต่อไปนี้
dependenciesInfo
ในไฟล์ build.gradle.kts ของโมดูล
android {
dependenciesInfo {
// Disables dependency metadata when building APKs.
includeInApk = false
// Disables dependency metadata when building Android App Bundles.
includeInBundle = false
}
}
ดูข้อมูลเพิ่มเติมเกี่ยวกับนโยบายและปัญหาที่อาจเกิดขึ้นกับทรัพยากร Dependency ได้ที่หน้าการสนับสนุนเกี่ยวกับการใช้ SDK ของบุคคลที่สามในแอป
ข้อมูลเชิงลึกเกี่ยวกับ SDK
Android Studio จะแสดงคำเตือนของ Lint ในไฟล์แคตตาล็อกเวอร์ชันและกล่องโต้ตอบโครงสร้างโปรเจ็กต์สำหรับ SDK สาธารณะในดัชนี SDK ของ Google Play เมื่อมีปัญหาต่อไปนี้
- ผู้เขียน SDK จะทำเครื่องหมายว่า SDK ล้าสมัย
- SDK ละเมิดนโยบายของ Play
- SDK มีช่องโหว่ด้านความปลอดภัยที่ทราบ
- ผู้เขียนได้เลิกใช้งาน SDK เหล่านี้แล้ว
คำเตือนเป็นสัญญาณที่บ่งบอกว่าคุณควรจะอัปเดตการอ้างอิงเหล่านั้น เนื่องจาก การใช้เวอร์ชันที่ล้าสมัยอาจทำให้คุณเผยแพร่ไปยัง Google Play Console ในอนาคตไม่ได้
เพิ่มการพึ่งพาบิลด์โดยไม่มีแคตตาล็อกเวอร์ชัน
เราขอแนะนำให้ใช้แคตตาล็อกเวอร์ชันเพื่อเพิ่มและจัดการการอ้างอิง แต่โปรเจ็กต์ที่เรียบง่ายอาจไม่จำเป็นต้องใช้ ตัวอย่างไฟล์บิลด์ที่ไม่ได้ใช้แคตตาล็อกเวอร์ชันมีดังนี้
Kotlin
plugins { id("com.android.application") } android { ... } dependencies { // Dependency on a remote binary implementation("com.example.android:app-magic:12.3") // Dependency on a local library module implementation(project(":mylibrary")) }
Groovy
plugins { id 'com.android.application' } android { ... } dependencies { // Dependency on a remote binary implementation 'com.example.android:app-magic:12.3' // Dependency on a local library module implementation project(':mylibrary') }
ไฟล์บิลด์นี้ประกาศการขึ้นต่อกันในไลบรารี "app-magic" เวอร์ชัน 12.3 ภายในกลุ่มเนมสเปซ "com.example.android" การประกาศการขึ้นต่อกันของไบนารีระยะไกล เป็นรูปแบบย่อของรายการต่อไปนี้
Kotlin
implementation(group = "com.example.android", name = "app-magic", version = "12.3")
Groovy
implementation group: 'com.example.android', name: 'app-magic', version: '12.3'
ไฟล์บิลด์ยังประกาศการขึ้นต่อกันในโมดูลไลบรารี Android ชื่อ "mylibrary" ด้วย ซึ่งชื่อนี้ต้องตรงกับชื่อไลบรารีที่กำหนดด้วย include: ในไฟล์ settings.gradle.kts เมื่อคุณสร้างแอป ระบบบิลด์จะ
คอมไพล์โมดูลไลบรารีและแพ็กเนื้อหาที่คอมไพล์แล้วใน
แอป
ไฟล์บิลด์ยังประกาศทรัพยากร Dependency ในปลั๊กอิน Android Gradle
(com.application.android) ด้วย หากมีหลายโมดูลที่ใช้ปลั๊กอินเดียวกัน คุณจะมีปลั๊กอินได้เพียงเวอร์ชันเดียวในเส้นทางคลาสของบิลด์
ในทุกโมดูล คุณควรระบุการขึ้นต่อกันของปลั๊กอินในสคริปต์บิลด์รูทพร้อมกับเวอร์ชัน และระบุว่าไม่ต้องใช้แทนการระบุเวอร์ชันในสคริปต์บิลด์ของโมดูลแต่ละรายการ
การเพิ่ม apply false จะบอก
Gradle ให้บันทึกเวอร์ชันของปลั๊กอิน แต่ไม่ต้องใช้ในบิลด์รูท
โดยปกติแล้ว สคริปต์บิลด์รูทจะว่างเปล่ายกเว้นบล็อก plugins นี้
Kotlin
plugins { id("org.jetbrains.kotlin.android") version "1.9.0" apply false }
Groovy
plugins { id ‘com.android.application’ version ‘8.3.0-rc02’ apply false }
หากมีโปรเจ็กต์แบบโมดูลเดียว คุณจะระบุเวอร์ชันอย่างชัดเจนใน สคริปต์บิลด์ระดับโมดูลและปล่อยให้สคริปต์บิลด์ระดับโปรเจ็กต์ว่างไว้ได้
Kotlin
plugins { id("com.android.application") version "8.3.0" }
Groovy
plugins { id 'com.android.application' version '8.3.0-rc02' }