ภาพรวมของบิลด์ Gradle

โดยทั่วไปแล้ว แอปพลิเคชัน Android จะสร้างขึ้นโดยใช้บิลด์ Gradle ระบบ ก่อนที่เราจะเจาะลึกรายละเอียดเกี่ยวกับวิธีกำหนดค่าบิลด์ เราจะ สำรวจแนวคิดที่อยู่เบื้องหลังการสร้างเพื่อให้คุณดูทั้งระบบได้

งานสร้างคืออะไร

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

Tasks สรุปคำสั่งที่แปลอินพุตเป็น เอาต์พุต ปลั๊กอินจะกำหนดงานและการกำหนดค่า กำลังนำไปใช้ ปลั๊กอินสำหรับบิลด์จะบันทึกงานของตัวเองและต่อสายเข้าด้วยกันโดยใช้ อินพุตและเอาต์พุต เช่น การใช้ปลั๊กอิน Android Gradle (AGP) ลงในไฟล์บิลด์จะบันทึกงานทั้งหมดที่จำเป็นในการสร้าง APK หรือ คลัง Android ปลั๊กอิน java-library ช่วยให้คุณสร้าง Jar จากซอร์สโค้ดของ Java ได้ โค้ด มีปลั๊กอินที่คล้ายกันสำหรับ Kotlin และภาษาอื่นๆ แต่ปลั๊กอินอื่นๆ มีไว้เพื่อขยายปลั๊กอิน ตัวอย่างเช่น ปลั๊กอิน protobuf มีไว้เพื่อเพิ่ม Protobuf สนับสนุนปลั๊กอินที่มีอยู่ เช่น AGP หรือ java-library

Gradle ใช้รูปแบบมากกว่าการกำหนดค่า เพื่อให้ปลั๊กอินมาพร้อมกับ เริ่มต้นโดยค่าเริ่มต้น แต่คุณสามารถกำหนดค่าบิลด์เพิ่มเติมผ่าน ภาษาเฉพาะโดเมน (DSL) แบบประกาศ DSL ได้รับการออกแบบ ดังนั้น คุณสามารถระบุอะไรที่ควรสร้าง แทนที่จะเป็นวิธีการสร้าง ตรรกะใน ปลั๊กอินจะจัดการ "วิธีการ" การกำหนดค่านั้นมีการระบุผ่าน สร้างไฟล์ในโปรเจ็กต์ (และโปรเจ็กต์ย่อย)

อินพุตงานอาจเป็นไฟล์และไดเรกทอรี ตลอดจนข้อมูลอื่นๆ ที่เข้ารหัสแบบ ประเภท Java (จำนวนเต็ม สตริง หรือคลาสที่กำหนดเอง) เอาต์พุตต้องเป็นไดเรกทอรีเท่านั้น หรือไฟล์ที่ต้องเขียน ลงในดิสก์ การเดินสายไฟเอาต์พุตของงานไปยังเครือข่ายอื่น จะลิงก์งานเข้าด้วยกันเพื่อให้งานหนึ่งทำงานก่อนอีกงานหนึ่ง

ในขณะที่ Gradle รองรับการเขียนโค้ดที่กำหนดเองและการประกาศงานในบิลด์ของคุณ อาจทำให้เครื่องมือทำความเข้าใจบิลด์และ ให้คุณดูแลรักษา เช่น คุณสามารถทดสอบโค้ดภายในปลั๊กอินได้ แต่ไม่อยู่ในไฟล์บิลด์ คุณควรจำกัดตรรกะของบิลด์และงาน กับปลั๊กอิน (ที่คุณหรือบุคคลอื่นกำหนด) และประกาศวิธีที่คุณ ต้องการใช้ตรรกะนั้นในไฟล์บิลด์ของคุณ

จะเกิดอะไรขึ้นเมื่อบิลด์ Gradle ทำงาน

