Android Archive Library (aar) เทียบกับ jar มาตรฐาน


131

ฉันได้อ่านบทความเกี่ยวกับการนำ Gradle มาใช้เป็นระบบสร้างมาตรฐานสำหรับแอป Android มาจากการพัฒนา Java มาตรฐานฉันมักจะพึ่งพาไฟล์jarเพื่อสร้างโครงการของฉัน อย่างไรก็ตามดูเหมือนว่า Android ยังมีแพ็คเกจaarซึ่งเทียบเท่ากับไฟล์dllในระบบปฏิบัติการ Windows ดังที่กล่าวไว้ที่นี่ :

ขั้นแรกคุณต้องตระหนักว่าแพลตฟอร์ม Android ไม่อนุญาตให้ใช้ "ไลบรารีที่ใช้ร่วมกัน" ระดับแอปพลิเคชัน ในแพลตฟอร์มภาษาการเขียนโปรแกรม "ดั้งเดิม" C, C ++, Java คุณตั้งชื่อเรามีกลไกการแชร์รันไทม์ไลบรารีนี้ (เช่น DLL บน Windows, DSO บน Unix, Jar บน JVM เป็นต้น) อย่างไรก็ตามบน Android คุณไม่สามารถทำได้เว้นแต่คุณจะเป็น Google หรือผู้ผลิตโทรศัพท์มือถือ (ดูเชิงอรรถ 1 ด้านล่าง) ในฐานะผู้พัฒนาแอปพลิเคชันสิ่งนี้อาจเป็นข้อ จำกัด พื้นฐาน รหัส“ การแบ่งปัน” หรือ“ การนำกลับมาใช้ใหม่” ทั้งในเวลาสร้างและเวลาดำเนินการเป็นส่วนที่สำคัญมากในแนวปฏิบัติด้านวิศวกรรมซอฟต์แวร์ สิ่งนี้ค่อนข้างยาก (ไม่ใช่เป็นไปไม่ได้ แต่ยากกว่า) บน Android เนื่องจากข้อ จำกัด ดังกล่าว

อย่างไรก็ตามฉันมีข้อสงสัยเกี่ยวกับแนวคิดนี้ ผมหมายถึงเมื่อนักพัฒนาควรจะให้ความสนใจรวมทั้งAARอ้างอิงในการประยุกต์ใช้ของตนหรือไม่ การอ้างอิงนี้กระชับกับเวอร์ชันขั้นต่ำของ SDK หรือไม่

ตัวอย่างเช่นในโครงการหนึ่งฉันเข้าถึงพอร์ต COM ซึ่งฉันใช้ไลบรารี. so ที่คอมไพล์ล่วงหน้าของ NDK ฉันต้องสร้าง aar หรือไม่หากต้องการแชร์ยูทิลิตี้นี้

คำตอบ:


221

AARไฟล์คล้ายกับJars มากกว่าDlls ด้วยเหตุผลต่อไปนี้:

Dllสามารถใช้ร่วมกันระหว่างแอปพลิเคชันโดยที่AARs และขวดบรรจุอยู่ในแอปของคุณ

AARs กับJars:

ความแตกต่างที่สำคัญระหว่าง a Jarและ a AARคือAARทรัพยากรต่างๆเช่นlayouts, drawablesฯลฯ ทำให้ง่ายต่อการสร้างองค์ประกอบภาพในตัว ตัวอย่างเช่นหากคุณมีแอปหลายแอปที่ใช้หน้าจอการเข้าสู่ระบบเดียวกันJarคุณสามารถแชร์ชั้นเรียนได้ แต่ไม่สามารถใช้เลย์เอาต์สไตล์ ฯลฯ ได้คุณยังต้องทำซ้ำ ด้วยAARทุกอย่างรวมอยู่ในแพ็คเกจเดียวที่เรียบร้อย

สรุปได้ว่าAARs เป็นก้าวสำคัญในทิศทางที่ถูกต้อง

หมายเหตุ:
ความพยายามที่คล้ายกันเกิดขึ้นกับapk-libs แต่ตอนนี้ล้าสมัยแล้วเนื่องจากAARs ดีกว่ามาก


