Thư viện lưu trữ Android (aar) so với bình chuẩn


131

Tôi đã đọc một số bài viết về việc áp dụng Gradle mới như là hệ thống xây dựng tiêu chuẩn cho các ứng dụng Android. Chà, đến từ sự phát triển Java tiêu chuẩn, tôi thường phụ thuộc vào các tệp jar để xây dựng dự án của mình. Tuy nhiên, dường như Android cũng có các gói aar , tương đương với các tệp dll trong HĐH Windows, như đã đề cập ở đây :

Trước tiên, bạn phải nhận ra rằng nền tảng Android không cho phép các thư viện chia sẻ ở cấp độ ứng dụng. Trong các nền tảng ngôn ngữ lập trình truyền thống, các C, C ++, Java, bạn đặt tên cho nó, chúng tôi có cơ chế chia sẻ thư viện thời gian chạy này. (Ví dụ: DLL trên Windows, DSO trên Unix, Jar trên JVM, v.v.). Tuy nhiên, trên Android, bạn không thể làm điều đó, trừ khi bạn là Google hoặc nhà sản xuất thiết bị cầm tay (Xem chú thích 1 bên dưới). Là một nhà phát triển ứng dụng, đây có thể là một hạn chế cơ bản. Phần mềm chia sẻ trên mạng hay sử dụng lại các phần mềm, cả về thời gian xây dựng và thời gian chạy, là một phần rất quan trọng trong thực hành kỹ thuật phần mềm. Điều này khá khó (không phải là không thể, chỉ khó hơn) trên Android vì những hạn chế nói trên.

Tuy nhiên, tôi có một số nghi ngờ xung quanh khái niệm này. Ý tôi là, khi nào một nhà phát triển nên quan tâm bao gồm cả phụ thuộc aar trong ứng dụng của nó? Là phụ thuộc này được thắt chặt với một số phiên bản tối thiểu SDK?

Ví dụ: trong một dự án tôi truy cập vào cổng COM, nơi tôi sử dụng các thư viện .so được biên dịch trước . Tôi có phải tạo aar nếu tôi muốn chia sẻ tiện ích này không?

Câu trả lời:


221

AARcác tệp tương tự như Jars hơn Dlllà s vì lý do sau:

Dlls có thể được chia sẻ trên các ứng dụng trong đó AARs và lọ được đóng gói trong ứng dụng của bạn.

AARs vs Jars:

Sự khác biệt chính giữa a Jarvà a AARAARbao gồm các tài nguyên như, layouts, drawablesv.v ... Điều này giúp việc tạo các thành phần hình ảnh độc lập dễ dàng hơn rất nhiều. Ví dụ: nếu bạn có nhiều ứng dụng sử dụng cùng một màn hình đăng nhập, với Jars bạn có thể chia sẻ các lớp nhưng không phải bố cục, kiểu, v.v., bạn vẫn phải sao chép chúng. Với AARtất cả mọi thứ được gói trong một gói gọn gàng.

Tóm lại, AARs là một bước tiến lớn theo đúng hướng.

Lưu ý:
Các nỗ lực tương tự đã được thực hiện với apk-libs nhưng hiện tại chúng đã lỗi thời vì AARs tốt hơn nhiều.


@unify. Có cách nào để chúng ta có thể ngăn chặn các tập tin aar - làm xáo trộn thư viện không?
abh22ishek

Tôi bối rối trước câu trả lời này. Trích dẫn khối đầu tiên nói rằng "aars and jar được đóng gói trong ứng dụng của bạn", chứ không phải "chia sẻ trên các ứng dụng"; nhưng trích dẫn khối thứ hai ngụ ý rằng aars cho phép bạn chia sẻ các lớp và các tài nguyên khác giữa nhiều ứng dụng?
LarsH

5
@LarH Tôi nghĩ rằng điều đó có nghĩa là bạn có thể chia sẻ mã (tệp aar) giữa các ứng dụng của mình, nhưng nó sẽ được bao gồm trong mỗi gói riêng biệt để cho phép người dùng cài đặt ứng dụng một cách độc lập. Nếu 2 ứng dụng được cài đặt và cả hai sử dụng cùng một aar, thời gian chạy Android có thể đủ thông minh để tải nó chỉ một lần.
Habib

1
Tôi có vấn đề lớn với các tập tin AAR. Tôi muốn tạo một tệp AAR và cung cấp cho một số thương gia để có giải pháp thanh toán với doanh nghiệp của chúng tôi. và tôi không muốn họ có thể phản ánh các thành viên trong lớp của chúng tôi và họ không thể có cuộc gọi phương thức từ ứng dụng của họ. Tôi có cách nào để bảo vệ mã của tôi khỏi sự phản chiếu.
Mohammad moradyar

