Android Archive Library (aar) vs Standardglas

131

Ich habe einige Artikel über die neue Einführung von Gradle als Standard-Build-System für Android-Apps gelesen. Nun, da ich aus der Standard-Java-Entwicklung stamme, bin ich normalerweise auf JAR- Dateien angewiesen , um mein Projekt zu erstellen. Es scheint jedoch, dass Android auch aar- Pakete hat, die den DLL- Dateien in einem Windows-Betriebssystem entsprechen, wie hier erwähnt :

Zunächst müssen Sie feststellen, dass die Android-Plattform keine „gemeinsam genutzten Bibliotheken“ auf Anwendungsebene zulässt. In den "traditionellen" Programmiersprachenplattformen C, C ++, Java, wie Sie es nennen, haben wir diesen Mechanismus zum Teilen von Laufzeitbibliotheken. (ZB DLL unter Windows, DSO unter Unix, Jar unter JVM usw.). Unter Android ist dies jedoch nur möglich, wenn Sie Google oder ein Hersteller von Mobiltelefonen sind (siehe Fußnote 1 unten). Als Anwendungsentwickler kann dies eine grundlegende Einschränkung sein. Das „Teilen“ oder „Wiederverwenden“ von Codes sowohl zur Erstellungszeit als auch zur Laufzeit ist ein sehr wichtiger Bestandteil der Softwareentwicklungspraxis. Dies ist unter Android aufgrund der oben genannten Einschränkung ziemlich schwierig (nicht unmöglich, nur schwieriger).

Ich habe jedoch einige Zweifel an diesem Konzept. Ich meine, wann sollte ein Entwickler daran interessiert sein, aar- Abhängigkeiten in seine Anwendung aufzunehmen? Werden diese Abhängigkeiten auf eine SDK-Mindestversion verschärft?

Zum Beispiel greife ich in einem Projekt auf einen COM-Port zu, für den ich NDK-vorkompilierte .so- Bibliotheken verwende. Muss ich ein aar erstellen, wenn ich dieses Dienstprogramm freigeben möchte?

Xtreme Biker
quelle

Antworten:

221

AARDateien sind aus folgendem Grund Jars ähnlicher als Dlls:

Dlls kann für alle Anwendungen freigegeben werden, in denen AARs und Jars in Ihrer App enthalten sind.

AARs vs Jars:

Der Hauptunterschied zwischen a Jarund a AARbesteht darin, dass AARs Ressourcen wie layouts, drawablesusw. enthalten. Dies erleichtert die Erstellung in sich geschlossener visueller Komponenten erheblich. Wenn Sie beispielsweise mehrere Apps haben, die denselben Anmeldebildschirm verwenden und mit Jars Klassen teilen können, jedoch nicht das Layout, die Stile usw., müssen Sie diese dennoch duplizieren. Mit AARs ist alles in einem ordentlichen Paket gebündelt.

Zusammenfassend ist AARs ein großer Schritt in die richtige Richtung.

Hinweis:
Ähnliche Versuche wurden mit apk-libs unternommen, aber sie sind jetzt veraltet, da AARs viel besser sind.

vereinheitlichen
quelle
@unify. Gibt es eine Möglichkeit, um zu verhindern, dass AAR-Dateien die Bibliothek verschleiern?
abh22ishek
Diese Antwort verwirrt mich. Das erste Blockzitat besagt, dass "aars und jars in Ihrer App enthalten sind" und nicht "anwendungsübergreifend". Das zweite Blockzitat impliziert jedoch, dass Sie mit aars Klassen und andere Ressourcen zwischen mehreren Apps teilen können.
LarsH
5
@LarH Ich denke, es bedeutet, dass Sie den Code (aar-Dateien) zwischen Ihren Anwendungen teilen können, aber er wird in jedem Paket separat enthalten sein, damit Benutzer die Anwendungen unabhängig installieren können. Wenn 2 Anwendungen installiert sind und beide dasselbe aar verwenden, ist die Android-Laufzeit möglicherweise clever genug, um sie nur einmal zu laden.
Habib
1
Ich habe ein großes Problem mit AAR-Dateien. Ich möchte eine AAR-Datei erstellen und sie einem Händler geben, um Zahlungslösungen für unser Unternehmen zu haben. und ich möchte nicht, dass sie unsere Klassenmitglieder widerspiegeln können und dass sie keinen Methodenaufruf von ihren Apps haben können. Ich habe keine Möglichkeit, meinen Code vor Reflexion zu schützen.
Mohammad Moradyar
5
@Mohammadmoradyar Sie können Proguard in Ihrer Bibliothek verwenden, um Ihre Klassen zu verschleiern, aber wie bei jedem Java-basierten Bytecode gibt es keine Möglichkeit, Leute daran zu hindern, Ihren Code zu dekompilieren.
Vereinige den
11

