Додавання локальних файлів .aar до збірки Gradle за допомогою “flatDirs” не працює


159

Мені відомо це питання: Додавання локальних файлів .aar до моєї збірки gradle, але рішення не працює для мене.

Я спробував додати цю заяву до верхнього рівня мого build.gradleфайлу:

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

Я також помістив slidingmenu.aarфайл /libsі посилався на нього у dependenciesрозділі:compile 'com.slidingmenu.lib:slidingmenu:1.0.0@aar' але він взагалі не працював.

я намагався compile files('libs/slidingmenu.aar') , але не пощастило.

Що я пропускаю? Будь-які ідеї?

PS Android Studio 0.8.2


1
flatDirs + компіляція (назва: 'libname', ext: 'aar') працює для мене на Android Studio 8.2.0, + gradle 1.12. Тому у вашому файлі збірки повинно бути щось не так. Перевірте це ще раз або опублікуйте більше коду
ніж

Відповіді:


293

Опираючись на відповідь Йосії, ось як я змусив його працювати.

Дотримуючись його вказівок (під редагуванням) ( Файл -> Новий-> Новий модуль -> Імпорт .JAR / .AAR ) та імпортуйте свій .AAR.

Потім у свій проект build.gradle (не верхній рівень, той у розділі "додаток") додайте наступне (у розділі залежностей):

dependencies {
    compile project(':Name-Of-Your-Project')
}

Примітка Name-Of-Your-Project має відповідати назві папки, яка була додана після імпорту файлу AAR (на тому самому рівні, що і в app/.ideaпапці самого верхнього рівня). Або по-іншому ...

MyApplication
  .idea
  додаток
  build.gradle (ось де додати компільований проект (': ProjectName') до розділу залежності)
  ProjectName (додається автоматично після імпорту, відповідає імені файлу aar)
  будувати
  градле
  тощо

Це працювало для мене під керуванням Android Studio 0.8.0. Не забудьте синхронізувати градуси (за допомогою кнопки на панелі інструментів або в меню Файл-> Синхронізувати ) після цього.

(Дякую Джосії за те, що він мене відправив у правильному напрямку)

(Примітка. До цього я намагався додати його до папки libs, намагаючись маніпулювати верхнім рівнем build.gradleта рівнем програми build.gradle, але жодне з цього не працювало для моїх файлів aars - jar буде працювати нормально, але не файли aar)


1
Yikes! This did the trick, thank you for the detailed explanation. Under the hood import master does the same thing as described on the Tools site: "Another option is to create a new Gradle sub-project, and to make this project's published artifact be the jar or aar file that you want to reuse. Then you can simply have other Gradle sub-projects depend on this new sub-project. In this new sub-project, simply create a build.gradle with the following: configurations.create("default") artifacts.add("default", file('somelib.aar'))"
Alexey Dmitriev

Я отримую помилку: Error:(25, 0) Required keys [path] are missing from map {name=mylibrary-debug}.якщо я використовую compile project(name:'mylibrary-debug').. Що я пропускаю?
MysticMagicϡ

2
Недавній плагін Gradle зламав це. Вирішення тут: stackoverflow.com/a/28816265/560600
Sky Kelsey

1
Будь ласка, також виконайте «Чистий збір» після всіх вищезазначених кроків.
Оголошення

1
У рядку compile project(':Name-Of-Your-Project')я замінив Name-Of-Your-Projectім'я мого файлу .aar (без .aarрозширення). І це спрацювало.
Суфіан

190

Оновлення : Як згадувало @ amram99, виправлена проблема з моменту випуску Android Studio v1.3.

Випробувано та перевірено з наведеними нижче специфікаціями

  • Android Studio v1.3
  • плагін gradle v1.2.3
  • Gradle v2.4

Що працює зараз

  • Тепер ви можете імпортувати локальний файл aar за допомогою параметра Файл> Новий> Новий модуль> Імпортувати .JAR / .AAR пакет в Android Studio v1.3

  • Однак наведена нижче відповідь справедлива і ефективна незалежно від змін в Android Studio, оскільки це засновано на сценаріях градусів.


Старий відповідь: У недавньому оновлення люди в Android перервали включення локальних файлів aar через опцію додати новий модуль меню Android Studio. Перевірте наведений тут випуск . Незалежно від усього, що входить у список функцій IDE та не входить у нього, метод нижче наведений під час роботи з локальними файлами aar (протестовано сьогодні):

