A22_Android02_Gradle

A22_Android02_Gradle

ในบทความก่อนหน้านี้ (A21_Android01_HelloWorld) เราได้ทำความรู้จัก Android และทำ App Hello World แบบง่ายสุดๆกันไปแล้ว คราวนี้เราจะมาพูดถึง Gradle ซึ่งเป็นเครื่องมือที่อยู่เบื้องหลังการ build ของ Android Studio กัน แต่ก่อนจะอ่านต่อผมขออธิบายแบบคร่าวๆสำหรับคนที่ยังไม่รู้ว่าการ build คืออะไรก่อนนะครับ ถ้าใครรู้อยู่แล้วก็ข้ามไปเลยครับ

Build คืออะไร

การ build ใน Android ก็คือการ compile app resources และ source code แล้วห่อให้มันอยู่ในรูป Android Application Package (APK) หรือก็คือไฟล์ .apk ที่เราเอาไปลงใน smartphone หรืออัปโหลดขึ้น play store ได้นั่นแหละครับ ซึ่งความจริงแล้ว การ build นี่มันมีขั้นตอนและต้องใช้ tool เยอะ ดังนั้นการเอา Gradle และ Android plugin เข้ามาใช้มันจะช่วยจัดการขั้นตอนในกรอบเส้นประสีเทาให้เราครับ ดังภาพประกอบ[1]

Gradle คืออะไร

Gradle คือ build toolkit ที่ช่วยจัดการขั้นตอนต่างๆในการ build โดยจะทำงานร่วมกับ Android plugin ใน Android Studio ช่วยให้เราสามารถ build ได้อย่างง่ายดายโดยเราสามารถตั้งค่าต่างๆเกี่ยวกับการ build ได้ด้วย สำหรับผู้ที่ไม่ใช้ Android Studio ก็สามารถ build app ด้วย Gradle และ Android plugin ผ่าน command line ได้เช่นกัน

เพื่อความสะดวกในบทความนี้จะใช้ Android Studio นะครับ ซึ่งตอนที่เราสร้างโปรเจกต์ใหม่ขึ้นมา Android Studio จะสร้างไฟล์บางไฟล์ให้โดยอัตโนมัติ สามารถแบ่งโครงสร้างเป็นระดับได้แก่ Project-level, Module-level และ Sourceset-level ดังภาพประกอบ[1]

จากภาพจะเห็นว่ามีไฟล์ .gradle อยู่ 3 ไฟล์ เพื่อให้ผู้อ่านเห็นภาพมากขึ้นเราจะมาลองเปิดโปรเจกต์ MyAppHello ที่สร้างในบทความที่แล้วขึ้นมาดูกันนะครับ

1. setting.gradle ใน Project-level ไฟล์นี้จะเป็นตัวบอก Gradle ว่าต้อง include module ไหนบ้างตอนที่ build App จากในรูปจะเห็นว่าไฟล์นี้มีบรรทัดเดียวคือ include ‘:app’ แต่ในกรณีที่เป็นโปรเจกต์ใหญ่ๆตรงนี้ก็มักจะมีหลายบรรทัดครับ

2. build.gradle ใน Project-level ไฟล์นี้เป็นตัวกำหนด build configuration ที่เราจะใช้กับทุก module ในโปรเจกต์นี้ 

โดยปกติไฟล์นี้จะประกอบด้วย

2.1 buildscript block ใช้ในการกำหนด repositories และ dependencies สำหรับตัว Gradle เอง ดังนั้นเราไม่ควร include dependencies สำหรับ Module ที่นี่ buildscript block นี้จะประกอบด้วย

  • repositories block จะเป็นตัวบอก Gradle ว่าต้องไปค้นหาหรือดาวน์โหลด dependencies จากที่ไหนในตัวอย่างนี้คือ Google’s Maven และ JCenter 
  • dependencies block จะเป็นตัวบอกว่า Gradle ต้องการใช้ dependencies อะไรบ้าง ในตัวอย่างนี้คือ Android plugin for Gradle version 3.2.1

2.2 allprojects block ใช้ในการกำหนด repositories และ dependencies ที่เราจะใช้กับทุก module ในโปรเจกต์นี้ เช่น library ต่างๆ หรือ third-party plugin ในตัวอย่างนี้กำหนดแค่ repository แต่ยังไม่ได้กำหนด dependency 

