Як вручну включити зовнішній пакет aar за допомогою нової системи Gradle Android Build


406

Я експериментував з новою системою збірки андроїдів і зіткнувся з невеликою проблемою. Я склав власний пакет aar ActionBarSherlock, який я назвав 'actionbarsherlock.aar'. Те, що я намагаюся зробити, - це фактично використовувати цей aar для створення мого остаточного APK. Якщо я включу всю бібліотеку ActionBarSherlock як модуль бібліотеки для Android до свого основного проекту, використовуючи компілюючий проект (': actionbarsherherlock'), я можу успішно створити без проблем.

Але моя проблема полягає в тому, що я хочу забезпечити цю залежність як пакет файлів aar ВЗАЄМОДІЙСЬКЕ, якби я був JAR, тоді я не можу зрозуміти, як правильно включити його у свій проект. Я намагався використовувати конфігурацію компіляції, але це, здається, не працює. Я продовжую отримувати не можу знайти символ під час компіляції, який підказує мені, що ads.jar з пакету aar не потрапляє до classpath.

Хтось знає про синтаксис, щоб вручну включати пакет aar як файл?

build.gradle

buildscript {

 repositories {
     mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.4'
  }
}
apply plugin: 'android'

repositories {
   mavenCentral()
}
dependencies {
    compile files('libs/actionbarsherlock.aar')
}

android {
    compileSdkVersion 15
    buildToolsVersion "17.0"
}

EDIT: Отже, відповідь полягає в тому, що вона наразі не підтримується, ось питання якщо ви хочете її відстежити.

EDIT: Оскільки це все ще не підтримується безпосередньо, найкращою альтернативою виглядає запропоноване рішення від @RanWakshlak

EDIT: Також простіше, використовуючи синтаксис, запропонований @VipulShah


Розглянемо відповідь Віпула Шаха: нарешті він працював для мене, без місцевого сховища Maven, як для Android Studio 0.5.8.
шкшнайдер

Погляньте на моє запитання та відповідь тут stackoverflow.com/a/31662782/746347
Mixel

Якщо ви використовуєте Gradle 3.0.0 або новішої версії, ця проста програма Gradle працювала для мене: stackoverflow.com/questions/29081429 / ...
user1506104

Відповіді:


670

Дотримуйтесь наведених нижче кроків, щоб змусити його працювати (я протестував його до Android Studio 2.2)