Помістіть файл aar у каталог libs (створіть його за потреби), а потім додайте наступний код у build.gradle:

dependencies {
   compile(name:'nameOfYourAARFileWithoutExtension', ext:'aar')
 }
repositories{
      flatDir{
              dirs 'libs'
       }
 }

1
Це правильна відповідь і найновіший спосіб це зробити. Будь ласка, підкресліть цю відповідь;)
lmo

Я скопіював ваш код, але чи знаєте ви, чому я, можливо, отримав цю помилку? "Помилка. Під час налаштування проекту": app "виникла проблема.> Артефакт" signalr-client-sdk-android-release.aar (: signalr-client-sdk-android-release :) "не знайдено. Шукали в таких місцях: jitpack.io//signalr-client-sdk-android-release//… "
tddmo

10
repositoriesЧастина йде в різних build.gradle для того , щоб працювати - глобальний один. dependenciesЧастина йде в модулі build.gradle. Ось чому я отримав помилку.
toddmo

@toddmo Отже, моя відповідь стосується місцевих файлів AAR. тобто .aar-файл, що знаходиться у вашій папці libs.
Нішант.

1
Дякую. Стара версія для мене не працювала, новий спосіб імпорту працював чудово! Gradle 3.5, groovy 2.4.10
Арнольд Шрівер

26

Редагувати: Правильний спосіб (на даний момент) використовувати локальний файл AAR як залежність від збірки - це використовувати майстра імпорту модуля (Файл | Новий модуль | Імпорт .JAR або .AAR пакет), який автоматично додасть .aar як бібліотечний модуль у вашому проекті.

Стара відповідь

Спробуйте це:

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

...

compile(name:'slidingmenu', ext:'aar')

1
Не працювало також ... Схоже, це відома помилка, яка ще не виправлена: code.google.com/p/android/isissue/detail?id=55863
Олексій Дмитрієв

Я зробив, як ви сказали в редакції, але в підсумку нічого не було додано. У майстрі я вибрав шлях до файлу AAR, вказане ім'я модуля. Після натискання кнопки Готово було синхронізовано файли Gradle, але в файлі build.gradle не з’явились нові файли або будь-які рядки (в робочій копії мого Git не було змін). Я намагався з файлами AAR і JAR з однаковим результатом. (Я використовую Android Studio 0.8.1)
Олексій Дмитрієв

3
Ця стара відповідь насправді працює для мене, доки я включаю flatDir { dirs 'libs' }блок, як згадується в ОП, використовуючи AS 8.13 / Gradle 2.1
qix

4
Я імпортував .aar файл, використовуючи новий метод імпорту. Але я не в змозі побачити ім'я класу бібліотеки, коли я ввожу половину імені та натискаю клавішу ctrl + пробіл. Тож це все ще не враховує бібліотеку. Будь-яка ідея?
MysticMagicϡ

1
Відредагована версія відмінно працює для Android Studio 1.2.1.1. Ніяких інших сценаріїв гределів робити не доводиться. Ви можете створити новий модуль, як описано вище. У діалоговому вікні "Створити нову модель" виберіть шлях до файлу aar до вашої бібліотеки, наприклад, MyLib \ mylibrary \ build \ outputs \ aar. AS скопіює файл у нову локальну папку. Відновіть проект програми та новий модуль бібліотеки буде показаний у вікні проекту. Тепер ви можете додати модуль бібліотеки як залежність від свого модуля програми (наприклад, "додаток") у структурі проекту: Структура проекту | модулі | додаток | залежності | Додати | Модульна залежність.
Крістіан Шульцендорф

15

У мене це працює на Android Studio 2.1. У мене є модуль під назвою "Native_Ads", який поділяється на кілька проектів.

Спочатку я створив каталог у своєму модулі Native_ads з назвою 'aars', а потім помістив туди файл aar.

Структура каталогу:

libs/
aars/    <-- newly created
src/
build.gradle
etc

Потім інші зміни:

Файл Gradle верхнього рівня:

allprojects {
    repositories {
        jcenter()
        // For module with aar file in it
        flatDir {
            dirs project(':Native_Ads').file('aars')
        }
    }
}

Файл build.gradle модуля програми: - жодних змін

Файл Settings.gradle (щоб включити модуль):

include ':app'
include 'Native_Ads'
project(':Native_Ads').projectDir = new File(rootProject.projectDir, '../path/to/Native_Ads')

