Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 2029

ทำความเข้าใจการทำงานของ Jack and Jill ใน Android กันหน่อย

$
0
0

android_04

เมื่อประมาณปลายปี 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 มากขึ้นบ้างนะ

Viewing all articles
Browse latest Browse all 2029

Trending Articles