ระบบบิลด์ Gradle ใน Android Studio ช่วยให้คุณรวมไบนารีภายนอกหรือ โมดูลไลบรารีอื่นๆ ไว้ในบิลด์เป็นทรัพยากร Dependency ได้ โดยขึ้นอยู่กับว่าอยู่ที่เครื่องของคุณหรือในที่เก็บข้อมูลระยะไกล และระบบจะรวมการอ้างอิงแบบทรานซิทีฟที่ประกาศไว้โดยอัตโนมัติด้วย หน้านี้ อธิบายวิธีใช้ทรัพยากร Dependency กับโปรเจ็กต์ Android รวมถึงรายละเอียด เกี่ยวกับลักษณะการทำงานและการกำหนดค่าที่เฉพาะเจาะจงสำหรับ Android Gradle Plugin (AGP) ดูคำแนะนำเชิงแนวคิดเกี่ยวกับทรัพยากร Dependency ของ Gradle เพิ่มเติมได้ในคำแนะนำ Gradle สำหรับการจัดการทรัพยากร Dependency แต่โปรดทราบว่าโปรเจ็กต์ Android ต้องใช้เฉพาะการกำหนดค่าทรัพยากร 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" }ไลบรารีบางรายการมีอยู่ใน Bill of Materials (BOM) ที่เผยแพร่แล้ว ซึ่งจัดกลุ่มตระกูลของไลบรารีและเวอร์ชันของไลบรารีเหล่านั้น คุณสามารถใส่ BOM ในแคตตาล็อกเวอร์ชันและไฟล์บิลด์ แล้วให้แคตตาล็อกจัดการเวอร์ชันเหล่านั้นให้คุณได้ ดูรายละเอียดได้ที่การใช้ Bill of Materials
เพิ่มการอ้างอิงไปยังนามแฝงของทรัพยากร Dependency ลงในสคริปต์บิลด์ของโมดูลที่ต้องใช้ทรัพยากร Dependency แปลงขีดล่างและขีดกลางของชื่อแทน เป็นจุดเมื่ออ้างอิงจากสคริปต์บิลด์ สคริปต์บิลด์ระดับโมดูล จะมีลักษณะดังนี้
Kotlin
plugins { alias(libs.plugins.androidApplication) } dependencies { implementation(libs.androidx.benchmark.macro) implementation(libs.my.library) }
ดึงดูด
plugins { alias 'libs.plugins.androidApplication' } dependencies { implementation libs.androidx.benchmark.macro implementation libs.my.library }
การอ้างอิงปลั๊กอินจะมี
pluginsต่อท้ายชื่อแคตตาล็อก และ การอ้างอิงเวอร์ชันจะมีversionsต่อท้ายชื่อแคตตาล็อก (การอ้างอิงเวอร์ชัน ไม่ค่อยพบ โปรดดูตัวอย่างการอ้างอิงเวอร์ชันในการอ้างอิง ที่มีหมายเลขเวอร์ชันเดียวกัน) การอ้างอิงไลบรารีไม่มีตัวระบุlibrariesคุณจึงใช้versionsหรือpluginsที่จุดเริ่มต้นของนามแฝงไลบรารีไม่ได้
กำหนดค่าทรัพยากร Dependency
ภายในบล็อก dependencies คุณสามารถประกาศทรัพยากร Dependency ของไลบรารีโดยใช้การกำหนดค่าทรัพยากร Dependencyหลายแบบ (เช่น implementation ที่แสดง
ก่อนหน้านี้) การกำหนดค่าทรัพยากร Dependency แต่ละรายการจะให้คำสั่งที่แตกต่างกันแก่ Gradle
เกี่ยวกับวิธีใช้ทรัพยากร Dependency ตารางต่อไปนี้อธิบายการกำหนดค่าแต่ละรายการที่คุณใช้สำหรับ Dependency ในโปรเจ็กต์ Android ได้
| การกำหนดค่า | ลักษณะการทำงาน |
|---|---|
implementation |
Gradle จะเพิ่มทรัพยากร Dependency ลงในคลาสพาธการคอมไพล์และ
แพ็กเกจทรัพยากร Dependency ลงในเอาต์พุตบิลด์ เมื่อโมดูลกำหนดค่าimplementationการอ้างอิง จะเป็นการแจ้งให้ Gradle ทราบว่าคุณไม่ต้องการให้โมดูลรั่วไหลการอ้างอิงไปยังโมดูลอื่นๆ ในเวลาคอมไพล์ กล่าวคือ ทรัพยากร Dependency
จะไม่แสดงต่อโมดูลอื่นๆ ที่ขึ้นอยู่กับโมดูลปัจจุบัน
การใช้การกำหนดค่าการขึ้นต่อกันนี้แทน
|
api |
Gradle จะเพิ่มทรัพยากร Dependency ไปยังคลาสพาธการคอมไพล์และเอาต์พุตบิลด์
เมื่อโมดูลมีทรัพยากร Dependency api จะเป็นการแจ้งให้ Gradle ทราบว่าโมดูลต้องการส่งออกทรัพยากร Dependency นั้นไปยังโมดูลอื่นๆ โดยอ้อม เพื่อให้โมดูลอื่นๆ ใช้ทรัพยากร Dependency นั้นได้ทั้งในรันไทม์และเวลาคอมไพล์
ใช้การกำหนดค่านี้ด้วยความระมัดระวังและใช้เฉพาะกับทรัพยากร Dependency ที่คุณต้องส่งออกแบบทรานซิทีฟไปยังผู้ใช้ปลายทางอื่นๆ หากทรัพยากร Dependency
|
compileOnly |
Gradle จะเพิ่มทรัพยากร Dependency ไปยังคลาสพาธของการคอมไพล์เท่านั้น
(กล่าวคือ จะไม่เพิ่มลงในเอาต์พุตของบิลด์) ซึ่งจะมีประโยชน์เมื่อ
คุณสร้างโมดูล Android และต้องการทรัพยากร Dependency ระหว่าง
การคอมไพล์ แต่จะเลือกให้มีการอ้างอิงในเวลาเรียกใช้หรือไม่ก็ได้ ตัวอย่างเช่น หากคุณใช้ไลบรารีที่มีเฉพาะคำอธิบายประกอบในเวลาคอมไพล์ ซึ่งโดยทั่วไปจะใช้เพื่อสร้างโค้ดแต่ไม่ได้รวมไว้ในเอาต์พุตบิลด์ คุณก็ทำเครื่องหมายไลบรารีนั้นเป็น compileOnly ได้
หากใช้การกำหนดค่านี้ โมดูลไลบรารีต้องมี เงื่อนไขรันไทม์เพื่อตรวจสอบว่ามีทรัพยากร Dependency หรือไม่ และเปลี่ยนลักษณะการทำงานอย่างราบรื่นเพื่อให้ยังคง ทำงานได้แม้ว่าจะไม่มีการระบุทรัพยากร Dependency ซึ่งจะช่วยลดขนาดของ แอปสุดท้ายโดยไม่เพิ่มการอ้างอิงชั่วคราวที่ไม่สำคัญ
หมายเหตุ: คุณใช้การกำหนดค่า |
runtimeOnly |
Gradle จะเพิ่มการอ้างอิงลงในเอาต์พุตบิลด์เท่านั้น เพื่อใช้
ในระหว่างรันไทม์ กล่าวคือ จะไม่มีการเพิ่มลงใน classpath ของการคอมไพล์
โดยปกติแล้วจะไม่ค่อยได้ใช้ใน Android แต่จะใช้กันโดยทั่วไปในแอปพลิเคชันเซิร์ฟเวอร์
เพื่อใช้การบันทึก เช่น ไลบรารีอาจใช้ Logging API ที่ไม่มีการติดตั้งใช้งาน ผู้ใช้ไลบรารีนั้นสามารถเพิ่มเป็นimplementationทรัพยากร Dependency และรวมruntimeOnlyทรัพยากร Dependency สำหรับการติดตั้งใช้งานการบันทึกจริงเพื่อใช้ได้
|
ksp |
การกำหนดค่าเหล่านี้จะจัดหาไลบรารีที่ประมวลผลคำอธิบายประกอบ และสัญลักษณ์อื่นๆ ในโค้ดก่อนที่จะคอมไพล์ โดยปกติแล้วเครื่องมือเหล่านี้จะ ตรวจสอบโค้ดหรือสร้างโค้ดเพิ่มเติม ซึ่งจะช่วยลดโค้ดที่คุณ ต้องเขียน หากต้องการเพิ่มทรัพยากร Dependency ดังกล่าว คุณต้องเพิ่มลงในคลาสพาธของโปรเซสเซอร์สำหรับคำอธิบายประกอบโดยใช้การกำหนดค่า ปลั๊กอิน Android Gradle จะถือว่าทรัพยากร Dependency เป็นตัวประมวลผลคำอธิบายประกอบ หากไฟล์ JAR มีไฟล์ต่อไปนี้
หากปลั๊กอินตรวจพบโปรเซสเซอร์สำหรับคำอธิบายประกอบที่อยู่ใน คลาสพาธการคอมไพล์ ปลั๊กอินจะสร้างข้อผิดพลาดในการบิลด์
เมื่อตัดสินใจว่าจะใช้การกำหนดค่าใด ให้พิจารณาสิ่งต่อไปนี้
ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้โปรเซสเซอร์สำหรับคำอธิบายประกอบได้ที่ เพิ่มโปรเซสเซอร์สำหรับคำอธิบายประกอบ |
lintChecks |
ใช้การกำหนดค่านี้เพื่อรวมไลบรารีที่มีการตรวจสอบ lint ที่คุณต้องการให้ Gradle ดำเนินการเมื่อสร้างโปรเจ็กต์แอป Android โปรดทราบว่า AAR ที่มีไฟล์ |
lintPublish |
ใช้การกำหนดค่านี้ในโปรเจ็กต์ไลบรารี Android เพื่อรวมการตรวจสอบ lint
ที่คุณต้องการให้ Gradle คอมไพล์เป็นไฟล์ lint.jar
และแพ็กเกจใน AAR ซึ่งทำให้โปรเจ็กต์ที่ใช้ AAR ของคุณใช้การตรวจสอบ Lint เหล่านั้นด้วย หากก่อนหน้านี้คุณใช้
การกำหนดค่าทรัพยากร Dependency ของ lintChecks เพื่อรวมการตรวจสอบ Lint
ใน AAR ที่เผยแพร่ คุณจะต้องย้ายข้อมูลทรัพยากร Dependency เหล่านั้น
เพื่อใช้การกำหนดค่า 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")) } ดึงดูดdependencies { // 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') } |
กำหนดค่าทรัพยากร Dependency สำหรับตัวแปรบิลด์ที่เฉพาะเจาะจง
การกำหนดค่าทั้งหมดข้างต้นจะใช้การขึ้นต่อกันกับตัวแปรบิลด์ทั้งหมด หากต้องการประกาศทรัพยากร Dependency สำหรับชุดซอร์สของตัวแปรบิลด์ที่เฉพาะเจาะจงเท่านั้น หรือสำหรับชุดซอร์สสำหรับการทดสอบ คุณต้องขึ้นต้นชื่อการกำหนดค่าด้วยตัวพิมพ์ใหญ่และนำหน้าด้วยชื่อของตัวแปรบิลด์หรือชุดซอร์สสำหรับการทดสอบ
เช่น หากต้องการเพิ่มทรัพยากร Dependency ไบนารีระยะไกลเฉพาะในเวอร์ชันผลิตภัณฑ์ "ฟรี"
โดยใช้การกำหนดค่า implementation ให้ใช้ดังนี้
Kotlin
dependencies { freeImplementation("com.google.firebase:firebase-ads:21.5.1") }
ดึงดูด
dependencies { freeImplementation 'com.google.firebase:firebase-ads:21.5.1' }
อย่างไรก็ตาม หากต้องการเพิ่มทรัพยากร Dependency สำหรับตัวแปรที่รวมเวอร์ชันผลิตภัณฑ์และประเภทบิลด์ คุณต้องเริ่มต้นชื่อการกำหนดค่าดังนี้
Kotlin
// Initializes a placeholder for the freeDebugImplementation dependency configuration. val freeDebugImplementation by configurations.creating dependencies { freeDebugImplementation(project(":free-support")) }
ดึงดูด
configurations { // Initializes a placeholder for the freeDebugImplementation dependency configuration. freeDebugImplementation {} } dependencies { freeDebugImplementation project(":free-support") }
หากต้องการเพิ่มทรัพยากร Dependency 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") }
ดึงดูด
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 หลายไฟล์
ข้อมูลทรัพยากร Dependency สำหรับ 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 จะแสดงคำเตือนของเครื่องมือวิเคราะห์ซอร์สโค้ดในไฟล์แคตตาล็อกเวอร์ชันและกล่องโต้ตอบโครงสร้างโปรเจ็กต์สำหรับ SDK สาธารณะในดัชนี SDK ของ Google Play เมื่อมีปัญหาต่อไปนี้
- ผู้เขียน SDK จะทำเครื่องหมายว่า SDK ล้าสมัย
- SDK ละเมิดนโยบายของ Play
- SDK มีช่องโหว่ด้านความปลอดภัยที่ทราบ
- ผู้เขียนได้เลิกใช้งาน SDK แล้ว
คำเตือนเป็นสัญญาณที่บ่งบอกว่าคุณควรจะอัปเดตทรัพยากร Dependency เหล่านั้น เนื่องจาก การใช้เวอร์ชันที่ล้าสมัยอาจทำให้คุณเผยแพร่ไปยัง 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")) }
ดึงดูด
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" การประกาศทรัพยากร Dependency ของไบนารีระยะไกล เป็นรูปแบบย่อของรายการต่อไปนี้
Kotlin
implementation(group = "com.example.android", name = "app-magic", version = "12.3")
ดึงดูด
implementation group: 'com.example.android', name: 'app-magic', version: '12.3'
ไฟล์บิลด์ยังประกาศการขึ้นต่อกันในโมดูลไลบรารี Android ชื่อ "mylibrary" ด้วย ซึ่งชื่อนี้ต้องตรงกับชื่อไลบรารีที่กำหนดด้วย include: ในไฟล์ settings.gradle.kts เมื่อคุณสร้างแอป ระบบบิลด์จะ
คอมไพล์โมดูลไลบรารีและแพ็กเนื้อหาที่คอมไพล์แล้วใน
แอป
ไฟล์บิลด์ยังประกาศทรัพยากร Dependency ในปลั๊กอิน Android Gradle
(com.application.android) ด้วย หากมีหลายโมดูลที่ใช้ปลั๊กอินเดียวกัน
คุณจะมีปลั๊กอินได้เพียงเวอร์ชันเดียวในเส้นทางคลาสของบิลด์
ในทุกโมดูล แทนที่จะระบุเวอร์ชันในสคริปต์บิลด์ของแต่ละโมดูล คุณควรรวมทรัพยากร Dependency ของปลั๊กอินไว้ในสคริปต์บิลด์รูทพร้อมกับเวอร์ชัน และระบุว่าไม่ต้องใช้ การเพิ่ม apply false จะบอก Gradle ให้บันทึกเวอร์ชันของปลั๊กอิน แต่ไม่ให้ใช้ในบิลด์รูท
โดยปกติแล้ว สคริปต์บิลด์รูทจะว่างเปล่ายกเว้นบล็อก plugins นี้
Kotlin
plugins { id("org.jetbrains.kotlin.android") version "1.9.0" apply false }
ดึงดูด
plugins { id ‘com.android.application’ version ‘8.3.0-rc02’ apply false }
หากมีโปรเจ็กต์แบบโมดูลเดียว คุณสามารถระบุเวอร์ชันอย่างชัดเจนใน สคริปต์บิลด์ระดับโมดูลและปล่อยให้สคริปต์บิลด์ระดับโปรเจ็กต์ว่างไว้ได้
Kotlin
plugins { id("com.android.application") version "8.3.0" }
ดึงดูด
plugins { id 'com.android.application' version '8.3.0-rc02' }