Gradle คือ ระบบบิลด์ ที่ทำงานอัตโนมัติในการคอมไพล์ ทดสอบ และบรรจุแพคเกจแอปพลิเคชัน Android แตกต่างจาก Apache Ant หรือ Maven ตรงที่รองรับบิลด์แบบเพิ่มหน่วยและการแคชผลลัพธ์ เรียนรู้เพิ่มเติมเกี่ยวกับคุณสมบัติได้ที่ เอกสารทางการของ Gradle ตั้งแต่ปี 2013 เครื่องมือนี้ถูกใช้เป็นระบบบิลด์มาตรฐานสำหรับโปรเจกต์ Android ใน Android Studio
ประเด็นสำคัญ
Gradle คือ เครื่องมือทำงานอัตโนมัติบิลด์โอเพนซอร์ส ที่เขียนด้วย Java และทำงานบน JVM มันรับซอร์สโค้ด dependencies และทรัพยากรเป็นอินพุต และสร้างเอาต์พุตเป็นแอปพลิเคชันที่พร้อมใช้งาน — APK หรือ AAB สำหรับ Android แกนกลางของ Gradle ใช้แนวคิดของกราฟแบบไม่มีวงจรแบบมีทิศทาง (DAG) ของงาน โดยแต่ละงานคือหน่วยการทำงานแบบอะตอม และการเชื่อมต่อระหว่างงานกำหนดลำดับการทำงาน แตกต่างจาก Make หรือ Ant ตรงที่ Gradle ไม่ต้องการการอธิบายลำดับขั้นตอนด้วยตนเอง: แค่ประกาศ dependencies ระหว่างงาน ระบบก็จะกำหนดลำดับที่เหมาะสมที่สุดเอง วิธีการนี้ทำให้ Gradle มีความยืดหยุ่นและปรับขนาดได้สำหรับโปรเจกต์ทุกขนาด
ระบบใช้ สามเฟสการทำงาน: การเริ่มต้น (ระบุโปรเจกต์ที่เข้าร่วม) การกำหนดค่า (สร้างกราฟงาน) และการทำงาน (เรียกใช้งานตามลำดับที่ต้องการ) เฟสการกำหนดค่าเป็นจุดแตกต่างสำคัญของ Gradle: สคริปต์บิลด์ทั้งหมดจะทำงานก่อนที่งานจะเริ่ม ทำให้สามารถเปลี่ยนแปลงกราฟแบบไดนามิกตามเงื่อนไขได้ ซึ่งทำให้สามารถเพิ่มงานเฉพาะสำหรับบิลด์บางรูปแบบโดยไม่ต้องทำซ้ำโค้ด บิลด์เดอร์เขียนด้วย Groovy แต่ไฟล์กำหนดค่ารองรับสองภาษา: Groovy DSL และ Kotlin DSL
ปลั๊กอิน Android สำหรับ Gradle ประกอบด้วย com.android.application และ com.android.library ซึ่งเพิ่มงานในโปรเจกต์สำหรับทำงานกับเครื่องมือ Android เมื่อนักพัฒนาเริ่มบิลด์ Gradle จะทำงานตามลำดับเป็นโหล: คอมไพล์ Kotlin และ Java ผ่าน javac หรือ kotlinc ประมวลผลทรัพยากรผ่าน AAPT2 สร้าง R.java คอมไพล์ไบต์โค้ดเป็น DEX ผ่าน D8 หรือ R8 เซ็นชื่อและซิป APK แต่ละงานจะตรวจสอบว่าข้อมูลอินพุตเปลี่ยนแปลงหรือไม่ และหากไม่เปลี่ยนแปลงก็จะใช้ผลลัพธ์ที่แคชไว้ กลไกนี้เรียกว่า บิลด์แบบเพิ่มหน่วย และช่วยเร่งการคอมไพล์ซ้ำ 60–80% เมื่อเทียบกับการสร้างใหม่ทั้งหมด
การกำหนดค่าโมดูล Android ถูกตั้งค่าในบล็อก android ของไฟล์ build.gradle.kts ภายในบล็อกจะกำหนด compileSdk, minSdk, targetSdk, เวอร์ชันแอป, ลายเซ็น และพารามิเตอร์อื่นๆ Gradle จะสร้างบิลด์หลายรูปแบบให้กับแต่ละโมดูลโดยอัตโนมัติ — การรวมกันของประเภท (release, debug) และรสชาติ ตัวอย่างเช่น สำหรับโมดูลที่มีสองรสชาติและสองประเภท Gradle จะสร้างสี่งาน: assembleDemoDebug, assembleDemoRelease, assembleFullDebug, assembleFullRelease งานทั้งหมดนี้สามารถทำงานแยกกันหรือเรียกใช้ด้วยคำสั่งเดียวสำหรับทุกรูปแบบพร้อมกัน
แต่ละโปรเจกต์ Android มี สองระดับการกำหนดค่า: build.gradle.kts ระดับราก (การตั้งค่าสำหรับทุกโมดูล) และ build.gradle.kts ระดับโมดูล (การตั้งค่าสำหรับโมดูลเฉพาะ) ในไฟล์รากจะประกาศปลั๊กอินโดยไม่นำไปใช้ ที่เก็บ และตัวแปรทั่วไป ในไฟล์โมดูล ปลั๊กอินจะถูกนำไปใช้กับโมดูลเฉพาะและกำหนดค่าพารามิเตอร์บิลด์ วิธีการนี้ช่วยให้จัดการเวอร์ชัน dependencies แบบรวมศูนย์ผ่านแค็ตตาล็อกเวอร์ชันหรือบล็อก ext
@Suppress("UnstableApiUsage")
plugins {
id("com.android.application") version "8.2.2"
id("org.jetbrains.kotlin.android") version "1.9.22"
}
android {
namespace = "com.example.myapp"
compileSdk = 34
defaultConfig {
applicationId = "com.example.myapp"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0"
}
}บล็อก dependencies เป็นอีกองค์ประกอบสำคัญของ build.gradle.kts มันแสดงรายการไลบรารี โมดูล และ dependencies ไฟล์ที่แอปพลิเคชันต้องการ Gradle รองรับการกำหนดค่า dependencies หลายแบบ: implementation (ใช้ได้เฉพาะโมดูลปัจจุบัน), api (ใช้ได้กับโมดูลที่ขึ้นต่อกันด้วย), testImplementation (เฉพาะการทดสอบ), androidTestImplementation (สำหรับการทดสอบแบบใช้เครื่องมือ) และ compileOnly (เฉพาะตอนคอมไพล์) แต่ละการกำหนดค่าจัดการการมองเห็นคลาสในกราฟ dependencies ซึ่งส่งผลต่อเวลาบิลด์และขนาดของสิ่งประดิษฐ์สุดท้าย
dependencies {
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
implementation("androidx.activity:activity-compose:1.8.2")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
}Build variant คือ การรวมกันของประเภทบิลด์และรสชาติผลิตภัณฑ์ ที่กำหนดเวอร์ชันแอปด้วยการตั้งค่า โค้ด และทรัพยากรที่ไม่ซ้ำกัน ประเภทบิลด์กำหนดพารามิเตอร์การบรรจุ: debug (พร้อมการดีบักและคำต่อท้าย .debug) หรือ release (พร้อมการทำให้สับสนและลายเซ็น) รสชาติผลิตภัณฑ์กำหนดรูปแบบฟังก์ชัน: ตัวอย่างเช่น demo (เวอร์ชันจำกัด) และ full (เวอร์ชันเต็มพร้อมคุณสมบัติเพิ่มเติม) Gradle สร้างงานสำหรับแต่ละชุดโดยอัตโนมัติ ทำให้สามารถบิลด์ทุกเวอร์ชันด้วยคำสั่งเดียว
android {
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
debug {
applicationIdSuffix = ".debug"
}
}
flavorDimensions += "version"
productFlavors {
create("demo") {
dimension = "version"
applicationIdSuffix = ".demo"
}
create("full") {
dimension = "version"
applicationIdSuffix = ".full"
}
}
}แต่ละ build variant มี ชุดซอร์สแยกต่างหาก Gradle ใช้ไดเรกทอรี src/demo/release, src/full/debug และอื่นๆ ซึ่งเก็บทรัพยากร ไฟล์ Manifest และไฟล์ซอร์สที่ไม่ซ้ำกันสำหรับรูปแบบเฉพาะ โค้ดทั่วไปยังคงอยู่ใน src/main วิธีการนี้ช่วยให้ใช้ตรรกะหลักซ้ำและแทนที่เฉพาะส่วนที่แตกต่าง: สตริง ไอคอน จุดสิ้นสุด API หรือไฟล์กำหนดค่า ชุดซอร์สสามารถแทนที่ทรัพยากรใดๆ จาก main: Manifest, drawable, values หรือแม้แต่คลาส Kotiln เมื่อบิลด์รูปแบบเฉพาะ Gradle จะรวมไฟล์จาก main และชุดซอร์สที่เกี่ยวข้อง โดยไฟล์จากรูปแบบมีลำดับความสำคัญ
ระบบนิเวศปลั๊กอิน Gradle ครอบคลุมทุกขั้นตอนของการพัฒนาแอปพลิเคชัน Android ปลั๊กอินทางการจาก Google ได้แก่ com.android.application (สำหรับโมดูลแอป), com.android.library (สำหรับโมดูลไลบรารี), com.android.test (สำหรับโมดูลทดสอบ) และปลั๊กอิน Kotlin จาก JetBrains ปลั๊กอินเพิ่มงานใหม่ให้กับโปรเจกต์ ขยาย DSL ด้วยบล็อกกำหนดค่าใหม่ และเชื่อมต่อเครื่องมือเพิ่มเติม หากไม่มีปลั๊กอิน com.android.application โปรเจกต์จะไม่สามารถบิลด์ APK ได้: ปลั๊กอินนี้ลงทะเบียนงานเฉพาะ Android ทั้งหมดและเชื่อมโยงเข้ากับกราฟบิลด์
ปลั๊กอินของบุคคลที่สามแก้ไขงานที่เฉพาะเจาะจงมากขึ้น Google Services (com.google.gms.google-services) รวม Firebase และ Google Play Services โดยแทรก google-services.json ในบิลด์โดยอัตโนมัติ Hilt (dagger.hilt.android.plugin) สร้างโค้ด dependency injection ในตอนคอมไพล์ Safe Args (androidx.navigation.safeargs.kotlin) สร้างคลาสที่ปลอดภัยชนิดสำหรับการนำทางระหว่าง Fragment แต่ละปลั๊กอินถูกเพิ่มใน build.gradle.kts ระดับรากผ่านบล็อก plugins และโดยปกติต้องการการกำหนดค่าเพียงเล็กน้อย Gradle แก้ปัญหา dependencies แบบข้ามผ่านระหว่างปลั๊กอินโดยอัตโนมัติและรับประกันความเข้ากันได้ของเวอร์ชันผ่านไฟล์ Bom และแค็ตตาล็อกเวอร์ชัน
งาน (task) คือ หน่วยการทำงานแบบอะตอม ใน Gradle แต่ละงานมีข้อมูลอินพุต ข้อมูลเอาต์พุต และการดำเนินการ งานในตัวสำหรับ Android ได้แก่ assemble (บิลด์ทุกรูปแบบ), lint (ตรวจสอบโค้ด), test (เรียกใช้ unit test) และ clean (ล้างไฟล์ชั่วคราว) นักพัฒนาสามารถเพิ่มงานของตนเองได้โดยใช้ Groovy หรือ Kotlin DSL งานแบบกำหนดเองมีประโยชน์สำหรับการทำงานประจำโดยอัตโนมัติ: สร้างรายงาน คัดลอกสิ่งประดิษฐ์ ปรับใช้บนอุปกรณ์ทดสอบ หรือรวมกับระบบ CI
tasks.register("printBuildInfo") {
description = "แสดงข้อมูลบิลด์"
group = "custom"
doLast {
println("Build variant: ${project.name}")
println("Version: ${android.defaultConfig.versionName}")
}
}แต่ละงานสามารถ ขึ้นอยู่กับงานอื่น ผ่านกลไก dependsOn หากงาน A ขึ้นอยู่กับงาน B Gradle รับประกันว่า B จะทำงานก่อน A ระบบไม่ต้องการการระบุลำดับด้วยตนเองสำหรับแต่ละคู่ — แค่ประกาศ dependencies เท่านั้น Gradle จะสร้างกราฟแบบมีทิศทางที่ปรับให้เหมาะสมสำหรับการทำงานแบบขนานของงานอิสระ งานในตัวของปลั๊กอิน Android เชื่อมโยงกันอยู่แล้ว: lint ขึ้นอยู่กับการคอมไพล์, test ขึ้นอยู่กับ assemble, assembleDebug ขึ้นอยู่กับ compileDebugKotlin นักพัฒนาสามารถแทรกงานของตนเองในโหนดใดๆ ของกราฟโดยใช้ dependsOn, mustRunAfter หรือ shouldRunAfter
หนึ่งในปัญหาที่พบบ่อยคือ ความขัดแย้งของเวอร์ชัน dependencies เมื่อสองไลบรารีต้องการเวอร์ชันที่แตกต่างกันของ dependency แบบข้ามผ่านเดียวกัน Gradle รายงานข้อผิดพลาดความขัดแย้ง แต่ไม่ได้เสนอวิธีแก้ปัญหาอัตโนมัติเสมอไป สำหรับการวินิจฉัย ให้ใช้คำสั่ง ./gradlew :app:dependencies ซึ่งแสดงแผนผัง dependencies ที่สมบูรณ์ แนะนำให้บังคับเวอร์ชันของไลบรารีที่ขัดแย้งผ่านบล็อก resolutionStrategy อีกสถานการณ์ทั่วไปคือ บิลด์ช้า เนื่องจากการขาดการประมวลผลแบบเพิ่มหน่วย ตรวจสอบให้แน่ใจว่าปลั๊กอินทั้งหมดอัปเดตแล้ว Gradle Daemon เปิดใช้งาน (org.gradle.daemon=true) และตั้งค่าหน่วยความจำเพียงพอใน gradle.properties: org.gradle.jvmargs=-Xmx4096m
ปัญหาเกี่ยวกับแคช เกิดขึ้นหลังจากอัปเดต dependencies: Gradle อาจใช้แคชที่เก่าและบิลด์ล้มเหลว วิธีแก้ไขคือเรียกใช้บิลด์ด้วยแฟล็ก --refresh-dependencies หรือล้างแคชด้วยตนเองผ่าน ./gradlew cleanBuildCache ข้อผิดพลาดที่พบบ่อยเป็นอันดับสามคือ ความไม่เข้ากันของเวอร์ชันระหว่าง Android Gradle Plugin (AGP) และ Gradle แต่ละเวอร์ชัน AGP ต้องการ Gradle เวอร์ชันต่ำสุดที่เฉพาะเจาะจง ตารางความเข้ากันได้เผยแพร่บน developer.android.com หากเวอร์ชันไม่เข้ากัน Gradle จะล้มเหลวในขั้นตอนการกำหนดค่าพร้อมข้อความเกี่ยวกับเวอร์ชันต่ำสุดที่ต้องการ ตรวจสอบเสมอว่าเวอร์ชัน wrapper ของ Gradle ตรงตามข้อกำหนดของ AGP
คำถามที่พบบ่อย
Gradle คือ โปรแกรมอัตโนมัติ สำหรับสร้างโปรเจกต์ มันนำซอร์สโค้ดของคุณใน Kotlin หรือ Java เชื่อมต่อไลบรารีจากอินเทอร์เน็ต คอมไพล์ทุกอย่างเป็นไบต์โค้ดและบรรจุเป็น APK มันทำงานบน JVM และใช้สคริปต์แบบประกาศแทนคำสั่งด้วยตนเอง นักพัฒนาเพียงแค่ต้องอธิบายกฎ Gradle ก็จะทำส่วนที่เหลือ
Build.gradle เขียนด้วย Groovy — ภาษาแบบไดนามิกที่มีไวยากรณ์ยืดหยุ่นและมีความเข้มงวดน้อยกว่า Build.gradle.kts ใช้ Kotlin DSL: การกำหนดชนิดที่แข็งแกร่ง การเติมข้อความอัตโนมัติใน Android Studio และการตรวจสอบข้อผิดพลาดตอนคอมไพล์ Google แนะนำ Kotlin DSL สำหรับโปรเจกต์ใหม่ทั้งหมด ไฟล์ Groovy ย้ายได้ง่ายกว่า แต่ไฟล์ Kotlin เชื่อถือได้มากกว่าในการบำรุงรักษา
เปิดใช้งาน Gradle Daemon (org.gradle.daemon=true) และบิลด์แบบขนาน (org.gradle.parallel=true) เพิ่มหน่วยความจำ JVM เป็น 4–8 GB ผ่าน org.gradle.jvmargs ใช้การกำหนดค่าโปรเจกต์ตามความต้องการ (org.gradle.configureondemand=true) สำหรับโปรเจกต์ Android กำหนดค่าแคชงานและบิลด์เฉพาะ ABI ที่ต้องการ ใน Android Studio เรียกใช้ Build Analyzer เพื่อหาจุดคอขวด
Build variant คือการรวมกันของประเภทบิลด์ (เช่น debug หรือ release) และรสชาติผลิตภัณฑ์ (เช่น demo หรือ full) แต่ละรูปแบบสามารถมีชื่อแพคเกจ เวอร์ชัน ทรัพยากร และไฟล์ซอร์สของตัวเอง Gradle สร้างงานบิลด์แยกต่างหากสำหรับแต่ละรูปแบบโดยอัตโนมัติ ซึ่งช่วยให้สามารถบิลด์แอปพลิเคชันหลายเวอร์ชันจากโปรเจกต์เดียว
Dependencies ถูกเพิ่มในบล็อก dependencies ของไฟล์ build.gradle.kts รูปแบบคือ: configuration("group:artifact:version") ตัวอย่างเช่น implementation("androidx.core:core-ktx:1.12.0") สำหรับการทดสอบใช้ testImplementation สำหรับการทดสอบแบบใช้เครื่องมือ — androidTestImplementation การจัดระเบียบเวอร์ชันในแค็ตตาล็อกเวอร์ชันแยกต่างหากผ่านไฟล์ libs.versions.toml สะดวก
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