@unify. มีวิธีใดบ้างที่เราสามารถป้องกันไม่ให้ไฟล์ aar - ทำให้ห้องสมุดสับสน
abh22ishek

ฉันสับสนกับคำตอบนี้ คำพูดของบล็อกแรกระบุว่า "aars and jar รวมอยู่ในแอปของคุณ" ไม่ใช่ "แชร์ข้ามแอปพลิเคชัน" แต่คำพูดของบล็อกที่สองบอกเป็นนัยว่า aars ช่วยให้คุณสามารถแบ่งปันชั้นเรียนและทรัพยากรอื่น ๆ ระหว่างหลาย ๆ แอปได้หรือไม่?
LarsH

5
@LarH ฉันคิดว่ามันหมายความว่าคุณสามารถแบ่งปันรหัส (ไฟล์ aar) ระหว่างแอปพลิเคชันของคุณได้ แต่จะรวมอยู่ในทุกแพ็คเกจแยกกันเพื่อให้ผู้ใช้ติดตั้งแอปพลิเคชันได้อย่างอิสระ หากติดตั้ง 2 แอปพลิเคชันและทั้งสองใช้ aar เดียวกันรันไทม์ของ Android อาจฉลาดพอที่จะโหลดเพียงครั้งเดียว
Habib

1
ฉันมีปัญหาใหญ่กับไฟล์ AAR ฉันต้องการสร้างไฟล์ AAR และมอบให้กับผู้ขายเพื่อให้มีโซลูชันการชำระเงินกับธุรกิจของเรา และฉันไม่ต้องการให้พวกเขาแสดงถึงสมาชิกชั้นเรียนของเราและพวกเขาไม่สามารถเรียกวิธีการจากแอปของพวกเขาได้ ฉันมีวิธีใดในการป้องกันรหัสของฉันจากการสะท้อนกลับ
Mohammad moradyar

5
@Mohammadmoradyar คุณสามารถใช้ Proguard ในไลบรารีของคุณเพื่อทำให้ชั้นเรียนของคุณสับสน แต่เช่นเดียวกับ bytecode ที่ใช้ Java ไม่มีวิธีใดที่จะหยุดไม่ให้ผู้อื่นถอดรหัสรหัสของคุณได้
รวม

11

คำสั่ง " ความแตกต่างหลักระหว่าง Jar และ AAR คือ AAR มีทรัพยากรเช่นเลย์เอาต์ drawables เป็นต้น " ไม่สอดคล้องกับข้อกำหนดของไฟล์ JAR ดังนั้นจึงไม่ใช่ความจริง ตามข้อกำหนดไฟล์ JAR :

ไฟล์ JAR เป็นรูปแบบไฟล์ตามรูปแบบไฟล์ ZIP ที่เป็นที่นิยมและใช้สำหรับการรวมไฟล์จำนวนมากให้เป็นไฟล์เดียว ไฟล์ JAR เป็นไฟล์ zip ที่มีไดเร็กทอรี META-INF ที่เป็นทางเลือก

อย่างที่คุณเห็นไม่มีข้อ จำกัด ด้านเนื้อหาที่ห้ามรวมทรัพยากรเช่นเลย์เอาต์สิ่งที่วาดได้เป็นต้นในไฟล์ JAR สำหรับรายละเอียดเพิ่มเติมโปรดดูบทความ 5.3 "การสร้างและการโหลด" ของข้อกำหนดJava® Virtual Machine

ดังนั้นสำหรับคำถาม Android Archive Library (aar) เทียบกับ jar มาตรฐาน คำตอบขึ้นอยู่กับว่าคุณใช้เครื่องมือสร้างอะไร

หากคุณใช้ Android Studio เป็นเครื่องมือสร้าง (ตามลำดับในฐานะผู้จัดโครงการ) คุณจะต้องใช้ไฟล์ * .aar เพื่อแบ่งปันทรัพยากรที่ห่อหุ้มระหว่างโครงการของ Android รูปแบบไฟล์ AAR เป็นส่วนหนึ่งของการสร้าง Android Studio และตามที่แสดงความคิดเห็นในความคิดเห็นอื่น ๆ ที่นี่อินเทอร์เฟซผู้ใช้รองรับรูปแบบ aar สำหรับ Android Libraries

