Android Archive Library (aar) vs jar standar

131

Saya telah membaca beberapa artikel tentang adopsi baru Gradle sebagai sistem build standar untuk aplikasi Android. Nah, berasal dari pengembangan Java standar saya biasanya bergantung pada file jar untuk membangun proyek saya. Namun tampaknya Android juga memiliki paket aar , yang setara dengan file dll di OS Windows, seperti yang disebutkan di sini :

Pertama, Anda harus menyadari bahwa platform Android tidak memungkinkan "pustaka bersama" tingkat aplikasi. Dalam platform bahasa pemrograman "tradisional", C, C ++, Java, sebut saja, kami memiliki mekanisme berbagi pustaka runtime ini. (Misalnya, DLL pada Windows, DSO pada Unix, Jar pada JVM, dll.). Di Android, bagaimanapun, Anda tidak dapat melakukan itu, kecuali jika Anda adalah Google atau produsen handset (Lihat Catatan Kaki 1 di bawah). Sebagai pengembang aplikasi, ini bisa menjadi batasan mendasar. "Berbagi" atau "menggunakan kembali" kode, baik pada waktu membangun dan waktu berjalan, adalah bagian yang sangat penting dari praktik rekayasa perangkat lunak. Ini agak sulit (bukan tidak mungkin, hanya lebih sulit) di Android karena keterbatasan yang disebutkan di atas.

Namun, saya ragu dengan konsep ini. Maksudku, ketika harus pengembang akan tertarik termasuk aar dependensi dalam penerapannya? Apakah ketergantungan ini diperketat ke beberapa versi minimum SDK?

Misalnya, dalam satu proyek saya mengakses port COM, yang saya gunakan NDK dikompilasi .so perpustakaan untuk. Apakah saya harus membuat aar jika saya ingin membagikan utilitas ini?

Biker Xtreme
sumber

Jawaban:

221

AARfile lebih mirip dengan Jars daripada Dlls karena alasan berikut:

Dlls dapat dibagikan di aplikasi mana AARs dan guci dikemas dengan aplikasi Anda.

AARs vs Jars:

Perbedaan utama antara a Jardan a AARadalah AARs termasuk sumber daya seperti layouts, drawablesdll. Ini membuatnya lebih mudah untuk membuat komponen visual mandiri. Misalnya jika Anda memiliki beberapa aplikasi yang menggunakan layar login yang sama, JarAnda dapat berbagi kelas tetapi tidak dengan tata letak, gaya, dll., Anda masih harus menduplikatnya. Dengan AARs semuanya dibundel dalam satu paket yang rapi.

Kesimpulannya, AARs adalah langkah besar ke arah yang benar.

Catatan:
Upaya serupa dilakukan dengan apk-libs tetapi sekarang sudah usang karena AARjauh lebih baik.

menyatukan
sumber
@unify. Apakah ada cara agar kita dapat mencegah file aar - mengaburkan perpustakaan?
abh22ishek
Saya bingung dengan jawaban ini. Kutipan blok pertama mengatakan bahwa "guci dan guci dikemas dengan aplikasi Anda", bukan "dibagikan di seluruh aplikasi"; namun kutipan blok kedua menyiratkan bahwa aars memungkinkan Anda berbagi kelas dan sumber daya lainnya antara beberapa aplikasi?
LarsH
5
@LarH Saya pikir itu berarti Anda dapat membagikan kode (file aar) antara aplikasi Anda, tetapi itu akan dimasukkan dalam setiap paket secara terpisah untuk memungkinkan pengguna menginstal aplikasi secara mandiri. Jika 2 aplikasi diinstal dan keduanya menggunakan aar yang sama, runtime android mungkin cukup pintar untuk memuatnya sekali saja.
Habib
1
Saya punya masalah besar dengan file AAR. Saya ingin membuat file AAR dan memberikannya kepada beberapa pedagang untuk memiliki solusi pembayaran dengan bisnis kami. dan saya tidak ingin mereka dapat mencerminkan anggota kelas kami dan mereka tidak dapat melakukan panggilan metode dari aplikasi mereka. Saya ada cara untuk melindungi kode saya dari refleksi.
Mohammad moradyar
5
@Mohammadmoradyar Anda dapat menggunakan Proguard di perpustakaan Anda untuk mengaburkan kelas Anda, tetapi seperti halnya dengan bytecode berbasis Java, tidak ada cara untuk menghentikan orang lain dari mendekompilasi kode Anda.
satukan
11