บิลด์ Gradle จะแบ่งออกเป็น 3 ระยะ โดยแต่ละระยะจะทํางานแตกต่างกัน ของโค้ดที่คุณกำหนดในไฟล์บิลด์

  • การเริ่มต้นจะกําหนดโปรเจ็กต์และโปรเจ็กต์ย่อยที่รวมอยู่ในโปรเจ็กต์ บิลด์ แล้วตั้งค่าคลาสพาธที่มีไฟล์บิลด์และใช้ ปลั๊กอิน ระยะนี้จะมุ่งเน้นไปที่ไฟล์การตั้งค่าที่คุณประกาศโปรเจ็กต์เพื่อ ตำแหน่งและตำแหน่งที่จะดึงข้อมูลปลั๊กอินและไลบรารี
  • การกำหนดค่าจะลงทะเบียนงานสำหรับแต่ละโปรเจ็กต์ และเรียกใช้บิลด์ เพื่อใช้ข้อกำหนดบิลด์ของผู้ใช้ โปรดทราบว่า รหัสการกำหนดค่าของคุณจะไม่มีสิทธิ์เข้าถึงข้อมูลหรือไฟล์ที่สร้างขึ้น ระหว่างการดำเนินการ
  • การดำเนินการจะทำ "การสร้าง" จริง ของแอปพลิเคชันของคุณ เอาต์พุต คือกราฟแบบ Acyclic โดยตรง (DAG) ของงาน แสดงขั้นตอนบิลด์ที่จำเป็นทั้งหมดที่ผู้ใช้ขอ ( งานที่ระบุในบรรทัดคำสั่งหรือเป็นค่าเริ่มต้นในไฟล์บิลด์) ช่วงเวลานี้ กราฟแสดงความสัมพันธ์ระหว่างงาน ทั้งโดยตรงใน หรืออิงตามอินพุตและเอาต์พุต หากงานมีข้อมูลที่ เป็นเอาต์พุตของงานอื่น งานนั้นจะต้องทำงานหลังจากงานอื่น ช่วงเวลานี้ เฟสใช้งานที่ล้าสมัยตามลำดับที่กำหนดไว้ในกราฟ หากงาน ไม่มีการเปลี่ยนแปลงตั้งแต่การดำเนินการครั้งล่าสุด Gradle จะข้ามอินพุตไป

ดูข้อมูลเพิ่มเติมได้ที่วงจรของการสร้าง Gradle

การกำหนดค่า DSL

Gradle ใช้ภาษาเฉพาะโดเมน (DSL) ในการกำหนดค่า งานสร้าง วิธีการประกาศสิทธิ์นี้จะมุ่งเน้นที่การระบุข้อมูลของคุณมากกว่า การเขียนคำสั่งทีละขั้นตอน (ที่จำเป็น)

DSL จะพยายามทำให้ทุกคน ผู้เชี่ยวชาญโดเมน และโปรแกรมเมอร์ มีส่วนร่วมในโครงการ ซึ่งเป็นการกำหนดภาษาเล็กๆ ที่แสดงถึงข้อมูลใน อย่างเป็นธรรมชาติมากขึ้น ปลั๊กอิน Gradle ขยาย DSL เพื่อกำหนดค่าข้อมูลที่ปลั๊กอิน สำหรับงานของตนเอง

ตัวอย่างเช่น การกำหนดค่าส่วน Android ของบิลด์อาจมีลักษณะดังนี้

Kotlin

android {
    namespace = "com.example.app"
    compileSdk = 34
    // ...

    defaultConfig {
        applicationId = "com.example.app"
        minSdk = 34
        // ...
    }
}

ดึงดูด

android {
    namespace 'com.example.myapplication'
    compileSdk 34
    // ...

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdk 24
        // ...
    }
}

เบื้องหลังการทำงาน รหัส DSL จะคล้ายกับ

fun Project.android(configure: ApplicationExtension.() -> Unit) {
    ...
}

interface ApplicationExtension {
    var compileSdk: Int
    var namespace: String?

    val defaultConfig: DefaultConfig

    fun defaultConfig(configure: DefaultConfig.() -> Unit) {
        ...
    }
}

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

ทรัพยากร Dependency ภายนอก

ระบบบิลด์ของ Maven ได้ใช้ข้อกำหนดจำเพาะการขึ้นต่อกัน และพื้นที่จัดเก็บข้อมูลและการจัดการ ไลบรารีจะเก็บอยู่ใน repositories (เซิร์ฟเวอร์หรือไดเรกทอรี) ที่มีข้อมูลเมตาซึ่งรวมถึง เวอร์ชันและทรัพยากร Dependency ในไลบรารีอื่นๆ คุณระบุ ที่เก็บเพื่อค้นหา เวอร์ชันของทรัพยากร Dependency ที่ต้องการใช้ และ ระบบบิลด์ ดาวน์โหลดส่วนขยายระหว่างการสร้าง