Скажімо, ви зберігали файл aar у папці libs. (припустимо, ім'я файлу cards.aar)

потім у додатку build.gradleвкажіть наступне та натисніть проект синхронізації з файлами Gradle. Відкрийте рівень build.gradle проекту та додайте, flatDir{dirs 'libs'}як це робилося нижче

allprojects {
   repositories {
      jcenter()
      flatDir {
        dirs 'libs'
      }
   }
}

і тепер відкрийте файл app.grdle на рівні програми та додайте .aarфайл

    dependencies {
       compile(name:'cards', ext:'aar')
}

Якщо все пройде добре, ви побачите, що запис у бібліотеку зроблений у збірці -> exploded-aar

Також зауважте, що якщо ви імпортуєте файл .aar з іншого проекту, який має залежності, вам також потрібно буде включити їх у свій build.gradle.


5
@VipulShah, де знаходиться каталог libs?
StuStirling

2
Можливо, варто порадити вносити модифікації в модуль програми "build.gradle", а не у верхню папку "build.gradle".
loloof64

3
знайшов відповідь на моє запитання вище: замість compileзалежності додайте дві залежності debugCompile(name:'cards-debug', ext:'aar')іreleaseCompile(name:'cards-release', ext:'aar')
Іфтах

2
Не плутайте з зразком коду. Перший блок з allprojects {...}переходить до файлу gradle рівня "project", а другий розділ з dependencies {...}повинен перейти до файлу gradle рівня "app".
Кирило Кармазін

8
Будь ласка, оновіть свою відповідь: ПОПЕРЕДЖЕННЯ: Конфігурація "компілювати" застаріла і була замінена на "реалізація" та "api". Він буде видалений наприкінці 2018 року. Докладнішу інформацію див. На сайті: d.android.com/r/tools/update-dependency-configurations.html
B-GangsteR

248
  1. Клацніть правою кнопкою миші на вашому проекті та виберіть "Відкрити налаштування модуля" .

Відкрийте налаштування модуля

  1. Натисніть кнопку "+" у верхньому лівому куті вікна, щоб додати новий модуль.

Додати новий модуль

  1. Виберіть "Імпортувати .JAR або .AAR пакет" та натисніть кнопку "Далі" .

Імпорт AAR

  1. Знайдіть файл AAR за допомогою кнопки еліпсису "..." біля поля "Ім'я файлу".

Знайти файл AAR

  1. Зробіть модуль програми вибраним та натисніть на панель Залежності, щоб додати новий модуль як залежність.

Панель залежностей

  1. Скористайтесь кнопкою "+" на екрані залежностей та виберіть "Залежність модуля" .

Додайте залежність модуля

  1. Виберіть модуль і натисніть «ОК» .

Виберіть модуль


4
Найкраща відповідь, майте на увазі після цього зробити Alt+B> чистим і відновити проект. Android Studio, чому вам боляче! Я хочу, щоб NetBeans IDE був платформою для розробників Android
java acm

@Oliver Ви дивовижні!
ankit purwar

Ти найкращий!
codezombie

2
Це не найкраща ідея створювати новий модуль кожного разу, коли ви просто хочете додати трохи aarпроекту до свого проекту
Кирилл Кармазін

Ти чудовий мій друг. !! Привіт цьому.
Тимофій

111

Ви можете посилатися на файл aar із сховища. Maven - це варіант, але є більш просте рішення: помістіть файл aar у свій каталог libs та додайте сховище каталогів.

    repositories {
      mavenCentral()
      flatDir {
        dirs 'libs'
      }
    }

Потім зверніться до бібліотеки в розділі залежності:

  dependencies {
        implementation 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
}

Ви можете ознайомитись із повідомленням у щоденнику Min'an для отримання додаткової інформації.


1
Це чудово працює і краще, ніж прийняті / вище оцінені відповіді, тому що це простіше, і я можу включити це до контролю версій, не додаючи файл до локального Mapo репо кожного розробника (якщо я мав це робити, навіщо використовувати Gradle в першу чергу ?) Дякую!
айпольт

@ajpolt Напевно рекомендується замість цього встановити сервер репо (для власних деп), тому не потрібно розміщувати його на машинах розробників або в папці lib вашого проекту. Якщо у вас є лише одна залежність, викиньте її в структуроване сховище коду Google (як тимчасове репо)
Lo-Tan

4
Найважливішим моментом, який слід зазначити у цій відповіді, є згадування "@aar" в кінці залежності.
Атхарва

Я припускаю , що це більше не буде працювати з останньою Gradle плагін: stackoverflow.com/questions/60878599 / ...
David

Це одна і єдина відповідь, яка включає найпростішу форму з усім сучасним синтаксисом, включаючи implementationі т. Д. Це копіювати і вставляти рішення. Багато нових оновлень надходить, оскільки Android Build Gradle Plugin 4.0.0 тепер видає помилку замість ігнорування порушених шляхів .aar
Патрік

51

Нижче наведений підхід працює з останньою студією Android (> v0.8.x):

  • Зберегти в aarфайл під додатком модуль libsпапки (наприклад: <project>/<app>/libs/myaar.aar)

  • Додайте нижче, щоб build.gradle папки модуля "app" (а не кореневого проекту build.gradle проекту). Зверніть увагу на ім'я в рядку компіляції, це myaar @ aar не myaar.aar.

    dependencies {
        compile 'package.name.of.your.aar:myaar@aar'
    }
    
    repositories{
        flatDir{
            dirs 'libs'
        }
    }
  • Клацніть Tools -> Android -> Sync Project with Gradle Files


3
Відмінно працює на AS 1.0
Пабло Джонсон

1
Якщо комусь це потрібно, якщо Gradle працює нормально, але ви все ще не можете бачити класи, перезавантажте Android Studio ...
htafoya

1
Це рішення чудово працює в AS2.2 - gradle надзвичайно прискіплива до синтаксису файлів AAR, здається.
Джим Андреас

Будь ласка, оновіть або видаліть, компіляція застаріла, і є також ця проблема: stackoverflow.com/questions/60878599/…
Девід

49

до (за замовчуванням)

implementation fileTree(include: ['*.jar'], dir: 'libs')

просто додати '*.aar'в includeмасив.

implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')

він добре працює на Android Studio 3.x.

якщо ви хочете ігнорувати якусь бібліотеку? робити так.

implementation fileTree(include: ['*.jar', '*.aar'], exclude: 'test_aar*', dir: 'libs')
debugImplementation files('libs/test_aar-debug.aar')
releaseImplementation files('libs/test_aar-release.aar')

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

1
Працюючи чудово, це шлях, якщо бібліотека проста. Але їх тут проблема: Вам потрібно імпортувати всю бібліотеку, імпортовану у файл aar, щоб він працював. Імпорт із файлу aar не розповсюджується за допомогою цього методу.
Тобліг

Або ще простіше:implementation fileTree(include: ['*.?ar'], dir: 'libs')
friederbluemle

@friederbluemle Швидше, ніж простіший, я б сказав, коротший, і в той же час неспецифічний, теоретично.
Девід

21

Мені просто вдалося!

  1. Скопіюйте MyLib-0.1.aar файл в ЛІЕС / папку

  2. Додайте ці рядки до нижньої частини build.gradle (має бути додаток, а не проект):

    repositories {
       flatDir {
           dirs 'libs'
       }
    }
    dependencies {
        compile 'com.example.lib:mylib:0.1@aar'
    }
  3. Все йде нормально. Ось найважливіший момент:

Gradle потребує доступу до мережі залежно від режиму офлайн.

Переконайтеся, що ви включили роботу в режимі офлайн через прапорець у розділі Структури проекту / Gradle

- АБО -

Налаштуйте параметри проксі для доступу до мережі.

Для налаштування параметрів проксі необхідно змінити файл gradle.properties проекту , налаштувавши http та https окремо, як показано нижче:

systemProp.http.proxyHost=proxy.example.com
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=user
systemProp.http.proxyPassword=pass
systemProp.http.nonProxyHosts=localhost
systemProp.http.auth.ntlm.domain=example <for NT auth>

systemProp.https.proxyHost=proxy.example.com
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=user
systemProp.https.proxyPassword=pass
systemProp.https.nonProxyHosts=localhost
systemProp.https.auth.ntlm.domain=example <for NT auth>

Сподіваюся, це працює.


Будь ласка, оновіть або видаліть, компіляція застаріла. Є також ця проблема: stackoverflow.com/questions/60878599/…
Девід

20

В даний час посилання на локальний файл .aar не підтримується (як підтвердив Xavier Ducrochet)

Що можна зробити замість цього, це налаштувати локальний сховище Maven (набагато простіше, ніж це звучить) та посилатись на .aar звідти.

Я написав допис у блозі, де детально описується, як зробити його тут:

http://www.flexlabs.org/2013/06/using-local-aar-android-library-packages-in-gradle-builds


Мені не вдалося змусити його працювати, коли артефакт є знімком, будь-яка ідея чому?
tbruyelle

Чи доводилося вам це працювати лише з Eclipse або Android-студією? З затемненням "gradle eclipse" додає файл aar до classpath, але eclipse не розпізнає класи всередині нього.
andrej_k

Перевірте це запитання stackoverflow.com/questions/20911665/…, якщо після виконання підручника ваш локальний файл .aar не знайдено (в Gradle 1.9 або вище)
Maragues

Оновіть або видаліть, ця відповідь застаріла.
Девід

18

Можна додати кілька aarзалежностей за допомогою лише декількох рядків коду.

Додати локальний flatDirсховище:

repositories {
    flatDir {
        dirs 'libs'
    }
} 

Додайте кожен aarу libsкаталог до compileконфігурації залежності:

fileTree(dir: 'libs', include: '**/*.aar')
        .each { File file ->
    dependencies.add("compile", [name: file.name.lastIndexOf('.').with { it != -1 ? file.name[0..<it] : file.name }, ext: 'aar'])
}

Це спрацювало, але як можна поставити перевірку, якщо залежність уже додана як залежність Maven, то я не хочу, щоб файл aar потрібно було додати, PS: Я використовую це для написання плагіна, який автоматично додає мій aar до проекту Android і додає залежність у build.gradle
Аді

@Adi Якщо у вас вже є основна залежність, то не кладіть відповідну aar у libsпапку.
міксель

Дякую за відповідь. Як я вже згадував, додавання aar до libs автоматизовано плагіном для Android студії, який розвивається, тому я хочу знати, чи залежність, яку додає додаток до файлу build.gradle, вже додана раніше.
Аді

Зараз у мене немає відповіді. Я думаю, що краще створити окреме запитання.
міксель

15

На жаль, жодне з рішень тут не працювало для мене (я отримую невирішені залежності). Що нарешті спрацювало і є найпростішим способом IMHO: Виділіть назву проекту з Android Studio, а потім Файл -> Новий модуль -> Імпортувати JAR або пакет AAR. Кредит йде на вирішення цієї посади


1
Слід зазначити, що Android Studio є надзвичайно розпливчастим у своєму майстрі імпорту. Коли вони заявляють "Ім'я файлу" в одному з кроків, те, що вони насправді просять, - це шлях до файлу ... Сподіваємось, це повідомлення рятує інших від головного болю.
Tukajo

13

Є два способи:

Перший спосіб

  1. Відкрийте Android Studio і перейдіть до Create New ModuleвікнаFile -> New -> New Module

введіть тут опис зображення

  1. Виберіть Import .JAR/.AAR Packageпредмет і натисніть Nextкнопку

  2. Додайте залежність у build.gradleфайл, який належить вашому appмодулю.

    dependencies {
        ...
        implementation project(path: ':your aar lib name')
    }

Це все.

Другий спосіб

  1. Створіть папку в libsкаталозі, наприклад aars.

  2. Покладіть аар-ліб у папку aars.

  3. Додайте фрагмент коду

repositories {
    flatDir {
        dirs 'libs/aars'
    }
}

у ваш build.gradleфайл належить модулю програми.

  1. Додайте залежність у build.gradleфайл, який належить вашому appмодулю.
dependencies {
    ...
    implementation (name:'your aar lib name', ext:'aar')
}

Це все.

Якщо ви можете читати китайську мову, ви можете перевірити блог 什么 是 AAR 文件 以及 如何 在 Android 开发 中 使用


ця відповідь була дуже корисною для мене
Csabi

Якщо дотримуватися першого способу, класи в файлі aar не виявляються в головному проекті, чи потрібно нам додавати додаткові конфігурації?
Кіран

Будь ласка, оновіть або видаліть, перші відповіді вже розміщені, а друге "компілювати" застаріло.
Девід

12

За допомогою Android Studio 3.4 та Gradle 5 ви можете просто зробити це так

dependencies {
    implementation files('libs/actionbarsherlock.aar')
}

1
Це найкраща відповідь. Залежність явна і дуже проста.
Nikmoon

1
Погодився, що це найкраща відповідь. Миттєво працював, був ідеальним для додавання залежностей .aar до бібліотеки React Native.
Джош Бейкер

1
Це видає помилку , починаючи з Gradle плагіна 4: stackoverflow.com/questions/60878599 / ...
David

@David Дякую за звіт, я спробую перевірити його якнайшвидше.
m0skit0

10

ОНОВЛЕННЯ АНДРОІДНОГО СТУДІЯ 3.4

  1. Перейдіть у меню Файл -> Структура проекту

введіть тут опис зображення

  1. Модулі та натисніть +

введіть тут опис зображення

  1. Виберіть Import .aar Package

введіть тут опис зображення

  1. Знайдіть маршрут .aar

введіть тут опис зображення

  1. Закінчіть та застосуйте , а потім перевірте, чи додано пакет

введіть тут опис зображення

  1. Тепер у модулі програми натисніть + та залежність від модуля

введіть тут опис зображення

  1. Перевірте пакет бібліотеки та Гаразд

введіть тут опис зображення

  1. Перевірте додану залежність

введіть тут опис зображення

  1. І структура проекту, як це

введіть тут опис зображення


1
це 17-а відповідь, я прочитав, що нарешті додала залежність .. е-е
Тарас Мацик

6

У мене теж була ця проблема. Цей звіт про проблему: https://code.google.com/p/android/isissue/detail?id=55863, здається, передбачає, що безпосередньо посилання на файл .AAR не підтримується.

Можливо, наразі альтернативою є визначення бібліотеки actionbarsherlock як бібліотеки Gradle під батьківським каталогом вашого проекту та відповідним посиланням.

Синтаксис визначений тут http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Referencing-a-Library


Дякую за посилання на проблему. Так, я знаю, як зробити цю роботу за допомогою бібліотеки Android Gradle, але ця опція не дуже оптимальна для проекту, над яким я працюю, але thx!
Мігель Лавінь

3

Я знайшов таке вирішення в трекері проблем Android: https://code.google.com/p/android/isissue/detail?id=55863#c21

Хитрість (не виправлення) полягає в тому, щоб виділити свої файли .aar у підпроект і додати ваші контури як артефакти:

configurations.create("default")
artifacts.add("default", file('somelib.jar'))
artifacts.add("default", file('someaar.aar'))

Більше інформації: Поводження-перехідні залежності-для-локальних-артефактів-банок-та-аар


Це правильно, і ось приклад: в github.com/textileio/notes/commit/… , compile project(':mobile')в android / app / build.gradle, configurations.maybeCreate("default")в android / mobile / build.gradle, include ':mobile'в android / settings.gradle
Li Zheng

3

У моєму випадку у моїй бібліотеці є деякі покарання, і коли я створюю aarз неї, я провалився через пропущені покарання, тому моє рішення полягає в тому, щоб додати всі каси з моєї бібліотеки з arrфайлом.

Отже, мій рівень проекту build.gradleвиглядає так:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
    }
}

