15 March 2015

ไฟล์ AAR คืออะไร และแตกต่างอย่างไรกับ JAR

Updated on


        หลังจากที่ Android Studio ปล่อยออกมาให้ใช้งาน อาจจะมีผู้ที่หลงเข้ามาอ่านบางท่านสังเกตเห็นไฟล์ที่มีนามสกุลเป็น .aar (Android ARchive) กันอยู่บ้าง ซึ่งไฟล์ดังกล่าวนี้ก็เป็นไฟล์ไลบรารีแบบเดียวกับ .jar

        แต่ทว่ามันต่างกันยังไงล่ะ?

        ก่อนอื่นผู้ที่หลงเข้ามาอ่านต้องรู้จักกับไฟล์ .jar เสียก่อน โดยไฟล์ .jar เป็นไฟล์โปรแกรมสำหรับภาษา JAVA ที่ถูกรวมกันเป็นไฟล์เดียว ซึ่งในการพัฒนาแอพแอนดรอยด์ก็จะคุ้นกับไฟล์นี้ว่าเป็นไฟล์ไลบรารีซะมากกว่า เพราะไลบรารีหลายๆที่ถูกเขียนขึ้นจาก JAVA จึงทำให้สามารถรวมเป็นไฟล์ .jar แล้วนำไปใช้งานในโปรเจคของแอนดรอยด์ได้

        แต่ทว่าในโปรเจคแอนดรอยด์นั้นประกอบไปด้วยไฟล์ต่างๆหลากหลายนามสกุล ไม่ว่าจะ .java .xml หรือ .so เป็นต้น ดังนั้นเวลาที่เขียนไลบรารีขึ้นมาซักตัวที่มีการเรียกใช้งานไฟล์ที่ไม่ใช่ .java (เช่น res/layout/my_layout.xml) มันจะไม่สามารถรวมไว้ในไฟล์ .jar ได้


        ทั้งนี้ก็เพราะว่า .jar มีไว้สำหรับไฟล์ .java เท่านั้น ดังนั้นไลบรารีบางตัวที่มีการเรียกใช้ Resource อื่นๆนอกเหนือจาก .java (เช่นไฟล์ .xml ต่างๆที่อยู่ในโฟลเดอร์ res) ก็จะไม่สามารถเรียกใช้งานได้

        และด้วยปัญหาดังกล่าวนี้จึงทำให้ไลบรารีบางตัวไม่สามารถทำให้อยู่ในรูปของ .jar ได้ ต้องเอาไปใช้งานทั้งโปรเจค (ใช้วิธ๊ Module Dependencies) ซึ่งก็อาจจะยุ่งยากไปบ้าง

        ดังนั้นไฟล์ .aar จึงถือกำเนิดเพื่อแก้ไขปัญหานี้ โดยที่ไฟล์ .aar เกิดมาเพื่อเก็บไลบรารีของโปรเจคแอนดรอยด์โดยเฉพาะ สามารถเก็บได้ทั้ง .java, .xml, .so หรือไฟล์ใดๆที่ใช้งานในโปรเจคแอนดรอยด์ (proguard.txt ก็ยังได้) แล้วนำไฟล์ดังกล่าวไปเรียกใช้งานในโปรเจคแอนดรอยด์ตัวอื่นๆได้เลย

        โดยที่โครงสร้างของ .aar แท้จริงแล้วก็เป็นแค่ Zip File หนึ่งตัวเท่านั้นแหละ ถ้าลองเปลี่ยนนามสกุลไฟล์เป็น .zip ก็จะพบว่าสามารถแตกไฟล์แล้วจะเห็นว่าโครงสร้างโปรเจคแอนดรอยด์ตามปกติเลย




        แต่ก็ใช่ว่าจะเอาไฟล์ .aar มาแตกไฟล์แล้วเปิดบน Android Studio เพื่อแก้ไขโค๊ดได้ทันที เพราะ .java ในไลบรารีตัวนั้นๆจะถูกรวบให้กลายเป็น classes.jar แทน และไฟล์ต่างๆที่อยู่ในโฟลเดอร์ res ก็จะถูก Index ไว้ใน R.txt อีกทีหนึ่ง ซึ่งเจ้า Android Studio ก็จะใช้เจ้า Gradle จัดการกับไลบรารีดังกล่าวอีกทีหนึ่ง


        ดังนั้นไลบรารีจึงนิยมเปลี่ยนมาเป็น .aar กัน เพื่อให้สะดวกต่อการเรียกใช้งานผ่าน Maven



        ถ้าลองสังเกตดีๆเวลาที่เพิ่มไลบรารีแอนดรอยด์ลงในโปรเจคผ่าน Remote Dependencies ก็จะเป็นการดาวน์โหลดไฟล์ .aar ของไลบรารีนั้นๆใน Maven มาใช้งานนั่นเอง



        ดังนั้นไลบรารีตัวใดที่มีไฟล์อื่นๆที่สำคัญนอกเหนือจากไฟล์ .java ก็จะนิยมใช้เป็นไฟล์ .aar กันแล้ว แต่ถ้าไลบรารีตัวใดที่มีแค่ .java อย่างเดียว ก็สามารถใช้ .jar ได้เลยเช่นกัน