ในงาน Google I/O 2017 นั้นมี session เรื่อง Speeding Up Your Android Gradle Builds
โดยแนะนำเทคนิคต่าง ๆ ในการปรับแต่งการทำงานของ Gradle
เพื่อเพิ่มความเร็วในการ build สำหรับ Android app
เป้าหมายเพื่อเพิ่ม productivity ของนักพัฒนา app นั่นเอง
มาดูกันเลย

Slow builds are not normal !!

ปล. การวัดประสิทธิภาพจะใช้ 3 ค่า คือ

  • Full build
  • Incremental build เมื่อ code java เปลี่ยนแปลง
  • Incremental build เมื่อ resource เปลี่ยนแปลง

โดยแต่ละข้อเป็นเรื่องพื้นฐานที่ต้องเข้าใจและนำไปใช้งานต่อไป
ผลจากการแก้ไขนั้นอาจจะเหมือนหรือแตกต่างกันก็เป็นไปได้
เนื่องจากขึ้นอยู่กับปัจจัยหลาย ๆ อย่าง !!
มาเริ่มกันเลย

1. ใช้งาน Android gradle plugin ล่าสุดจาก maven repository ของ Google

2. หลีกเลี่ยง Legacy multidex

คำถามแรกเลยก็คือ Legacy multidex คืออะไร ?
คำตอบง่ายคือ Multidex + minSdkVersion < 21 นั่นเอง
มันส่งผลให้การ build ช้ามาก ๆ !!

ซึ่งใน Android Studio ตั้งแต่ 2.3 ขึ้นไปจะหลีกเลี่ยงการ build ลักษณะนี้เป็นอย่างมาก
ดังนั้นใน project ไหนที่เป็น Legacy multidex แล้ว
แนะนำให้สร้าง productFlavors ใหม่
เพื่อกำหนด minSdkVersion เป็น 21 ซะ ดังนี้

3. ปิด multi-APK ซะ

ซึ่งความสามารถนี้ไม่จำเป็นสำหรับขั้นตอนการพัฒนาเลย
ดังนั้นให้ทำการปิดไปซะ ใน block splits{} ดังนี้

4. ให้ใช้งาน resource ที่มีขนาดเล็กที่สุดในการพัฒนา

แน่นอนว่าทำการ config เช่นเดียวกับ minSdkVersion นั่นเอง

5. ปิด PNG crunching ซะ !!

ซึ่ง Android studio เปิดความสามารถนี้อยู่แล้ว !!
จะมีผลอย่างมากสำหรับ Full build
แต่ส่วนอื่น ๆ ไม่แตกต่างกันเลย

6. ใช้งาน Instant Run ซะ

รู้หรือยังว่าใน Android Studio แยกออกเป็นสองปุ่มนะ
ระหว่าง Regular Run กับ Instant Run

7. หลีกเลี่ยงการเปลี่ยนแปลง resource ที่ไม่จำเป็น

เช่น versionCode ของ app เป็นต้น
ซึ่งส่งผลต่อเวลาการ build อย่างมาก

8. สำหรับการใช้งาน dependency ต่าง ๆ อย่าใช้ Dynamic version เด็ดขาด

ตัวอย่างเช่น เป็นการบอก gradle ให้ตรวจสอบ version ล่าสุดของ dependency
ซึ่งทำให้เวลาการ build สูงขึ้นมาก

ดังนั้นระบุ version ที่ต้องการไปเลยนะ

9. ระมัดระวังเรื่องของ Memory ที่จอง

แน่นอนว่าแต่ละ project ต้องการ memory ที่แตกต่างกันในการ build
แต่ต้องระมัดระวังเป็นอย่างมาก

10. เปิด Gradle caching ด้วยเสมอ

มีมาใน Gradle 3.5 เป็นต้นมาก
สามารถเปิดการใช้งานดังนี้

ผลจากการปรับปรุงตาม 10 ข้อได้ผลดังนี้

  • Full build เร็วขึ้น 3 เท่า
  • Incremental change สำหรับ Java เร็วขึ้น 12 เท่า
  • Incremental change สำหรับ Resource เร็วขึ้น 3 เท่า

สามารถดูการปรังแต่งเพิ่มเติมได้จาก Github :: Santa tracker android

สำหรับ VDO นี้ยังไม่หมดนะ !!

ยังมีเรื่องของ Multi-module project กับ Android gradle plugin 3.0 มีอะไรเปลี่ยนแปลงบ้าง ?
เพื่อทำให้การ build เร็วขึ้น
แน่นอนว่า ถ้า module ไหนมีการเปลี่ยนแปลงแล้ว
จะต้องทำการ compile ใหม่เสมอ
ทั้ง ๆ ที่การเปลี่ยนแปลงเหล่านั้นไม่ส่งผลกระทบต่อผู้ใช้งานเลย !!

โดยในการอ้างถึง module จะใช้ compile เสมอ
ซึ่งใน VDO บอกว่าผิดอย่างแรงส์

ใน Android gradle plugin 3.0 แนะนำให้ใช้ api หรือ implementation แทน
ส่วน compile นั้นถูก deprecated แล้ววว !!
เพื่อหลีกเลี่ยงการ compile ที่ไม่จำเป็น
นั่นคือช่วยให้การ build เร็วขึ้นเป็นกอง
ดังนี้

คำถามที่ตามมาคือ แล้ว api ต่างกับ implementation อย่างไร ?

api จะเหมือนกับ compile นั่นเอง
จะทำการ import public API จาก module นั้น ๆ มาเป็นของตัวเอง

ส่วน implementation นั้นเพื่อไม่ให้ consumer เห็น public API จาก module นั้น ๆ
ดังนั้นถ้า module นี้เปลี่ยนแปลง ก็จะไม่ทำการ compile นั่นเอง

ผลที่ตามมาคือ แนวคิดแบบ Modular จะมีประโยชน์ขึ้นอย่างมาก
เพราะว่า gradle จะทำการ build แบบ parallel
ลองใช้งานกันดูนะครับ

แล้วมีอะไรต่อไปอีก

สิ่งที่น่าสนใจคือ ทุกสิ่งทุกอย่างผิดพลาดได้เสมอ
ไม่ว่าจะเป็น plugin ที่นำมาใช้
ไม่ว่าจะเป็นโครงสร้างของ code ที่ผิด
ไม่ว่าจะเป็นการแก้ไข build.gradle แบบผิด
ไม่ว่าจะเป็นการกำหนด Memory ที่ผิด ๆ

ดังนั้นเราต้องให้เวลากับการทำความเข้าใจเกี่ยวกับ Gradle และกระบวนการ build มากขึ้น

ถ้าต้องการตัวช่วยสำหรับดูว่าขั้นตอนการ build ช้าอย่างไร ?

Gradle ก็มีตัวช่วยดังนี้

ขอให้สนุกกับการ coding ครับ