แต่ยกเว้น Android Studio ส่วนที่เหลือของโลกไม่ทราบว่าไฟล์ aar ของสิ่งนั้นคืออะไร (สิ่งประดิษฐ์) ตัวอย่างเช่นหากบิวด์ Android ของคุณใช้ Maven ไฟล์ที่ต้องการสำหรับการแชร์ทรัพยากรจะเป็น jar เนื่องจากเป็นสิ่งประดิษฐ์โครงการ Maven java ดั้งเดิมและไม่มีข้อ จำกัด ว่าจะใส่อะไรลงในไฟล์ jar มาตรฐาน นอกจากนี้ยังมีวิธีอธิบาย Maven รูปแบบไฟล์ใด ๆ รวมถึง aar โดยใช้การปรับปรุงอายุการใช้งานด้วยองค์ประกอบใหม่ ดูตัวอย่างง่ายๆได้ที่นี่ฉันจะสร้างประเภทบรรจุภัณฑ์ใหม่สำหรับ Maven ได้อย่างไร


ฉันจะบอกว่าความแตกต่างคือ JAR มีไว้เพื่อแบ่งปันทรัพยากรประเภทใดก็ได้ในระบบนิเวศของ java ในขณะที่ AAR นั้นมุ่งเน้นไปที่ Android และบังคับให้คุณต้องมีเลย์เอาต์ที่เป็นรูปธรรม
Xtreme Biker

ฉันคิดว่าผู้เขียนคำตอบที่เลือก (@unify) ควรให้ความกระจ่างเกี่ยวกับเรื่องนี้
ฟรี

ฉันไม่รู้เกี่ยวกับโลก Java ที่ยิ่งใหญ่กว่า แต่ในไฟล์ jar ของโลก Android ไม่สามารถรวมทรัพยากรได้ นั่นคือแม้ว่าทรัพยากรจะอยู่ในที่เก็บถาวร. jar แต่ก็จะไม่ถูกนำไปยังโปรเจ็กต์ที่มีอยู่: stackoverflow.com/q/2474904/211292
ThomasW

6

การอ้างอิงในคำถามไม่มีอะไรที่เหมือนกันกับความเป็นจริงในปัจจุบัน แน่นอนว่าเป็นไปได้ที่จะใช้ไลบรารีภายนอกใน Android และมีห้องสมุดมากมายให้ใช้งาน บางทีพวกเขาอาจต้องการบอกว่าแต่ละแอปพลิเคชันจะต้องรวมไลบรารีทั้งหมดที่ต้องการ แต่การนำไลบรารีกลับมาใช้ใหม่ในเวลาสร้าง (การลิงก์แบบคงที่) ไม่ใช่ปัญหา

.aarแตกต่างจากการ.jarมากขึ้นไม่เกินแตกต่างจาก.jar .zipมีแนวคิดบางอย่างเกี่ยวกับประเภทของเนื้อหาที่ควรคาดหวัง แต่ทั้งสองอย่าง.jarและ.aarส่วนใหญ่มักประกอบด้วยคลาสที่คอมไพล์และทรัพยากรเหล่านั้น .aarเพียงแค่ระบุว่าไลบรารีนั้นเฉพาะสำหรับ Android และมีโครงสร้างที่คาดหวังไว้ซึ่งเหมาะสมสำหรับไลบรารีดังกล่าว (แต่.jarก็มีโครงสร้างที่คาดไว้ด้วย)

มุมมองที่ว่า. aar ได้รับการสนับสนุนโดยสตูดิโอ Android เท่านั้นก็ถูกเลิกใช้เช่นกัน ไลบรารีดังกล่าวสามารถปรับใช้กับ Maven Central และเครื่องมือเช่น gradle สามารถอ้างอิงได้โดยใช้คำต่อท้าย @aar ตัวอย่างเช่น:

dependencies {
    compile ('io.github.andviane:uncover:2.0.1@aar')
    ..
}  

การอ้างอิงนี้ใช้งานกลาง Maven

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.