5
@Mohammadmoradyar bạn có thể sử dụng Proguard trên thư viện của mình để làm xáo trộn các lớp của bạn nhưng như với bất kỳ mã byte dựa trên Java nào, không có cách nào để ngăn mọi người dịch ngược mã của bạn.
thống nhất

11

Câu lệnh " Sự khác biệt chính giữa Jar và AAR là AAR bao gồm các tài nguyên như bố cục, ngăn kéo, v.v. " không tương ứng với đặc tả tệp JAR và do đó không phải là sự thật. Theo đặc tả tệp JAR :

Tệp JAR là định dạng tệp dựa trên định dạng tệp ZIP phổ biến và được sử dụng để tổng hợp nhiều tệp thành một. Tệp JAR về cơ bản là tệp zip chứa thư mục META-INF tùy chọn.

Như bạn có thể thấy, không có giới hạn nội dung nào cấm bao gồm các tài nguyên như bố cục, hình vẽ, v.v. trong tệp JAR. Để biết thêm chi tiết, xem bài viết 5.3 "Tạo và tải" của Đặc tả máy ảo Java®.

Vì vậy, về câu hỏi Thư viện lưu trữ Android (aar) so với bình chuẩn. Câu trả lời phụ thuộc vào công cụ xây dựng mà bạn đang sử dụng.

Nếu bạn đang sử dụng Android Studio làm công cụ xây dựng (tương ứng là người tổ chức dự án), bạn chắc chắn sẽ sử dụng các tệp * .aar tốt hơn để chia sẻ tài nguyên được đóng gói giữa các dự án Android. Định dạng tệp AAR là một phần của bản dựng Android Studio và như đã nhận xét trong các nhận xét khác ở đây, giao diện người dùng của nó hỗ trợ định dạng aar cho Thư viện Android.

Nhưng ngoại trừ Android Studio, phần còn lại của thế giới không biết tập tin aar đó là gì (tạo tác). Ví dụ: nếu bản dựng Android của bạn dựa trên Maven, tệp ưa thích để chia sẻ tài nguyên sẽ là tệp jar vì đó là tạo phẩm dự án Maven java gốc và không có giới hạn nào phải đặt trong tệp jar chuẩn. Ngoài ra, có một cách để giải thích Maven bất kỳ định dạng tệp nào, bao gồm aar bằng cách sử dụng nâng cao vòng đời với một thành phần mới. Một ví dụ đơn giản có sẵn ở đây Làm cách nào để tạo loại bao bì mới cho Maven?


Tôi sẽ nói rằng sự khác biệt là JAR có nghĩa là một cách để chia sẻ bất kỳ loại tài nguyên nào trong hệ sinh thái java, trong khi AAR là Android tập trung và buộc bạn phải bố trí cụ thể .
Xtreme Biker

Tôi nghĩ rằng tác giả của câu trả lời được chọn (@unify) nên làm rõ một số điều này.
miễn phí

Tôi không biết về thế giới Java rộng lớn hơn, nhưng trong thế giới Android, các tệp jar không thể bao gồm tài nguyên. Đó là, ngay cả khi tài nguyên có trong kho lưu trữ .jar, chúng sẽ không được mang đến dự án bao gồm chúng: stackoverflow.com/q/2474904/211292
ThomasW

6

Các trích dẫn trong câu hỏi không có gì phổ biến với thực tế hiện tại. Tất nhiên có thể sử dụng các thư viện bên ngoài trong Android và có rất nhiều thư viện có sẵn. Có thể họ muốn nói rằng mỗi ứng dụng phải gói tất cả các thư viện cần, nhưng việc sử dụng lại thư viện tại thời điểm xây dựng (liên kết tĩnh) thực sự không phải là vấn đề.

.aarkhác với .jarkhông nhiều hơn .jarkhác nhau từ .zip. Nó có các khái niệm nhất định về loại nội dung nào sẽ được mong đợi ở đó, nhưng cả hai .jar.aarthường xuyên nhất đều chứa các lớp được biên dịch và chúng là tài nguyên. .aarchỉ xác định rằng thư viện là dành riêng cho Android và có một số cấu trúc dự kiến, hợp lý cho các thư viện đó (tốt, .jarcũng có một số cấu trúc dự kiến).

Quan điểm cho rằng .aar chỉ được hỗ trợ bởi studio Android cũng không được chấp nhận. Các thư viện như vậy có thể được triển khai cho Maven Central và các công cụ như gradle có thể tham chiếu chúng bằng hậu tố @aar:

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

để tham khảo triển khai trung tâm Maven này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.