Bibliothèque d'archives Android (aar) vs pot standard

131

J'ai lu quelques articles sur la nouvelle adoption de Gradle en tant que système de construction standard pour les applications Android. Eh bien, venant du développement Java standard, je dépends généralement des fichiers jar pour construire mon projet. Cependant, il semble qu'Android dispose également de packages aar , qui sont l'équivalent des fichiers dll dans un système d'exploitation Windows, comme mentionné ici :

Tout d'abord, vous devez comprendre que la plate-forme Android n'autorise pas les «bibliothèques partagées» au niveau de l'application. Dans les plates-formes de langage de programmation «traditionnelles», C, C ++, Java, vous l'appelez, nous avons ce mécanisme de partage de bibliothèques d'exécution. (Par exemple, DLL sous Windows, DSO sous Unix, Jar sur JVM, etc.). Sur Android, cependant, vous ne pouvez pas faire cela, sauf si vous êtes Google ou un fabricant de combinés (voir la note de bas de page 1 ci-dessous). En tant que développeur d'applications, cela peut être une limitation fondamentale. Le «partage» ou la «réutilisation» des codes, à la fois au moment de la construction et de l'exécution, est une partie très importante de la pratique du génie logiciel. C'est plutôt difficile (pas impossible, mais plus difficile) sur Android en raison de la limitation susmentionnée.

Cependant, j'ai quelques doutes sur ce concept. Je veux dire, quand un développeur devrait-il être intéressé par l'inclusion des dépendances aar dans son application? Ces dépendances sont-elles renforcées à une version minimale du SDK?

Par exemple, dans un projet, j'accède à un port COM, pour lequel j'utilise les bibliothèques .so précompilées NDK . Dois-je créer un aar si je souhaite partager cet utilitaire?

Motard Xtreme
la source

Réponses:

221

AARles fichiers sont plus similaires à Jars qu'à Dlls pour la raison suivante:

DllLes s peuvent être partagés entre les applications où les AARs et les jars sont intégrés à votre application.

AARs vs Jars:

La principale différence entre a Jaret a AARest que AARs inclut des ressources telles que layouts, drawablesetc. Cela rend beaucoup plus facile la création de composants visuels autonomes. Par exemple, si vous avez plusieurs applications qui utilisent le même écran de connexion, avec Jars, vous pouviez partager des classes mais pas la mise en page, les styles, etc., vous deviez toujours les dupliquer. Avec AARs, tout est regroupé dans un emballage soigné.

En conclusion, les AARs sont un grand pas dans la bonne direction.

Remarque: des
tentatives similaires ont été faites avec apk-libs, mais elles sont maintenant obsolètes car les AARs sont bien meilleurs.

unifier
la source
@unify. Existe-t-il un moyen d'empêcher les fichiers aar de masquer la bibliothèque?
abh22ishek
Je suis confus par cette réponse. Le premier bloc de citation indique que «les aars et les jars sont intégrés à votre application», et non «partagés entre les applications»; Pourtant, la deuxième citation de bloc implique que les aars vous permettent de partager des classes et d'autres ressources entre plusieurs applications?
LarsH
5
@LarH Je pense que cela signifie que vous pouvez partager le code (fichiers aar) entre vos applications, mais il sera inclus dans chaque package séparément pour permettre aux utilisateurs d'installer les applications indépendamment. Si 2 applications sont installées et que les deux utilisent le même aar, le runtime android peut être assez intelligent pour le charger une seule fois.
Habib
1
J'ai un gros problème avec les fichiers AAR. Je veux créer un fichier AAR et le donner à un commerçant pour avoir des solutions de paiement avec notre entreprise. et je ne veux pas qu'ils puissent refléter nos membres de classe et qu'ils ne peuvent pas avoir d'appel de méthode depuis leurs applications. Je n'ai aucun moyen de protéger mon code de la réflexion.
Mohammad moradyar
5
@Mohammadmoradyar, vous pouvez utiliser Proguard sur votre bibliothèque pour masquer vos classes, mais comme avec n'importe quel bytecode basé sur Java, il n'y a aucun moyen d'empêcher les gens de décompiler votre code.
unifier le
11

