เมื่อประมาณปลายปี 2015 นั้นทางทีมพัฒนา Android
ได้ปล่อยเครื่องมือในการ build ใหม่ออกมาชื่อว่า Jack and Jill
- Jack (Java Android Compiler Kit)
- Jill (Jack Intermediate Library Linking)
เริ่มด้วยการอธิบายขั้นตอนการทำงานแบบเดิมก่อนว่าเป็นอย่างไร ?
เป็นการใช้- javac สำหรับการ compile java code ไปเป็น java byte code
- dex สำหรับการแปลง java byte code เป็นไปไฟล์ DEX (Dalvik Executabel) หรือ Dalvik byte code นั่นเอง เพื่อ optimize เพื่อให้สามารถทำงานบนอุปกรณ์ที่มีจำกัดทั้ง CPU และ Memory
คำถามต่อมาคือพวก proguard, jacoco มันทำงานตรงไหนกันล่ะ ?
คำตอบที่ได้กลับมาคือ เครื่องมือเหล่านี้มันทำงานกับ java byte code ทั้งหมด ซึ่งทำให้เราสามารถปรับปรุง java byte code ได้เลย แสดงการทำงานดังรูป ทำให้เราเข้าใจ และ เห็นภาพว่า 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 ขั้นตอนคือ
- ทำการ compile java code เป็น java byte code
- ทำการปรับปรุง java byte code
- ทำการแปลงเป็นไฟล์ DEX
ดังนั้นแนวทางใหม่ของทีมพัฒนา Android คือ Jack and Jill
มันยังคงเป็น Experiment Tool นะครับ โดยที่ Jack ย่อมาจาก (Java Android Compiler Kit) ทำการ compile java code คล้ายกับ javac เลย แต่ผลลัพธ์ที่ได้จาก Jack คือ ไฟล์ DEX หรือ Android byte code เลย แสดงการทำงานดังรูป สังเกตุไหมว่า เป็นการตัดขั้นตอนการทำงานตรงกลางออกไป แน่นอนว่า ย่อมทำให้ขึ้นการทำงานเร็วขึ้นสิ !! ใช้ได้กับ build tool 21.1.1 ขึ้นไปนะคำถามต่อมาคือ แล้วพวก module/library ต่าง ๆ ล่ะ จะนำเข้ามาใช้ได้อย่างไร ?
คำตอบคือ Jill (Jack Intermediate Library Linking) นั่นเอง ทำการแปลง java byte code ไปอยู่ในรูปแบบที่เรียกว่า jack library file สำหรับเป็นข้อมูลเพื่อส่งไปยัง Jack แสดงการทำงานดังรูปคำถามต่อมาแล้วเรื่องการจัดการ java byte code ล่ะ เช่น Proguard, Jacoco และ Retrolambda ?
คำตอบคือ- Pro guard นั้นมันอยู่ใน Jack อยู่แล้ว
- ไม่สนับสนุน Jacoco !!
- ส่วน Retrolambda ไม่จำเป็นแล้ว เพราะว่าตอนนี้สนับสนุน Lambda ใน Java 8 แล้ว
- นั่นแสดงว่า มันไม่สนับสนุนการปรับปรุง แก้ไข java byte code เหมือนเดิมอีกต่อไป !!
- ถ้าระบบใหญ่ ๆ จะเกิด OutOfMemory ได้อีกด้วย ดังนั้นให้ทำการเพิ่ม Memory ให้กับการทำงานด้วยนะ !!