Бібліотека архівів Android (aar) проти стандартної банки


131

Я читав деякі статті про нове прийняття Gradle як стандартної системи збирання для додатків Android. Що ж, виходячи зі стандартної розробки Java, я зазвичай залежую від файлів jar для того, щоб створити свій проект. Однак здається, що в Android є також пакети AAR , які еквівалентні файлам dll в ОС Windows, як згадувалося тут :

По-перше, ви повинні усвідомити, що платформа Android не дозволяє "спільні бібліотеки" на рівні додатків. У «традиційних» платформах мов програмування, C, C ++, Java, як ви її називаєте, у нас є цей механізм спільного використання бібліотек часу виконання. (Наприклад, DLL у Windows, DSO на Unix, Jar у JVM тощо). На Android, однак, ви не можете цього зробити, якщо ви не Google або виробник мобільних телефонів (Див. Виноску 1 нижче). Як розробник програми, це може бути принциповим обмеженням. "Обмін" або "повторне використання" кодів, як під час створення, так і під час роботи, є дуже важливою частиною практики інженерії програмного забезпечення. Це досить складно (не неможливо, просто складніше) на Android через вищезазначене обмеження.

Однак у мене є певні сумніви щодо цієї концепції. Я маю на увазі, коли слід зацікавити розробника, включивши в його додаток аар залежності? Чи посилюються ці залежності до якоїсь мінімальної версії SDK?

Наприклад, в одному проекті я отримую доступ до COM-порту, для якого використовую попередньо скомпільовані NDK бібліотеки .so . Чи потрібно створити aar, якщо я хочу поділитися цією утилітою?

Відповіді:


221

AARФайли схожі на Jars, ніж на Dlls з наступної причини:

Dlls можна ділитися між програмами, у яких пакети AARs та банки додаються у додаток.

AARs проти Jars:

Основна відмінність між a Jarі a AARполягає в тому, що AARs включають такі ресурси, як layouts, drawablesт. Д. Це значно спрощує створення автономних візуальних компонентів. Наприклад, якщо у вас є кілька додатків, які використовують один і той же екран входу, і Jars ви можете ділити класи, але не макет, стилі тощо, вам все одно довелося їх дублювати. З AARs все зібрано в один акуратний пакет.

На закінчення, AARs - це великий крок у правильному напрямку.

Примітка:
Подібні спроби були зроблені і з apk-libs, але вони застаріли, оскільки AARs набагато краще.


@unify. Чи є якийсь спосіб, щоб ми могли запобігти перезахищенню файлів aar - притупити бібліотеку?
abh22ishek

Мене бентежить ця відповідь. Перша цитата блоку говорить про те, що "аари та банки додаються у додаток", а не "поділяються між додатками"; проте друга цитата блоку означає, що Aars дозволяє вам ділитися класами та іншими ресурсами між кількома додатками?
LarsH

5
@LarH Я думаю, це означає, що ви можете ділитися кодом (файлами aar) між своїми програмами, але він буде включений у кожен пакет окремо, щоб користувачі могли самостійно встановлювати програми. Якщо встановлено 2 програми і обидва використовують один і той самий aar, час роботи Android може бути досить розумним, щоб завантажити його лише один раз.
Хабіб

1
У мене великі проблеми з файлами AAR. Я хочу зробити файл AAR і надіслати його якомусь продавцю, щоб мати рішення щодо оплати з нашим бізнесом. і я не хочу, щоб вони могли відображати наших членів класу, і вони не можуть мати виклик методу зі своїх додатків. У мене є будь-який спосіб захистити свій код від відображення.
Мохаммед морадяр

5
@Mohammadmoradyar ви можете використовувати Proguard у вашій бібліотеці, щоб прикрити свої класи, але, як і будь-який байт-код на базі Java, жодний спосіб не зупинити людей від декомпіляції вашого коду.
об'єднайте

11

Заява " Основна відмінність Jar від AAR полягає в тому, що AAR включають такі ресурси, як макети, малюнки тощо ", не відповідає специфікації файлу JAR, а тому не є правдою. Відповідно до специфікації файлу JAR :

Файл JAR - це формат файлів, заснований на популярному форматі ZIP-файлів і використовується для об'єднання багатьох файлів в один. Файл JAR - це по суті файл zip, який містить необов'язковий каталог META-INF.

Як бачите, немає жодного обмеження вмісту, яке забороняє включати такі ресурси, як макети, малюнки тощо, у файл JAR. Детальніше див. Статтю 5.3 «Створення та завантаження» специфікації віртуальної машини Java®.

Отже, на питання Android Archive Library (aar) vs стандартний jar. Відповідь залежить від того, який інструмент побудови ви використовуєте.

Якщо ви використовуєте Android Studio як інструмент збирання (відповідно як організатор проекту), ви, безумовно, краще використовувати * .aar файли для обміну інкапсульованими ресурсами між проектами Android. Формат файлу AAR є частиною збірки Android Studio, і як це зазначається в інших коментарях, тут його користувальницький інтерфейс підтримує формат arar для бібліотек Android.

Але, окрім Android Studio, решта світу не знає, що це за файл (артефакт). Наприклад, якщо ваша побудова Android базується на Maven, то переважним файлом для спільного використання ресурсів буде jar, оскільки це власний артефакт проекту Maven java, і немає обмежень, що потрібно розміщувати у стандартному файлі jar. Крім того, є спосіб пояснити Maven будь-який формат файлу, включити aar, використовуючи покращення життєвого циклу з новим компонентом. Простий приклад доступний тут. Як створити новий тип упаковки для Maven?


Тоді я б сказав, що різниця полягає в тому, що JAR повинен бути способом обміну будь-яким ресурсом в екосистемі Java, тоді як AAR орієнтований на Android і змушує вас до конкретного планування .
Xtreme Biker

Я думаю, що автор обраної відповіді (@unify) повинен зробити дещо уточнення з цього приводу.
lfree

Я не знаю про більш широкий світ Java, але в банку jar файли Android не змогли включити ресурси. Тобто, навіть якщо ресурси були в .jar архів, де вони будуть виведені на проект , який включає в себе їх: stackoverflow.com/q/2474904/211292
ThomasW

6

Цитування у питанні не має нічого спільного з поточною реальністю. Звичайно, можна використовувати зовнішні бібліотеки в Android, і є багато бібліотек. Можливо, вони хотіли сказати, що кожен додаток повинен поєднувати всі необхідні йому бібліотеки, але повторне використання бібліотеки під час збирання (статичне посилання) насправді не є проблемою.

.aarвідрізняється .jarне більш ніж .jarвідрізняється від .zip. У ньому є певні поняття, якого змісту слід очікувати там, але обидва .jarта .aarнайчастіше містять складені класи та вони ресурси. .aarпросто вказує, що бібліотека є специфічною для Android і має деяку очікувану структуру, розумну для таких бібліотек (ну, .jarтакож має деяку очікувану структуру).

Думка, що .aar підтримується лише студією Android, також застаріла. Такі бібліотеки можна розгорнути до Maven Central, а такі інструменти, як gradle, можуть посилатися на них за допомогою суфікса @aar, наприклад:

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

посилатися на цей централізоване розгортання Maven.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.