Pernyataan " Perbedaan utama antara Jar dan AAR adalah bahwa AAR termasuk sumber daya seperti tata letak, drawables dll. " Tidak sesuai dengan spesifikasi file JAR dan karenanya bukan kebenaran. Menurut spesifikasi file JAR :

File JAR adalah format file berdasarkan format file ZIP yang populer dan digunakan untuk menggabungkan banyak file menjadi satu. File JAR pada dasarnya adalah file zip yang berisi direktori META-INF opsional.

Seperti yang Anda lihat, tidak ada batasan konten yang melarang termasuk sumber daya seperti tata letak, gambar dll. Dalam file JAR. Untuk detail lebih lanjut lihat artikel 5.3 "Pembuatan dan Memuat" Spesifikasi Mesin Virtual Java®.

Jadi pada pertanyaan Android Archive Library (aar) vs jar standar. Jawabannya tergantung pada alat build apa yang Anda gunakan.

Jika Anda menggunakan Android Studio sebagai alat bangun (masing-masing sebagai pengelola proyek), Anda lebih baik menggunakan file * .ar untuk berbagi sumber daya enkapsulasi antara proyek Android. Format file AAR adalah bagian dari Android Studio build dan seperti yang dikomentari di komentar lain di sini antarmuka penggunanya mendukung format aar untuk Android Libraries.

Tetapi kecuali Android Studio, seluruh dunia tidak tahu apa itu file aar (artefak). Misalnya, jika Android build Anda didasarkan pada Maven, file pilihan untuk berbagi sumber daya akan menjadi jar karena itu adalah artefak proyek java Maven asli dan tidak ada batasan apa yang akan dimasukkan ke dalam file jar standar. Selain itu, ada cara untuk menjelaskan Maven format file apa pun, termasuk aar dengan menggunakan peningkatan siklus hidup dengan komponen baru. Contoh sederhana tersedia di sini. Bagaimana cara membuat jenis kemasan baru untuk Maven?

ggghhhjjj
sumber
Saya akan mengatakan bahwa perbedaannya adalah bahwa JAR dimaksudkan untuk menjadi cara untuk berbagi segala jenis sumber daya di ekosistem java, sedangkan AAR adalah Android yang berfokus dan memaksa Anda untuk tata letak yang konkret .
Xtreme Biker
Saya pikir penulis jawaban yang dipilih (@unify) harus membuat beberapa klarifikasi tentang ini.
lfree
Saya tidak tahu tentang dunia Java yang lebih besar, tetapi di dunia Android file jar tidak dapat menyertakan sumber daya. Yaitu, bahkan jika sumber daya ada dalam arsip .jar, mereka tidak akan dibawa ke proyek yang mencakup mereka: stackoverflow.com/q/2474904/211292
ThomasW
6

Kutipan dalam pertanyaan tidak memiliki kesamaan dengan kenyataan saat ini. Tentu saja dimungkinkan untuk menggunakan perpustakaan eksternal di Android dan ada banyak perpustakaan yang tersedia. Mungkin mereka ingin mengatakan bahwa setiap aplikasi harus membundel semua pustaka yang dibutuhkan, tetapi menggunakan kembali pustaka pada saat build (static linking) benar-benar tidak menjadi masalah.

.aarberbeda dari .jartidak lebih dari .jarberbeda dari .zip. Ini memiliki konsep-konsep tertentu tentang jenis konten yang harus diharapkan di sana, tetapi keduanya .jardan .aarpaling sering berisi kelas yang dikompilasi dan sumber dayanya. .aarhanya menetapkan bahwa pustaka itu spesifik untuk Android dan memiliki beberapa struktur yang diharapkan, masuk akal untuk pustaka semacam itu (well, .jarjuga memiliki beberapa struktur yang diharapkan).

Pandangan bahwa .aar hanya didukung oleh Android studio juga sudah usang. Perpustakaan seperti itu dapat digunakan untuk Maven Central, dan alat-alat seperti gradle dapat merujuk mereka menggunakan akhiran @aar, misalnya:

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

untuk referensi penyebaran pusat Maven ini .

Audrius Meskauskas
sumber