Файл Gradle для модуля Native_Ads:

repositories {
    jcenter()
    flatDir {
        dirs 'aars'
    }
}
dependencies {
    compile(name:'aar_file_name_without_aar_extension', ext:'aar')
}

Це воно. Очистіть і побудуйте.


Працює також для декількох файлів aar у "Native_Ads". Дуже хороше рішення!
Крістіан Шульцендорф

8

Найпростіший спосіб зараз - додати його як модуль

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

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


Можливо, у вас є ідея щодо того, чому моя nextкнопка сіра в Create New Moduleдіалоговому вікні після вибору Імпорт JAR/AAR Package?
Кевін Крейн

1
Зауважте, що я вибрав файл .aar і дав йому ім'я
Кевін Крейн

Я з'ясував причину, IDE перевіряє шлях, щоб визначити, чи .aarфайл знаходиться в каталозі проекту, я просто розмістив його .aarна робочому столі та повторив спробу, і він працює, дякую за ваше рішення!
Кевін Крейн

Можливо, німе питання, але щодо so you just need to include that module as a dependency afterwards- як це зробити?
boltup_im_coding

1
@Marian Klühspies тепер я бачу, я не був упевнений , якщо мають includeу settings.gradleповинен був бути досить. Я працював. Дякую!
boltup_im_coding

7

Це моя структура, і як я це вирішую:

MyProject / app / libs / mylib-1.0.0.aar

MyProject / app / myModulesFolder / myLibXYZ

На build.gradle

від Project / app / myModulesFolder / myLibXYZ

Я поставив це:

repositories {
   flatDir {
    dirs 'libs', '../../libs'
  }
}
compile (name: 'mylib-1.0.0', ext: 'aar')

Зроблено і працює добре, мій підмодуль XYZ залежить від деякоїбібліотеки від основного модуля.


5

Ви можете це зробити так. Це потрібно робити у форматі Maven:

repositories {
  maven { url uri('folderName')}
}

І тоді ваш AAR повинен перейти в структуру папки для ідентифікатора групи "com.example":

folderName/
  com/
    example/
       verion/
          myaar-version.aar

Тоді посилання на залежність:

compile 'com.example:myaar:version@aar'

Де versionверсія вашого файлу aar (тобто, 3.0 тощо)


3

Для всіх, хто має цю проблему в Android Studio 1.4, я змусив її працювати, створивши модуль в рамках проекту, який містить 2 речі.

  1. build.gradle із таким вмістом:

    configurations.create("default")

    artifacts.add("default", file('facebook-android-sdk-4.7.0.aar'))

  2. файл aar (у цьому прикладі "facebook-android-sdk-4.7.0.aar")

Потім включіть нову бібліотеку як модульну залежність. Тепер ви можете використовувати вбудовану арку, не включаючи джерела в проект.

Кредит у Facebook за цей злом. Я знайшов рішення під час інтеграції Android SDK в проект.


Який модуль ви створили? Файл> Новий> Новий модуль>?
Аль-Лелопат

У цьому випадку тип модуля - це "Бібліотека Android", якщо ви використовуєте GUI для створення модуля. Ви можете зробити існуючий модуль в бібліотеку Android, змінивши його збірку.gradle. змінити apply plugin: 'com.android.application'наapply plugin: 'com.android.library'
Віктор Уде

Чи можна додати кілька aar в один модуль? Інакше мені потрібно створити понад 10 модулів gradle, щоб включити мої файли arar
Marian Klühspies,

@ MarianKlühspies багато що змінилося, оскільки я спочатку написав цю відповідь. Я рекомендую спробувати офіційну документацію для включення арка у ваш проект: developer.android.com/studio/projects/…
Віктор Уде

3

У моєму випадку жодна з вищезгаданих відповідей не спрацювала! так як у мене були різні продукти, ароматизатори просто додавалиrepositories{ flatDir{ dirs 'libs' } }

не працює! Я закінчив із зазначенням точного місцезнаходження каталогу libs :

repositories{
flatDir{
    dirs 'src/main/libs'
}

}

Здогадуєтесь, слід запровадити подібні плоскі дири, коли у build.gradle є різні продукти продукту


2

У моєму випадку я просто поміщаю файл aar у libs та додаю

dependencies { ... api fileTree(dir: 'libs', include: ['*.aar']) ... }

