Android Archive Library (aar) vs jar standard


131

Ho letto alcuni articoli sulla nuova adozione di Gradle come sistema di generazione standard per le app Android. Bene, provenendo dallo sviluppo Java standard di solito dipendo dai file jar per costruire il mio progetto. Tuttavia sembra che Android abbia anche pacchetti aar , che sono l'equivalente dei file dll in un sistema operativo Windows, come menzionato qui :

Innanzitutto, devi capire che la piattaforma Android non consente "librerie condivise" a livello di applicazione. Nelle piattaforme di linguaggio di programmazione "tradizionali", C, C ++, Java, lo chiami, abbiamo questo meccanismo di condivisione delle librerie di runtime. (Ad esempio, DLL su Windows, DSO su Unix, Jar su JVM, ecc.). Su Android, tuttavia, non puoi farlo, a meno che tu non sia Google o un produttore di telefoni (vedi la nota 1 di seguito). Come sviluppatore di applicazioni, questo può essere un limite fondamentale. La "condivisione" o il "riutilizzo" dei codici, sia in fase di costruzione che in fase di esecuzione, è una parte molto importante della pratica di ingegneria del software. Questo è piuttosto difficile (non impossibile, solo più difficile) su Android a causa della limitazione di cui sopra.

Tuttavia, ho alcuni dubbi su questo concetto. Voglio dire, quando uno sviluppatore dovrebbe essere interessato a includere le dipendenze aar nella sua applicazione? Queste dipendenze sono ridotte a una versione minima dell'SDK?

Ad esempio, in un progetto accedo a una porta COM, per la quale utilizzo librerie .so NDK precompilate . Devo creare un aar se voglio condividere questa utility?

Risposte:


221

AARi file sono più simili a Jars che a Dlls per il seguente motivo:

Dlli messaggi di posta elettronica possono essere condivisi tra le applicazioni in cui AARi pacchetti sono inseriti nella tua app.

AARs vs Jars:

La differenza principale tra a Jare a AARè che AARincludono risorse come layouts, drawablesecc. Ciò rende molto più semplice la creazione di componenti visivi autonomi. Ad esempio, se disponi di più app che utilizzano la stessa schermata di accesso, con Jars potresti condividere le classi ma non il layout, gli stili, ecc., Devi comunque duplicarle. Con AARs tutto è raggruppato in un unico pacchetto.

In conclusione, AARs è un grande passo nella giusta direzione.

Nota:
tentativi simili sono stati fatti con apk-libs ma ora sono obsoleti in quanto AARs sono molto meglio.


@unify. Esiste un modo per evitare file aar - offuscare la libreria?
abh22ishek,

Sono confuso da questa risposta. La prima citazione in blocco dice che "aars e jars sono impacchettati con la tua app", non "condivisi tra le applicazioni"; ma la citazione del secondo blocco implica che aars ti consente di condividere classi e altre risorse tra più app?
LarsH

5
@LarH Penso che significhi che puoi condividere il codice (file aar) tra le tue applicazioni, ma sarà incluso in ogni pacchetto separatamente per consentire agli utenti di installare le applicazioni in modo indipendente. Se sono installate 2 applicazioni ed entrambe utilizzano lo stesso aar, il runtime Android potrebbe essere abbastanza intelligente da caricarlo una sola volta.
Habib,

1
Ho un grosso problema con i file AAR. Voglio creare un file AAR e consegnarlo ad alcuni commercianti per avere soluzioni di pagamento con la nostra attività. e non voglio che possano riflettere i membri della nostra classe e non possono avere chiamate di metodo dalle loro app. Ho un modo per proteggere il mio codice dalla riflessione.
Mohammad moradyar,

5
@Mohammadmoradyar puoi usare Proguard sulla tua libreria per offuscare le tue classi, ma come con qualsiasi bytecode basato su Java, non c'è modo di impedire alle persone di decompilare il tuo codice.
unificare il

11

L'affermazione " La differenza principale tra un Jar e un AAR è che gli AAR includono risorse come layout, disegni estraibili ecc. " Non corrisponde alla specifica del file JAR e quindi non è una verità. Secondo le specifiche del file JAR :

Il file JAR è un formato di file basato sul popolare formato di file ZIP e viene utilizzato per aggregare molti file in uno. Un file JAR è essenzialmente un file zip che contiene una directory META-INF opzionale.

Come puoi vedere, non vi è alcuna limitazione del contenuto che proibisce di includere risorse come layout, disegnabili ecc. In un file JAR. Per maggiori dettagli vedere l'articolo 5.3 "Creazione e caricamento" di The Java® Virtual Machine Specification.

Quindi sulla domanda Android Archive Library (aar) vs jar standard. La risposta dipende dallo strumento di compilazione che stai utilizzando.

Se stai usando Android Studio come strumento di compilazione (rispettivamente come organizzatore di progetti), faresti sicuramente meglio a utilizzare i file * .aar per condividere risorse incapsulate tra progetti Android. Il formato di file AAR fa parte della build di Android Studio e come è commentato negli altri commenti qui la sua interfaccia utente supporta il formato aar per le librerie Android.

Ma tranne Android Studio il resto del mondo non sa che cosa è quel file aar (artefatto). Ad esempio, se la tua build Android è basata su Maven, il file preferito per la condivisione delle risorse sarà jar perché è l'artefatto nativo del progetto jav Maven e non ci sono limiti su cosa inserire nel file jar standard. Inoltre, c'è un modo per spiegare a Maven qualsiasi formato di file, includendo aar usando il miglioramento del ciclo di vita con un nuovo componente. Un semplice esempio è disponibile qui Come posso creare un nuovo tipo di imballaggio per Maven?


Direi quindi che la differenza è che JAR è pensato per essere un modo per condividere qualsiasi tipo di risorsa nell'ecosistema Java, mentre AAR è focalizzato su Android e ti costringe a un layout concreto .
Xtreme Biker,

Penso che l'autore della risposta scelta (@unify) dovrebbe fare alcuni chiarimenti al riguardo.
gratuito il

Non conosco il grande mondo Java, ma nel mondo Android i file jar non potevano includere risorse. Cioè, anche se le risorse fossero in archivio .jar, non sarebbero portati verso il progetto che li include: stackoverflow.com/q/2474904/211292
ThomasW

6

La citazione nella domanda non ha nulla in comune con la realtà attuale. Naturalmente è possibile utilizzare librerie esterne in Android e ci sono molte librerie disponibili. Forse hanno voluto dire che ogni applicazione deve raggruppare tutte le librerie di cui ha bisogno, ma riutilizzare la libreria al momento della compilazione (collegamento statico) non è davvero un problema.

.aardifferisce da .jarnon più di .jardiverso da .zip. Ha alcuni concetti su quale tipo di contenuto dovrebbe essere previsto lì, ma entrambi .jare .aarmolto spesso contengono classi compilate e risorse. .aarspecifica solo che la libreria è specifica per Android e ha una struttura prevista, ragionevole per tali librerie (beh, .jarha anche una struttura prevista).

Anche la vista secondo cui .aar è supportato solo da Android Studio. Tali librerie possono essere distribuite su Maven Central e strumenti come Gradle possono fare riferimento ad esse utilizzando il suffisso @aar, ad esempio:

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

per fare riferimento a questa distribuzione centrale di Maven.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.