Die Aussage " Der Hauptunterschied zwischen einem Jar und einem AAR besteht darin, dass AARs Ressourcen wie Layouts, Drawables usw. enthalten " entspricht nicht der JAR-Dateispezifikation und ist daher keine Wahrheit. Gemäß der JAR-Dateispezifikation :

Die JAR-Datei ist ein Dateiformat, das auf dem beliebten ZIP-Dateiformat basiert und zum Zusammenfassen vieler Dateien zu einer Datei verwendet wird. Eine JAR-Datei ist im Wesentlichen eine Zip-Datei, die ein optionales META-INF-Verzeichnis enthält.

Wie Sie sehen, gibt es keine Inhaltsbeschränkung, die das Einfügen von Ressourcen wie Layouts, Drawables usw. in eine JAR-Datei verbietet. Weitere Informationen finden Sie in Artikel 5.3 "Erstellen und Laden" der Java® Virtual Machine-Spezifikation.

Also auf die Frage Android Archive Library (aar) vs Standard jar. Die Antwort hängt davon ab, welches Build-Tool Sie verwenden.

Wenn Sie Android Studio als Build-Tool (bzw. als Projektorganisator) verwenden, sollten Sie auf jeden Fall * .aar-Dateien verwenden, um gekapselte Ressourcen zwischen Android-Projekten zu teilen. Das AAR-Dateiformat ist Teil des Android Studio-Builds. Wie in den anderen Kommentaren hier kommentiert, unterstützt die Benutzeroberfläche das AAR-Format für Android-Bibliotheken.

Aber außer Android Studio weiß der Rest der Welt nicht, was das für eine Datei (Artefakt) ist. Wenn Ihr Android-Build beispielsweise auf Maven basiert, ist die bevorzugte Datei für die gemeinsame Nutzung von Ressourcen jar, da dies das native Maven-Java-Projektartefakt ist und es keine Einschränkung gibt, was in die Standard-JAR-Datei eingefügt werden soll. Darüber hinaus gibt es eine Möglichkeit, Maven jedes Dateiformat zu erklären, einschließlich aar, indem die Lebenszyklusverbesserung mit einer neuen Komponente verwendet wird. Ein einfaches Beispiel finden Sie hier. Wie erstelle ich einen neuen Verpackungstyp für Maven?

ggghhhjjj
quelle
Ich würde dann sagen, dass der Unterschied darin besteht, dass die JAR eine Möglichkeit ist, jede Art von Ressource im Java-Ökosystem zu teilen, während die AAR auf Android ausgerichtet ist und Sie zu einem konkreten Layout zwingt .
Xtreme Biker
Ich denke, der Autor der gewählten Antwort (@unify) sollte diesbezüglich einige Klarstellungen vornehmen.
Kostenlos
Ich weiß nichts über die größere Java-Welt, aber in der Android-Welt konnten JAR-Dateien keine Ressourcen enthalten. Das heißt, selbst wenn sich Ressourcen im .jar-Archiv befinden würden, würden sie nicht in das Projekt übernommen, das sie enthält: stackoverflow.com/q/2474904/211292
ThomasW
6

Das Zitat in der Frage hat nichts mit der gegenwärtigen Realität gemeinsam. Natürlich ist es möglich, externe Bibliotheken in Android zu verwenden, und es sind viele Bibliotheken verfügbar. Vielleicht wollten sie sagen, dass jede Anwendung alle benötigten Bibliotheken bündeln muss, aber die Wiederverwendung der Bibliothek zum Zeitpunkt der Erstellung (statische Verknüpfung) ist wirklich kein Problem.

.aarunterscheidet sich von .jarnicht mehr als .jarunterscheidet sich von .zip. Es gibt bestimmte Konzepte, welche Art von Inhalten dort zu erwarten sind, aber beide .jarund .aarmeistens enthalten kompilierte Klassen und deren Ressourcen. .aarGibt lediglich an, dass die Bibliothek Android-spezifisch ist und eine erwartete Struktur aufweist, die für solche Bibliotheken angemessen ist (nun, hat .jarauch eine erwartete Struktur).

Die Ansicht, dass .aar nur von Android Studio unterstützt wird, ist ebenfalls veraltet. Solche Bibliotheken können in Maven Central bereitgestellt werden, und Tools wie gradle können sie mit dem Suffix @aar referenzieren, zum Beispiel:

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

um auf diese zentrale Bereitstellung von Maven zu verweisen .

Audrius Meskauskas
quelle