allprojects {
    repositories {
        mavenCentral()
        //add it to be able to add depency to aar-files from libs folder in build.gradle(yoursAppModule)
        flatDir {
            dirs 'libs'
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

build.gradle(modile app) тому:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.sampleapp"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    //your project depencies
    ...
    //add lib via aar-depency
    compile(name: 'aarLibFileNameHere', ext: 'aar')
    //add all its internal depencies, as arr don't have it
    ...
}

та бібліотека build.gradle:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    //here goes library projects dependencies, which you must include
    //in yours build.gradle(modile app) too
    ...
}

3

Я спробував тут все рішення, але жодне не працює, тоді я зрозумів, що помилився, я вставив .aarнеправильну папку, як ви бачите нижче, я думав, що слід вставити в кореневу папку, тому я створив там libsпапку (1 на малюнку ), але всередині папки додатків вже є libs, ви повинні поставити друге libs, сподіваюся, це допоможе тим, у кого є така ж проблема, як у мене:

введіть тут опис зображення


3

Стандартний спосіб імпорту файлу AAR у програму вказаний у https://developer.android.com/studio/projects/android-library.html#AddDependency

Клацніть Файл> Створити> Новий модуль. Клацніть Імпорт .JAR / .AAR пакета та натисніть кнопку Далі. Введіть місце складеного файлу AAR або JAR і натисніть кнопку Готово.

Перейдіть за посиланням вище для наступних кроків.


2

Просто для спрощення відповіді

Якщо файл .aar присутній локально, тоді включайте
compile project(':project_directory')у залежність build.gradle вашого проекту.

Якщо файл .aar присутній у віддаленому режимі, тоді включайте compile 'com.*********.sdk:project_directory:0.0.1@aar'у залежність build.gradle вашого проекту.


0

У моєму випадку просто працюю, коли я додаю "проект" для компіляції:

repositories {
    mavenCentral()
    flatDir {
        dirs 'libs'
    }
}


dependencies {
   compile project('com.x.x:x:1.0.0')
}

0

ви можете зробити щось подібне:

  1. Помістіть ваші локальні бібліотеки (з розширенням: .jar, .aar, ...) у папку "libs" (або іншу, якщо хочете).

  2. У build.gradle (додаток) додайте цей рядок у залежності

    file fileTree (включають: ['* .jar', '* .aar'], dir: 'libs')

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