อาร์ติแฟกต์ Maven จะระบุตามชื่อกลุ่ม (บริษัท นักพัฒนาแอป ฯลฯ) name (ชื่อไลบรารี) และเวอร์ชันของอาร์ติแฟกต์นั้น โดยทั่วไป แสดงเป็น group:artifact:version

วิธีนี้จะช่วยปรับปรุงการจัดการบิลด์ได้อย่างมาก คุณจะได้ยินเรื่องนี้ ที่เก็บที่เรียกว่า "ที่เก็บของ Maven" แต่ทั้งหมดนี้ขึ้นอยู่กับวิธีที่ อาร์ติแฟกต์เหล่านี้จะได้รับเป็นแพ็กเกจและเผยแพร่แล้ว ที่เก็บและข้อมูลเมตาเหล่านี้ ที่ใช้ซ้ำในระบบบิลด์ต่างๆ รวมถึง Gradle (และ Gradle สามารถเผยแพร่ไปยัง ที่เก็บเหล่านี้) ที่เก็บสาธารณะอนุญาตให้แชร์ให้ทุกคนใช้ได้ และ ที่เก็บของบริษัทจะเก็บทรัพยากร Dependency ภายในไว้

นอกจากนี้ คุณยังแยกโปรเจ็กต์เป็นโปรเจ็กต์ย่อยได้ด้วย (หรือที่เรียกว่า "โมดูล" ใน Android Studio) ซึ่งใช้เป็น ทรัพยากร Dependency แต่ละโปรเจ็กต์ย่อยจะสร้างเอาต์พุต (เช่น jar) ที่สามารถ ใช้โดยโปรเจ็กต์ย่อยหรือโปรเจ็กต์ระดับบนสุด การดำเนินการนี้จะช่วยปรับปรุงเวลาในการสร้าง ด้วยการแยกส่วนที่ต้องสร้างใหม่ รวมทั้งแยกออกจากกันได้ดีขึ้น ความรับผิดชอบในใบสมัคร

เราจะดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีระบุทรัพยากร Dependency ในเพิ่มบิลด์ ทรัพยากร Dependency

สร้างตัวแปร

เมื่อคุณสร้างแอปพลิเคชัน Android คุณมักจะต้องสร้าง variants รูปแบบมีโค้ดที่แตกต่างกันหรือสร้างขึ้นด้วยโค้ดที่แตกต่างกัน และประกอบด้วยประเภทบิลด์และรสชาติของผลิตภัณฑ์

ประเภทบิลด์จะแตกต่างกันไปตามตัวเลือกบิลด์ที่ประกาศ AGP จะตั้งค่า "รุ่น" โดยค่าเริ่มต้น และ "แก้ไขข้อบกพร่อง" ประเภทต่างๆ มากมายได้ แต่คุณจะสามารถปรับเปลี่ยนและเพิ่มเติมได้อีก (อาจจะเป็น การทดลองใช้หรือการทดสอบภายใน)

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

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

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

AGP สร้างตัวแปรสําหรับชุดค่าผสมของประเภทบิลด์และเวอร์ชันผลิตภัณฑ์แต่ละรายการ ถ้า คุณไม่ได้กำหนดเวอร์ชัน ระบบจะตั้งชื่อตัวแปรตามประเภทบิลด์ หากคุณ กำหนดทั้ง 2 อย่าง ตัวแปรมีชื่อว่า <flavor><Buildtype> ตัวอย่างเช่น มีบิลด์ ประเภท release และ debug และเวอร์ชัน demo และ full แล้ว AGP จะสร้าง ตัวแปร:

  • demoRelease
  • demoDebug
  • fullRelease
  • fullDebug

ขั้นตอนถัดไป

ตอนนี้คุณก็ได้เห็นแนวคิดของบิลด์แล้ว ก็มาดูบิลด์ของ Android ในโปรเจ็กต์ของคุณ