La déclaration « La principale différence entre un Jar et un AAR est que les AAR incluent des ressources telles que des mises en page, des drawables, etc. » ne correspond pas à la spécification du fichier JAR et n'est donc pas une vérité. Selon la spécification du fichier JAR :

Le fichier JAR est un format de fichier basé sur le format de fichier ZIP populaire et est utilisé pour regrouper de nombreux fichiers en un seul. Un fichier JAR est essentiellement un fichier zip qui contient un répertoire META-INF facultatif.

Comme vous pouvez le voir, il n'y a pas de limitation de contenu qui interdit d'inclure des ressources telles que des mises en page, des dessinables, etc. dans un fichier JAR. Pour plus de détails, voir l'article 5.3 «Création et chargement» de la spécification de la machine virtuelle Java®.

Donc, sur la question Bibliothèque d'archives Android (aar) vs pot standard. La réponse dépend de l'outil de construction que vous utilisez.

Si vous utilisez Android Studio comme outil de création (respectivement comme organisateur de projet), vous feriez certainement mieux d'utiliser les fichiers * .aar pour partager des ressources encapsulées entre des projets Android. Le format de fichier AAR fait partie de la construction d'Android Studio et, comme il est commenté dans les autres commentaires ici, son interface utilisateur prend en charge le format aar pour les bibliothèques Android.

Mais à l'exception d'Android Studio, le reste du monde ne sait pas ce qu'est ce fichier (artefact). Par exemple, si votre version Android est basée sur Maven, le fichier préféré pour le partage de ressources sera jar car il s'agit de l'artefact natif du projet Java Maven et il n'y a aucune limitation de ce qu'il faut mettre dans le fichier jar standard. En outre, il existe un moyen d'expliquer Maven n'importe quel format de fichier, y compris aar en utilisant l'amélioration du cycle de vie avec un nouveau composant. Un exemple simple est disponible ici Comment créer un nouveau type d'emballage pour Maven?

ggghhhjjj
la source
Je dirais alors que la différence est que le JAR est censé être un moyen de partager tout type de ressource dans l'écosystème java, tandis que l'AAR est axé sur Android et vous oblige à une mise en page concrète .
Xtreme Biker
Je pense que l'auteur de la réponse choisie (@unify) devrait apporter quelques éclaircissements à ce sujet.
lgratuit le
Je ne connais pas le grand monde Java, mais dans le monde Android, les fichiers jar ne pouvaient pas inclure de ressources. Autrement dit, même si les ressources se trouvaient dans l'archive .jar, elles ne seraient pas
transférées
6

La citation dans la question n'a rien de commun avec la réalité actuelle. Bien sûr, il est possible d'utiliser des bibliothèques externes sous Android et de nombreuses bibliothèques sont disponibles. Ils voulaient peut-être dire que chaque application doit regrouper toutes les bibliothèques dont elle a besoin, mais la réutilisation de la bibliothèque au moment de la construction (liaison statique) n'est vraiment pas un problème.

.aardiffère de .jarpas plus que .jardiffère de .zip. Il a certains concepts sur le type de contenu qui doit y être attendu, mais les deux .jaret le .aarplus souvent contiennent des classes compilées et des ressources. .aarspécifie simplement que la bibliothèque est spécifique à Android et a une structure attendue, raisonnable pour de telles bibliothèques (enfin, a .jarégalement une structure attendue).

La vue selon laquelle .aar n'est pris en charge que par Android Studio est également obsolète. Ces bibliothèques peuvent être déployées sur Maven Central et des outils comme gradle peuvent les référencer en utilisant le suffixe @aar, par exemple:

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

pour référencer ce déploiement central Maven.

Audrius Meskauskas
la source