Android Arşiv Kitaplığı (aar) ile standart jar karşılaştırması


131

Android uygulamaları için standart derleme sistemi olarak Gradle'ın yeni benimsenmesi hakkında bazı makaleler okudum. Standart Java geliştirmeden geldiğimde, projemi oluşturmak için genellikle jar dosyalarına güveniyorum . Bununla birlikte, Android'in burada belirtildiği gibi bir Windows işletim sistemindeki dll dosyalarına eşdeğer olan aar paketleri de var gibi görünüyor :

Öncelikle, Android platformunun uygulama düzeyinde "paylaşılan kitaplıklara" izin vermediğini anlamalısınız. "Geleneksel" programlama dili platformlarında, C, C ++, Java, siz adlandırın, biz bu çalışma zamanı kitaplıklarını paylaşma mekanizmasına sahibiz. (Örneğin, Windows'ta DLL, Unix'te DSO, JVM'de Jar vb.). Ancak Android'de, Google veya telefon üreticisi değilseniz bunu yapamazsınız (Aşağıdaki Dipnot 1'e bakın). Bir uygulama geliştiricisi olarak bu temel bir sınırlama olabilir. Kodları hem derleme zamanında hem de çalışma zamanında "paylaşmak" veya "yeniden kullanmak", yazılım mühendisliği uygulamasının çok önemli bir parçasıdır. Bu, yukarıda belirtilen sınırlama nedeniyle Android'de oldukça zordur (imkansız değil, sadece daha zordur).

Ancak, bu konseptle ilgili bazı şüphelerim var. Demek istediğim, bir geliştirici , uygulamasına aar bağımlılıklarını dahil etmekle ne zaman ilgilenmelidir ? Bu bağımlılıklar bazı minimum SDK sürümlerine sıkıştırılmış mı?

Örneğin, bir projede, NDK için önceden derlenmiş .so kitaplıklarını kullandığım bir COM bağlantı noktasına erişiyorum . Bu yardımcı programı paylaşmak istiyorsam bir aar oluşturmam gerekir mi?

Yanıtlar:


221

AARdosyalar , aşağıdaki nedenden ötürü , Jars'ye daha çok benzer Dll:

Dll'ler,' AARler ve jar'ların uygulamanızda paketlendiği uygulamalar arasında paylaşılabilir .

AARs vs Jars:

A Jarve a arasındaki temel fark AAR, AARs'nin layouts, drawablesvb. Kaynakları içermesidir . Bu, kendi kendine yeten görsel bileşenler oluşturmayı çok daha kolay hale getirir. Örneğin, aynı oturum açma ekranını kullanan birden fazla uygulamanız varsa, Jare-postalarla sınıfları paylaşabilirsiniz ancak düzeni, stilleri vb. Paylaşamazsınız, yine de onları çoğaltmanız gerekir. İle AARherşey tek pakette birlikte gelir.

Sonuç olarak, AARdoğru yönde atılmış büyük bir adımdır.

Not: s
ile benzer girişimlerde bulunuldu, apk-libancak AARs çok daha iyi olduğu için artık kullanılmıyorlar .


@birleştirmek . Aar dosyalarının kütüphaneyi gizlemesini engellememizin bir yolu var mı?
abh22ishek

Bu cevap kafam karıştı. İlk blok alıntı, "aarlar ve kavanozların uygulamanızla birlikte paketlendiğini", "uygulamalar arasında paylaşıldığını" değil; Yine de ikinci blok alıntı, aars'ın sınıfları ve diğer kaynakları birden fazla uygulama arasında paylaşmanıza izin verdiğini ima ediyor?
LarsH

5
@LarH Sanırım bu, kodları (aar dosyalarını) uygulamalarınız arasında paylaşabileceğiniz anlamına geliyor, ancak kullanıcıların uygulamaları bağımsız olarak yüklemelerine izin vermek için her pakete ayrı ayrı dahil edilecek. 2 uygulama yüklüyse ve her ikisi de aynı aar'ı kullanıyorsa, android çalışma zamanı onu yalnızca bir kez yüklemek için yeterince akıllı olabilir.
Habib

1
AAR dosyalarıyla ilgili büyük sorunum var. Bir AAR dosyası yapmak ve bunu işletmemizde ödeme çözümlerine sahip olması için bir satıcıya vermek istiyorum. ve sınıf üyelerimizi yansıtabilmelerini ve uygulamalarından yöntem çağrısı almamalarını istemiyorum. Kodumu yansımadan korumanın herhangi bir yolu var.
Mohammad moradyar

5
@Mohammadmoradyar Proguard'ı sınıflarınızı gizlemek için kitaplığınızda kullanabilirsiniz, ancak herhangi bir Java tabanlı bayt kodunda olduğu gibi, insanların kodunuzu yeniden derlemesini engellemenin bir yolu yoktur.
birleştir

11

" Jar ile AAR arasındaki temel fark, AAR'lerin düzenler, çekilebilirler vb. Gibi kaynakları içermesidir " ifadesi, JAR dosyası spesifikasyonuna karşılık gelmez ve bu nedenle bir gerçek değildir. Göre JAR dosyası şartname :

JAR dosyası, popüler ZIP dosya biçimine dayalı bir dosya biçimidir ve birçok dosyayı tek bir dosyada toplamak için kullanılır. Bir JAR dosyası, aslında isteğe bağlı bir META-INF dizini içeren bir zip dosyasıdır.

Gördüğünüz gibi, bir JAR dosyasında düzenler, çekilebilirler vb. Gibi kaynakları dahil etmeyi yasaklayan herhangi bir içerik sınırlaması yoktur. Daha fazla ayrıntı için Java® Sanal Makine Belirtiminin 5.3 "Oluşturma ve Yükleme" makalesine bakın.

Öyleyse sorusu üzerine Android Arşiv Kitaplığı (aar) ve standart jar. Cevap, hangi derleme aracını kullandığınıza bağlıdır.

Android Studio'yu bir derleme aracı olarak (sırasıyla bir proje düzenleyicisi olarak) kullanıyorsanız, kapsüllenmiş kaynakları Android projeleri arasında paylaşmak için kesinlikle * .aar dosyalarını kullanmanız daha iyi olacaktır. AAR dosya formatı, Android Studio yapısının bir parçasıdır ve buradaki diğer yorumlarda da belirtildiği gibi, kullanıcı arayüzü Android Kitaplıkları için aar formatını destekler.

Ancak Android Studio dışında dünyanın geri kalanı o şeyin aar dosyasının (eser) ne olduğunu bilmiyor. Örneğin, Android derlemeniz Maven'e dayanıyorsa, kaynak paylaşımı için tercih edilen dosya jar olacaktır çünkü bu, yerel Maven java projesi yapıttır ve standart jar dosyasına nelerin koyulacağına dair bir sınırlama yoktur. Ek olarak, herhangi bir dosya formatını açıklamanın bir yolu vardır, aar'ı yeni bir bileşenle yaşam döngüsü geliştirmesini kullanarak. Basit bir örnek burada mevcuttur Maven için nasıl yeni bir ambalaj türü oluşturabilirim?


O zaman farkın, JAR'ın java ekosistemindeki her türlü kaynağı paylaşmanın bir yolu olması, AAR'ın ise Android odaklı olması ve sizi somut bir düzene zorlaması olduğunu söyleyebilirim .
Xtreme Biker

Bence seçilen cevabın yazarı (@unify) bu konuda biraz açıklama yapmalı.
lfree

Daha büyük Java dünyası hakkında bilgim yok, ancak Android dünyasında jar dosyaları kaynakları içeremezdi. Yani, kaynaklar .jar arşivinde olsalar bile, onları içeren projeye
aktarılmazlar

6

Sorudaki alıntı, mevcut gerçeklikle hiçbir ortak noktaya sahip değil. Elbette Android'de harici kitaplıkları kullanmak mümkündür ve çok sayıda kitaplık mevcuttur. Belki de her uygulamanın ihtiyaç duyduğu tüm kitaplıkları bir araya getirmesi gerektiğini söylemek istediler, ancak kitaplığı derleme zamanında yeniden kullanmak (statik bağlantı) gerçekten bir sorun değil.

.aardan farklıdır .jarfazla .jardeğişmesidir .zip. Orada hangi tür içeriğin beklenmesi gerektiği konusunda belirli kavramları vardır, ancak her ikisi de .jarve .aarçoğu zaman derlenmiş sınıfları ve kaynakları içerir. .aarsadece kitaplığın Android'e özgü olduğunu ve bu tür kitaplıklar için makul olan bazı beklenen yapıya sahip olduğunu belirtir (aynı .jarzamanda bazı beklenen yapıya sahiptir).

.Aar'ın yalnızca Android stüdyosu tarafından desteklendiği görünümü de kullanımdan kaldırılmıştır. Bu tür kitaplıklar Maven Central'a dağıtılabilir ve gradle gibi araçlar bunlara @aar sonekini kullanarak başvurabilir, örneğin:

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

bu Maven merkezi dağıtımına referans vermek için .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.