2.3 task clean block ใช้สำหรับลบ directory ทุกครั้งที่รันโปรเจกต์

3. build.gradle ใน Module-level ไฟล์นี้จะอยู่ใน directory ของทุก module ในโปรเจกต์ เพื่อใช้ตั้งค่าต่างๆของแต่ละ module ตอน build เช่น buildTypes หรือ productFlavors ฯลฯ มาลองดูตัวอย่างกันครับ

  • บรรทัดแรกเป็นการ apply plugin ก็คือการ import Android plugin เข้ามาเพื่อให้เราใช้ android block ในบรรทัดที่ 3 ได้
  • android block ใช้สำหรับปรับแต่งค่าต่างๆใน App ของเรา เช่น compileSdkVersion จะกำหนด Android API level ของ Gradle ที่ใช้ compile app นี้ เป็นต้น สำหรับค่าอื่นๆสามารถดูรายละเอียดได้จาก https://google.github.io/android-gradle-dsl/current/ 
  • dependencies block จะเป็นตัวบอกว่า module นี้ต้องการใช้ dependencies อะไรบ้าง สามารถดูรายละเอียดเพิ่มเติมได้จาก https://developer.android.com/studio/build/dependencies

ประวัติ Gradle

Gradle เป็น open-source build toolkit พัฒนาโดย Hans Dockter, Adam Murdoch, Szczepan Faber, Peter Niederwieser, Luke Daley, Rene Gröschke และ Daz DeBoer โดยสร้างขึ้นมาบน Apache Ant และ Apache Maven แต่ Gradle เลือกใช้  Groovy-based domain-specific language (DSL) จาก Groovy แทน XML form ที่ Apache Maven ใช้สำหรับเขียนไฟล์ configuration ออกมาครั้งแรกในปี 2007 เวอร์ชันที่เสถียรล่าสุดคือเวอร์ชัน 5.6 ออกในปี 2019

มาลองใช้ Gradle กันเถอะ

ในบทความนี้เราจะมาเขียนโค้ดเพิ่มเข้าไปในโปรเจกต์ MyAppHello เดิมที่สร้างไว้จากบทความที่แล้วโดยสมมติว่า App ของเราต้องการใช้ Library ชื่อ Commons Lang ซึ่งเป็น Library ของ Java โดยเราจะใช้ method หนึ่งของ Library นี้เพื่อทดสอบว่า String ที่เรารับเข้ามาตรงกับค่าที่เรากำหนดไว้ไหม แต่เนื่องจากในที่บทความนี้เราจะไม่ลงลึกเรื่องการเขียนโค้ดและเพื่อให้โค้ดสั้นที่สุดเราจะกำหนดค่า String ที่รับเข้ามาไปเลย

1. เปิด MyAppHello ขึ้นมาแล้วไปที่ไฟล์ MainActivity.java จากนั้นให้เขียนโค้ดเพิ่ม 3 บรรทัดที่ลูกศรชี้ตามนี้

หลังจากเพิ่มโค้ดแล้ว จะเห็นว่ามันมีเสร็จหยึกหยักขีดที่ไฟล์ที่มีปัญหา และจุดที่มีปัญหาในไฟล์ก็จะเป็นตัวอักษรสีแดง เนื่องจากมันไม่รู้จัก lang3 และ StringUtils นั่นเอง ซึ่งแก้ได้ด้วยการเพิ่ม dependencies ของ Library Commons Lang ให้กับ module นี้

2. เนื่องจากเราไม่รู้ว่าต้องพิมพ์ dependencies อย่างไร ตรงนี้ Android Studio มีตัวช่วยให้ครับ เพราะมันให้เราเพิ่ม remote library ได้ โดยไปที่เมนู File > Project Structure…

หมายเหตุ: สำหรับคนที่รู้ก็พิมพ์ที่ไฟล์ build.gradle ของ module ได้เลยครับ

3. จะมีหน้าต่าง Project Structure ปรากฏขึ้นมา ที่แถบด้านซ้ายให้เลือก app จากนั้นเลือก tab Dependencies แล้วกดปุ่มเครื่องหมาย +