в build.gradle і він працює. Я думаю, що це аналогічно з залежно від сформованої залежності:

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


"Api fileTree (dir:" libs ", включає: ['* .aar])" відмінно працював. Це не спрацювало, якщо я використовував "реалізацію" замість "api". Я ніколи не міг отримати рішення Віктора Уде працювати з кількома арками. Ще одне додаткове розуміння: якщо ви використовуєте ресурси (наприклад, макети), переконайтеся, що aar (s), на які ви посилаєтесь, не містить ресурсу з тим самим іменем, як у вашій apk. Це може призвести до помилки, що він не може знайти один із ідентифікаторів у макеті. Проблема полягає в тому, що він використовує неправильний простір імен для id в макеті AAR.
Том Рутчик

1

Цей рядок включає всі aarта jarфайли з libsпапки:

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

1

Це рішення працює з Android Studio 4.0.1.

Окрім створення нового модуля, як запропоновано у наведеному вище рішенні, ви можете спробувати це рішення.

Якщо у вашій програмі є кілька модулів і ви хочете додати aar лише до одного з модулів, тоді це рішення стане в нагоді.

У вашому кореневому проекті build.gradle

додати

repositories {
flatDir {
    dirs 'libs'
}}

Потім у модулі, куди потрібно додати локальний файл .aar. просто додайте нижче рядки коду.

dependencies {
api fileTree(include: ['*.aar'], dir: 'libs')
implementation files('libs/<yourAarName>.aar')

}

Щасливе кодування :)


0

Додайте нижче в проект реалізації файлу Gradle файлу програми (шлях: ': назва проекту')


0

Якщо ви вже використовуєте Kotlin Gradle DSL, альтернатива використовувати його таким чином:

Ось моя структура проекту

|-root
|----- app
|--------- libs // I choose to store the aar here
|-------------- my-libs-01.aar
|-------------- my-libs-02.jar
|--------- build.gradle.kts // app module gradle
|----- common-libs // another aar folder/directory
|----------------- common-libs-01.aar
|----------------- common-libs-02.jar
|----- build.gradle.kts // root gradle

Моя app/build.gradle.kts

  1. Використовуючи простий підхід з fileTree
// android related config above omitted...

dependencies {
    // you can do this to include everything in the both directory
    // Inside ./root/common-libs & ./root/app/libs
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar"))))
    implementation(fileTree(mapOf("dir" to "../common-libs", "include" to listOf("*.jar", "*.aar"))))
}
  1. Використовуючи такий самий підхід, як отримання з місцевого / віддаленого сховища Maven з flatDirs
// android related config above omitted...

repositories {
    flatDir {
        dirs = mutableSetOf(File("libs"), File("../common-libs") 
    }
}

dependencies {
   implementation(group = "", name = "my-libs-01", ext = "aar")
   implementation(group = "", name = "my-libs-02", ext = "jar")

   implementation(group = "", name = "common-libs-01", ext = "aar")
   implementation(group = "", name = "common-libs-02", ext = "jar")
}

groupБуло необхідно, в зв'язку з його обов'язковою (НЕ опціональним / має по замовчуванням значення) в Котлин implementation, дивіться нижче:

// Filename: ReleaseImplementationConfigurationAccessors.kt
package org.gradle.kotlin.dsl

fun DependencyHandler.`releaseImplementation`(
    group: String,
    name: String,
    version: String? = null,
    configuration: String? = null,
    classifier: String? = null,
    ext: String? = null,
    dependencyConfiguration: Action<ExternalModuleDependency>? = null
)

Відмова від відповідальності: різниця у використанні no.1 & flatDirs підходу 2, я все ще не знаю багато, ви можете відредагувати / прокоментувати цю відповідь.

Список літератури:

  1. https://stackoverflow.com/a/56828958/3763032
  2. https://github.com/gradle/gradle/isissue/9272

0

Це рішення працює з Android Studio 4.0.1.

Окрім створення нового модуля, як запропоновано у наведеному вище рішенні, ви можете спробувати це рішення.

Якщо у вашій програмі є кілька модулів, які ви хочете додати aar лише один модуль, тоді це рішення стане в нагоді.

У своєму кореневому проекті build.gradleдодати

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

Потім у модулі, куди потрібно додати .aarфайл локально, просто додайте рядки коду нижче:

dependencies {
    api fileTree(include: ['*.aar'], dir: 'libs')
    implementation files('libs/<yourAarName>.aar')
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.