Добавление локальных файлов .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 + compile (name: 'libname', ext: 'aar') у меня работает на Android Studio 8.2.0, + gradle 1.12. Так что должно быть что-то не так с вашим файлом сборки. Проверьте это еще раз или отправьте больше кода
Чем

Ответы:


293

Основываясь на ответе Иосии, вот как я заставил его работать.

Следуя его инструкциям (в процессе редактирования) ( Файл -> Новый-> Новый модуль -> Импорт .JAR / .AAR ) и импортируйте свой .AAR.

Затем в вашем проекте build.gradle (не на верхнем уровне, а в разделе «app») добавьте следующее (в разделе зависимостей):

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

Примечание. Name-Of-Your-Project должен совпадать с именем папки, которая была добавлена ​​после импорта файла AAR (на том же уровне, что и app/.ideaв папке самого верхнего уровня). Или, говоря по-другому ...

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

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

(Спасибо Иосии за то, что она направила меня в правильном направлении)

(Примечание: до этого я пытался добавить его в папку libs, пытаясь манипулировать верхним уровнем build.gradleи уровнем приложения build.gradle, но ничего из этого не работало для моих файлов aars - jar's будет работать нормально, но не для файлов aar)


1
Хлоп! Это сработало, спасибо за подробное объяснение. Под капотом мастер импорта делает то же самое, что описано на сайте «Инструменты»: «Другой вариант - создать новый подпроект Gradle и сделать опубликованный артефакт этого проекта файлом jar или aar, который вы хотите использовать повторно. Затем вы может просто иметь другие подпроекты Gradle, зависящие от этого нового подпроекта. В этом новом подпроекте просто создайте build.gradle со следующим: configurations.create ("default") artifacts.add ("default", file ('somelib.aar')) "
Алексей Дмитриев

Я получаю сообщение об ошибке: 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
Скай Келси

1
Пожалуйста, также выполните Clean Build после всех вышеперечисленных шагов.
Объявления

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, так как он основан на скриптах gradle.


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

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

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

1
Это правильный ответ и самый новый способ сделать это. Пожалуйста upvote этого ответа;)
LMO

Я скопировал ваш код, но знаете ли вы, почему я мог получить эту ошибку? "Ошибка: возникла проблема при настройке проекта": приложение ".> Артефакт" signalr-client-sdk-android-release.aar (: signalr-client-sdk-android-release :) "не найден. Поиск производился в следующих местах: jitpack.io//signalr-client-sdk-android-release//… "
toddmo

10
repositoriesЧасть идет в различных build.gradle для того , чтобы работать - глобальный один. dependenciesЧасть идет в модуле build.gradle. Вот почему я получил ошибку.
Toddmo

@toddmo Так что мой ответ действительно относится к локальным файлам AAR. т.е. файл .aar, расположенный внутри вашей директории libs.
Нишант.

1
Спасибо. Старая версия у меня не работала, новый способ импорта работал отлично! Gradle 3.5, отличный 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/issues/detail?id=55863
Алексей Дмитриев

Я сделал, как вы сказали, в редактировании, но ничего не было добавлено в конце. В мастере я выбрал путь к файлу AAR, указав имя модуля. После нажатия кнопки «Готово» он синхронизировал файлы Gradle, но новые файлы или строки в build.gradle не появлялись (в рабочей копии моего Git не было никаких изменений). Я попытался с файлами AAR и JAR с тем же результатом. (Я использую Android Studio 0.8.1)
Алексей Дмитриев

3
Этот старый ответ действительно работает для меня, пока я включаю flatDir { dirs 'libs' }блок, как упомянуто в OP, используя AS 8.13 / Gradle 2.1
qix

4
Я импортировал .aar файл, используя новый метод импорта. Но я не могу увидеть имя класса библиотеки, когда набираю половину имени и нажимаю ctrl + пробел. Так что он до сих пор не учитывает библиотеку. Любая идея?
MysticMagicϡ

1
Отредактированная версия прекрасно работает для Android Studio 1.2.1.1. Никаких других сценариев не нужно делать. Вы можете создать новый модуль, как описано выше. В диалоговом окне «Создать новую модель» выберите путь к файлу AAR вашей библиотеки, например, MyLib \ mylibrary \ build \ output \ aar. AS скопирует файл в новую локальную папку. Перестройте проект приложения, и новый модуль библиотеки будет показан в представлении проекта. Теперь вы можете добавить библиотечный модуль в качестве зависимости для вашего прикладного модуля (например, «приложение») в структуру проекта: Project Structure | модули | приложение | зависимости | Добавить | Модульная зависимость.
Кристиан Шульцендорф

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 / приложение / myModulesFolder / myLibXYZ

На build.gradle

из проекта / приложения / 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»)

Затем включите новую библиотеку в качестве зависимости модуля. Теперь вы можете использовать встроенный AAR без включения источников в проект.

Кредит в Facebook за этот взлом. Я нашел решение при интеграции Android SDK в проект.


Какой модуль вы создали? Файл> Новый> Новый модуль>?
Аль Лелопат

В этом случае тип модуля - «Библиотека Android», если вы используете графический интерфейс для создания модуля. Вы можете превратить существующий модуль в библиотеку Android, изменив build.gradle модуля. изменить apply plugin: 'com.android.application'наapply plugin: 'com.android.library'
Виктор Удэ

Можно ли добавить несколько aar´s в один модуль? В противном случае мне нужно было бы создать более 10 модулей gradle, чтобы включить мои файлы
aar

@ MarianKlühspies многое изменилось с тех пор, как я изначально написал этот ответ. Я бы порекомендовал попробовать официальную документацию для включения aar в ваш проект: developer.android.com/studio/projects/…
Victor Ude

3

В моем случае ни один из ответов выше не сработал! так как у меня был другой продуктrepositories{ flatDir{ dirs 'libs' } }

не сработало! В итоге я указал точное местоположение каталога libs :

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

}

Думаю, нужно вводить flatDirs как это, когда в build.gradle есть разные productFlavors


2

В моем случае я просто помещаю файл aar в libs и добавляю

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

в build.gradle и все работает. Я думаю, что это похоже на сгенерированную зависимость по умолчанию:

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


"Api fileTree (dir: 'libs', include: ['* .aar])" работал отлично. Это не сработало, если бы я использовал «реализацию» вместо «api». Я никогда не мог заставить решение Виктора Удэ работать с несколькими Аар. Еще одно понимание: если вы используете ресурсы (например, макеты), убедитесь, что ссылки, в которых вы ссылаетесь, не содержат ресурс с тем же именем, что и в вашем 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было необходимо из-за его обязательности (не является обязательным / имеет значение по умолчанию) в kotlin 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
)

Отказ от ответственности: разница с использованием flatDirsподхода № 1 и № 2, я все еще не знаю много, вы можете отредактировать / прокомментировать этот ответ.

Ссылки:

  1. https://stackoverflow.com/a/56828958/3763032
  2. https://github.com/gradle/gradle/issues/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.