4. เลือก 1 Library dependency

5. จากนั้นในหน้าต่าง Choose Library Dependency ให้พิมพ์ในช่องค้นหาว่า commons-lang3 แล้วกดปุ่มค้นหา

6. รอจนค้นหาเสร็จ ให้เลือก org.apache.commons:commons-lang3 (org.apache.commons:commons-lang3:3.9) แล้วกดปุ่ม OK

7. จะเห็นว่ามี org.apache.commons:commons-lang3:3.9 เพิ่มขึ้นมา ให้กดปุ่ม OK

8. ที่หน้า build.gradle ของ Module-level จะเห็นว่ามี org.apache.commons:commons-lang3:3.9 เพิ่มขึ้นมาใน dependencies block และ Gradle จะเริ่มทำการ Sync และ Build

9. รอจนเสร็จ สังเกตว่าเส้นหยักสีแดงและตัวอักษรสีแดงที่บอกข้อผิดพลาดหายไปหมดแล้ว เพียงเท่านี้เราก็สามารถใช้ Commons Lang Library ได้แล้วครับ ไม่ยากเลยใช่ไหมครับ

ประโยชน์ของ Gradle ในแง่ธุรกิจ

Gradle ช่วยลดขั้นตอนและประหยัดเวลาเรื่องการ build App ไปได้อย่างมากไม่ต้องมาทำทีละขั้นเองให้ยุ่งยาก นอกจากนี้มันยังสามารถตั้งค่าต่างๆให้กับ App ของเราเวลา build ได้อีกด้วย เช่น ตั้งค่า productFlavors ให้ build ให้ App ของเราแต่ละเวอร์ชัน (Variant) แสดงผลต่างกัน อาทิ เวอร์ชันทดลองกับเวอร์ชันจริง หรือเวอร์ชันฟรีกับเวอร์ชันเสียเงิน ถ้าเราเขียนโค้ดดีๆและตั้งค่าได้ถูกต้องก็จะสามารถ build App แต่ละเวอร์ชันได้ง่ายๆโดยไม่ต้องแก้โค้ด ทำให้ลดโอกาสเกิดข้อผิดพลาดไปได้มาก

และแน่นอนว่าเวลาเราเขียนโปรแกรมเชิงธุรกิจที่ซับซ้อนขึ้น เราคงไม่เขียนทุกอย่างด้วยตัวเองตั้งแต่ศูนย์ สิ่งที่เราควรทำคือดูว่ามี Library อะไรที่ method ของมันสามารถทำงานที่เราต้องการได้ อย่างเช่น หากต้องการเปรียบเทียบ String ก็สามารถใช้ method equals ของ Commons Lang Library ได้ ฯลฯ ซึ่งหากเราต้องการใช้ Library อะไรก็แค่ใส่เพิ่มเข้าไปใน dependency ในไฟล์ build.gradle แค่นี้ก็สามารถใช้ Library นั้นๆได้อย่างง่ายๆเหมือนตัวอย่างด้านบนแล้วครับ

พื้นฐานที่ควรมีก่อนเขียน App Android

การใช้งาน Android ต้องมีความรู้เรื่อง Java และ Web Programming ครับ

ถ้าผู้อ่านยังไม่มีพื้นฐานเหล่านี้หรือมีแล้วแต่อยากเรียนรู้เพิ่มเติมอย่างลึกซึ้ง นำไปใช้ต่อยอดได้จริง ก็ขอแนะนำคอร์ส Java J104 ของทาง EPT โดยสามารถดูรายละเอียดคอร์สได้โดยคลิกที่นี่ และที่ดีที่สุดคุ้มที่สุดครอบคลุมที่สุดคือคอร์ส Web Programming PHP101-J ของทาง EPT ครับ สามารถดูรายละเอียดคอร์สได้โดยคลิกที่นี่หรือติดต่อได้ที่ 085-350-7540

แล้วพบกันใหม่บทความหน้านะครับ 

ที่มาและเว็บไซต์อ้างอิง

https://expert-programming-tutor.com/tutorial/article/A22_Android02_Gradle.php


ทิ้งคำตอบไว้

This site uses Akismet to reduce spam. Learn how your comment data is processed.