เมื่อประมาณปลายปี 2015 นั้นทางทีมพัฒนา Android
ได้ปล่อยเครื่องมือในการ build ใหม่ออกมาชื่อว่า Jack and Jill

  • Jack (Java Android Compiler Kit)
  • Jill (Jack Intermediate Library Linking)

เป้าหมายเพื่อเข้ามาปรับปรุงกระบวนการเดิมคือ javac และ dex นั่นเอง
ดังนั้นเรามาทำความเข้ากับเครื่องมือต่าง ๆ เหล่านี้กันหน่อย
ซึ่งจะอยู่ในระบบ Build ของ Android นั่นเอง

ดังนั้นจึงเริ่มไปหาข้อมูลจาก Android Developer ก็เจอดังนี้

อธิบายได้ง่าย และ เข้าใจดี
และไปเจอบทความเรื่อง The dark side of Jack and Jill
อธิบายได้เข้าใจง่าย เลยนำมาสรุปนิดหน่อยดังนี้

เริ่มด้วยการอธิบายขั้นตอนการทำงานแบบเดิมก่อนว่าเป็นอย่างไร ?

เป็นการใช้

  • javac สำหรับการ compile java code ไปเป็น java byte code
  • dex สำหรับการแปลง java byte code เป็นไปไฟล์ DEX (Dalvik Executabel) หรือ Dalvik byte code นั่นเอง เพื่อ optimize เพื่อให้สามารถทำงานบนอุปกรณ์ที่มีจำกัดทั้ง CPU และ Memory

ปล. ปัจจุบันมี runtime ตัวใหม่ชื่อว่า ART (Android RunTime)
ซึ่ง compatible กับ Dalvik

จากนั้นจึงนำไปสร้างเป็นไฟล์ APK ต่อไป
แสดงการทำงานดังรูป

android_01

สังเกตไหมว่า
พวก 3-party library นั้นจะไม่ถูก compile ใหม่ทำให้การทำงานเร็วขึ้น
ดังนั้น ลองคิดสิว่า ถ้าใน project ของเรานั้น
ทำการแยก code ที่ใช้งานซ้ำ ๆ ออกไปเป็น module หรือ library
จากนั้นทำการ import เข้ามาใช้ใน project
น่าจะทำให้ขึ้นตอนการ compile และ build เร็วขึ้นอีกนะ !!

คำถามต่อมาคือพวก proguard, jacoco มันทำงานตรงไหนกันล่ะ ?

คำตอบที่ได้กลับมาคือ
เครื่องมือเหล่านี้มันทำงานกับ java byte code ทั้งหมด
ซึ่งทำให้เราสามารถปรับปรุง java byte code ได้เลย
แสดงการทำงานดังรูป

android_02

ทำให้เราเข้าใจ และ เห็นภาพว่า
Proguard มันเข้าไปวิเคราะห์ java byte code นี่เอง
จากนั้นจึงทำการลบสิ่งที่ไม่ใช้งานออกไป
ทำให้ขนาดของ java byte code มันเล็กลง

Jacoco ทำการวิเคราะห์จาก byte code นี่เอง

ก่อนจะสนับสนุน Java 8 ทำไมถึงใช้งาน Retrolambda ได้
นั่นคือเข้าไปแก้ไขจาก Lambda ของ Java 8 ให้เป็น annonymous inner class นั่นเอง

ซึ่งกระบวนการทำงานต่าง ๆ เหล่านี้จะอยู่ในรูปแบบของ plugin
เรียกกระบวนการเหล่านี้ว่า Post processing
ผลลัพธ์ที่ได้คือ java byte code ใหม่นั่นเอง

มาถึงตรงนี้เราสามารถสรุปขั้นตอนการทำงานได้ 3 ขั้นตอนคือ

  1. ทำการ compile java code เป็น java byte code
  2. ทำการปรับปรุง java byte code
  3. ทำการแปลงเป็นไฟล์ DEX

ผลที่ตามมาคือ
การ build มันช้ามาก ๆ
การทดสอบช้ามาก ๆ
การสร้างไฟล์ APK ช้ามาก ๆ

ยิ่งในระบบงานใหญ่ ๆ จะเจอปัญหาเรื่องจำนวน method เกิน 65K อีก
ก็ต้องแก้ไชปัญหา MultiDex กันอีกก็ยิ่งช้าไปกันใหญ่

ดังนั้นแนวทางใหม่ของทีมพัฒนา Android คือ Jack and Jill

มันยังคงเป็น Experiment Tool นะครับ

โดยที่ Jack ย่อมาจาก (Java Android Compiler Kit)
ทำการ compile java code คล้ายกับ javac เลย
แต่ผลลัพธ์ที่ได้จาก Jack คือ ไฟล์ DEX หรือ Android byte code เลย
แสดงการทำงานดังรูป

android_03

สังเกตุไหมว่า
เป็นการตัดขั้นตอนการทำงานตรงกลางออกไป
แน่นอนว่า ย่อมทำให้ขึ้นการทำงานเร็วขึ้นสิ !!
ใช้ได้กับ build tool 21.1.1 ขึ้นไปนะ

คำถามต่อมาคือ แล้วพวก module/library ต่าง ๆ ล่ะ จะนำเข้ามาใช้ได้อย่างไร ?

คำตอบคือ Jill (Jack Intermediate Library Linking) นั่นเอง
ทำการแปลง java byte code ไปอยู่ในรูปแบบที่เรียกว่า jack library file
สำหรับเป็นข้อมูลเพื่อส่งไปยัง Jack
แสดงการทำงานดังรูป

android_04

คำถามต่อมาแล้วเรื่องการจัดการ java byte code ล่ะ เช่น Proguard, Jacoco และ Retrolambda ?

คำตอบคือ

  • Pro guard นั้นมันอยู่ใน Jack อยู่แล้ว
  • ไม่สนับสนุน Jacoco !!
  • ส่วน Retrolambda ไม่จำเป็นแล้ว เพราะว่าตอนนี้สนับสนุน Lambda ใน Java 8 แล้ว
  • นั่นแสดงว่า มันไม่สนับสนุนการปรับปรุง แก้ไข java byte code เหมือนเดิมอีกต่อไป !!
  • ถ้าระบบใหญ่ ๆ จะเกิด OutOfMemory ได้อีกด้วย ดังนั้นให้ทำการเพิ่ม Memory ให้กับการทำงานด้วยนะ !!

ถึงแม้ว่า Jack and Jill ยังไม่ข้อจำกัดเยอะ
แต่เป็นแนวทางที่ดีสำหรับขั้นตอนการ build ของ android app
และตอนนี้ Jack มันสนับสนุนความสามารถต่าง ๆ ใน Java 8 แล้วนะ
ซึ่งใช้ได้กับ Android N เท่านั้น

มาถึงตรงนี้น่าจะทำให้เราเข้าใจเกี่ยวกับการทำงานภายในการ build android app มากขึ้นบ้างนะ

Tags: