Добавление локальных файлов .aar в сборку Gradle с использованием flatDirs не работает

Мне известен этот вопрос: Добавление локальных файлов .aar в мой gradle build, но решение мне не подходит.

Я попытался добавить этот оператор на верхний уровень моего 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'), но безуспешно.

Что мне не хватает? Любые идеи?

P.S. Android Studio 0.8.2


person Alexey Dmitriev    schedule 01.07.2014    source источник
comment
flatDirs + compile (name: 'libname', ext: 'aar') у меня работает на Android Studio 8.2.0, + gradle 1.12. Значит, с вашим файлом сборки должно быть что-то не так. Проверьте еще раз или опубликуйте код   -  person Than    schedule 17.07.2014


Ответы (15)


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

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

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

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

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

MyApplication
  .idea
  app
  build.gradle (here's where to add compile project(':ProjectName') to dependency section)
  ProjectName (added automatically after importing, matching the name of your aar file)
  build
  gradle
  etc

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

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

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

person Ashton Engberg    schedule 22.07.2014
comment
Ой! Это помогло, спасибо за подробное объяснение. Мастер импорта под капотом делает то же самое, что описано на сайте Tools: Другой вариант - создать новый подпроект Gradle и сделать опубликованный артефакт этого проекта файлом jar или aar, который вы хотите повторно использовать. Тогда вы можете просто сделать так, чтобы другие подпроекты Gradle зависели от этого нового подпроекта. В этом новом подпроекте просто создайте build.gradle со следующим: configurations.create (по умолчанию) artifacts.add (default, file ('somelib.aar')) - person Alexey Dmitriev; 23.07.2014
comment
Я получаю сообщение об ошибке: Error:(25, 0) Required keys [path] are missing from map {name=mylibrary-debug}., если я использую compile project(name:'mylibrary-debug') .. Что мне не хватает? - person MysticMagicϡ; 12.02.2015
comment
Недавний плагин gradle сломал это. Решение здесь: stackoverflow.com/a/28816265/560600 - person Sky Kelsey; 06.03.2015
comment
Мне удалось использовать этот метод с Android Studio 1.3, плагином Android gradle v1.2.3 и Gradle версии 2.4. - person amram99; 07.08.2015
comment
Я знаю, что этот пост довольно старый, но это очень хороший обходной путь; небольшая ошибка, которую нужно отредактировать: build.gradle (вот где добавить проект компиляции (': ProjectName') в раздел зависимостей) - ›это верхний уровень, тот, который нужно отредактировать (как вы сказали несколькими строками ранее ) находится внутри приложения - person MarcinKwiatkowski; 12.10.2015
comment
Пожалуйста, также выполните чистую сборку после всех вышеперечисленных шагов. - person Ads; 28.01.2016
comment
Эй, так как это самый популярный и принятый ответ, вам следует обновить его до текущего поведения. - person Sky Kelsey; 29.04.2016
comment
В строке compile project(':Name-Of-Your-Project') я заменил Name-Of-Your-Project именем моего файла .aar (без расширения .aar). И это сработало. - person Sufian; 26.04.2017

Обновление: как упоминалось в @ amram99, проблема < / a> было исправлено в выпуске 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'
       }
 }
person Nishant.    schedule 02.03.2015
comment
Это правильный ответ и новейший способ сделать это. Пожалуйста, проголосуйте за этот ответ;) - person lmo; 24.03.2015
comment
Я скопировал ваш код, но знаете ли вы, почему у меня могла быть эта ошибка? Ошибка: возникла проблема при настройке проекта ": приложение". ›Артефакт 'signalr-client-sdk-android-release.aar (: signalr-client-sdk-android-release :)' не найден. Выполняется поиск в следующих местах: jitpack.io//signalr-client-sdk-android-release// - person toddmo; 15.04.2015
comment
Часть repositories входит в другую build.gradle для работы - глобальную. Часть dependencies входит в build.gradle модуля. Вот почему я получил ошибку. - person toddmo; 15.04.2015
comment
@toddmo Итак, мой ответ действительно применим к локальным файлам AAR. т.е. файл .aar, расположенный внутри вашего каталога libs. - person Nishant.; 16.04.2015
comment
@toddmo Я предполагаю, что вы пытаетесь вытащить файл aar из maven, который определенно войдет в глобальный файл build.gradle. - person Nishant.; 16.04.2015
comment
Добавление нового модуля Android Studio работает для меня с Android Studio 1.3, плагином Android gradle v1.2.3 и Gradle версии 2.4 - person amram99; 07.08.2015
comment
Даже с Android Studio 1.4 (Beta4) это, кажется, единственное решение, которое работает, если у вас есть более одного файла .aar, все с одинаковым именем пакета (я не проектировал это, вздох ...), из которого вы хотите включите его в свое приложение в зависимости от используемого аромата, поскольку также работают flavour1Compile (...), flame2Compile (...). - person Nantoka; 22.09.2015
comment
@AlexSales: Не могли бы вы уточнить, что происходит на вашей стороне? - person Nishant.; 02.11.2015
comment
@AlexSales: Я тоже получаю не удалось разрешить, используя структуру, описанную выше. Удалось ли вам решить эту проблему? - person Al Lelopath; 01.12.2015
comment
@AlLelopath Если ваш aar содержит транзитивные зависимости, вам нужно добавить флаг 'transitive true', который, как я предполагаю, не будет разрешен. Я не вижу проблем при использовании этого метода с различными версиями gradle и android studio. - person Nishant.; 01.12.2015
comment
@Radix: не могли бы вы мне помочь? Я сделал именно то, что вы сказали, и добавил 'transitive = true' в фигурные скобки, как указано в документации, но он все еще не включает :( :( Это так ужасно, чувак. - person aasu; 21.03.2016
comment
@ user2762451 это решение для локальных файлов aar. Вероятно, вы спрашиваете о транзитивных зависимостях. В таком случае это не сработает. Поскольку транзитивные зависимости работают с файлом pom, а в локальном файле aar нет pom, вам нужно будет отправить локальный файл aar в какой-то частный репозиторий maven, и тогда ваш transitive true будет работать. - person Nishant.; 22.03.2016
comment
@Radix wow, так есть ли способ включить транзитивные зависимости локального aar (конечно, без явного включения их в проект)? - person aasu; 22.03.2016
comment
@ user2762451 Боюсь, что мне ничего не известно. Вы должны понимать, что локальный файл AAR не знает, каковы транзитивные зависимости, если нет связанного файла POM. Ваш build.gradle не упаковывается в файл AAR, поэтому мы можем это исключить. Если вы используете POM, вы фактически используете артефакт maven, что означает, что вам нужно где-то развернуть его. - person Nishant.; 22.03.2016
comment
Как загрузить / собрать AR для определенного аромата? - person Muhammad Babar; 18.07.2016
comment
В последней версии Android Studio вот что находится в build.gradle: configurations.maybeCreate (по умолчанию) artifacts.add (default, file ('adclient-sdk-for-android-2.6.3.aar')) AAR сам по себе а затем может быть скомпилирован в другие модули, которые в нем нуждаются, с помощью проекта компиляции. - person Learn OpenGL ES; 17.11.2016
comment
@MuhammadBabar Вы должны взглянуть на это красивое сообщение в блоге - medium .com / @ sahildave / - person Nishant.; 07.12.2016
comment
Спасибо. Старая версия у меня не работала, новый способ импорта работал отлично! Gradle 3.5, отличный 2.4.10 - person Arnold Schrijver; 15.08.2017

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

Старый ответ

Попробуй это:

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

...

compile(name:'slidingmenu', ext:'aar')
person Josiah    schedule 02.07.2014
comment
Тоже не сработало ... Похоже, это известная ошибка, которая еще не исправлена: code.google.com/p/android/issues/detail?id=55863 - person Alexey Dmitriev; 02.07.2014
comment
Я сделал, как вы сказали при редактировании, но в итоге ничего не было добавлено. В мастере я выбрал путь к файлу AAR, указав имя модуля. После нажатия кнопки «Готово» выполнялась синхронизация файлов Gradle, но новые файлы или какие-либо строки в build.gradle не появлялись (в моей рабочей копии Git изменений не было). Я пробовал как с файлами AAR, так и с JAR с тем же результатом. (Я использую Android Studio 0.8.1) - person Alexey Dmitriev; 03.07.2014
comment
Спасибо за помощь, ваш ответ указывал в правильном направлении. Причина, по которой импорт AAR у меня не сработал, связана с другой проблемой: stackoverflow.com/questions/24703734/. - person Alexey Dmitriev; 23.07.2014
comment
Этот старый ответ действительно работает для меня, если я включаю блок flatDir { dirs 'libs' }, как указано в OP, с использованием AS 8.13 / Gradle 2.1 - person qix; 25.10.2014
comment
Я импортировал файл .aar, используя новый метод импорта. Но я не могу видеть имя класса библиотеки, когда набираю половину имени и нажимаю ctrl + пробел. Так что он все еще не рассматривает библиотеку. Любая идея? - person MysticMagicϡ; 12.02.2015
comment
Отредактированная версия отлично работает для Android Studio 1.2.1.1. Никаких других сценариев gradel делать не нужно. Вы можете создать новый модуль, как описано выше. В диалоговом окне «Создать новую модель» выберите путь к aar-файлу вашей библиотеки, например MyLib \ mylibrary \ build \ output \ aar. AS скопирует файл в новую локальную папку. Перестройте проект приложения, и новый модуль библиотеки отобразится в представлении проекта. Теперь вы можете добавить модуль библиотеки в качестве зависимости для модуля вашего приложения (например, «app») в структуру проекта: Структура проекта | модули | приложение | зависимости | Добавить | Зависимость от модуля. - person Christian Schulzendorff; 13.07.2015
comment
Это работает. Однако теперь у меня есть /libs/foo.aar И модуль / foo / с файлами build.gradle, foo.aar и foo.iml. Это кажется плохим, потому что в проекте есть 2 файла foo.aar. - person Al Lelopath; 01.12.2015

Я получил это, работая на 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')
}

Вот и все. Очистить и построить.

person Richard    schedule 23.06.2016
comment
Также работает для нескольких файлов aar в «Native_Ads». Очень хорошее решение! - person Christian Schulzendorff; 16.11.2016

Самый простой способ - добавить его как модуль

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

Это создаст новый модуль, содержащий файл aar, поэтому вам просто нужно включить этот модуль в качестве зависимости впоследствии.

person Marian Klühspies    schedule 17.08.2016
comment
Может быть, у вас есть идея, почему моя кнопка next становится серой в диалоговом окне Create New Module после выбора Импортировать JAR/AAR Package? - person Kevin Crain; 09.11.2016
comment
Обратите внимание, что я выбрал файл .aar и дал ему имя - person Kevin Crain; 09.11.2016
comment
Я выяснил причину, IDE проверяет путь, чтобы определить, находится ли .aar файл в каталоге проекта, я просто поместил .aar на свой рабочий стол и повторил попытку, и он работает, спасибо за ваше решение! - person Kevin Crain; 09.11.2016
comment
Может быть, глупый вопрос, но по поводу so you just need to include that module as a dependency afterwards - как вы это делаете? - person boltup_im_coding; 31.12.2017
comment
@boltup_im_coding, просто поместив ›проект компиляции (: yourmodule) в свои зависимости или используя Помощник в настройках модуля - person Marian Klühspies; 31.12.2017
comment
@Marian Klühspies Теперь я вижу, я не был уверен, что include в settings.gradle должно было быть достаточно. У меня все заработало. Спасибо! - person boltup_im_coding; 31.12.2017

Это моя структура, и как я ее решаю:

MyProject / app / libs / mylib-1.0.0.aar

МойПроект / приложение / myModulesFolder / myLibXYZ

В build.gradle

из Project / app / myModulesFolder / myLibXYZ

Я поставил это:

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

Готово и работает нормально, мой подмодуль XYZ зависит от некоторой библиотеки из основного модуля.

person lucasddaniel    schedule 03.05.2017

Вы можете сделать это так. Он должен быть в формате 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 и т. Д.)

person agrosner    schedule 22.05.2015

Для всех, у кого есть эта проблема с Android Studio 1.4, я заставил ее работать, создав модуль в проекте, который содержит две вещи.

  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')

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

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

person Victor Ude    schedule 24.10.2015
comment
Какой модуль вы создали? Файл ›Новый› Новый модуль ›? - person Al Lelopath; 01.12.2015
comment
В этом случае тип модуля - Android Library, если вы используете графический интерфейс для создания модуля. Вы можете превратить существующий модуль в библиотеку Android, изменив файл build.gradle модуля. изменить apply plugin: 'com.android.application' на apply plugin: 'com.android.library' - person Victor Ude; 03.12.2015
comment
Можно ли добавить несколько AR в один модуль? В противном случае мне нужно было бы создать более 10 модулей gradle, чтобы просто включить мои файлы aar - person Marian Klühspies; 02.04.2018
comment
@ MarianKlühspies многое изменилось с тех пор, как я впервые написал этот ответ. Я бы рекомендовал попробовать официальную документацию для включения aar в ваш проект: developer.android .com / studio / projects / - person Victor Ude; 23.05.2018

В моем случае ни один из приведенных выше ответов не сработал! так как у меня были разные ароматы продукта, просто добавляю

repositories {
    flatDir {
         dirs 'libs'
    }
}

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

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

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

person MohammadReza    schedule 25.05.2016

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

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

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

implementation fileTree(dir: 'libs', include: ['*.jar'])
person Glorin    schedule 06.03.2019
comment
Api fileTree (dir: 'libs', include: ['* .aar]) отлично работает. Это не сработало, если бы я использовал реализацию вместо api. Я никогда не мог заставить решение Виктора Удэ работать с несколькими aar. Еще одно замечание: если вы используете ресурсы (например, макеты), убедитесь, что ссылки, на которые вы ссылаетесь, не содержат ресурса с тем же именем, что и в вашем apk. Это может привести к ошибке, что он не может найти один из идентификаторов в макете. Проблема в том, что он использует неправильное пространство имен для id в макете aar. - person Tom Rutchik; 28.03.2019
comment
В моем случае строка «реализация fileTree» работала отлично. Фактически, это было единственное решение, которое я пробовал, и которое действительно работало. - person VictorEspina; 20.01.2021

Если вы уже используете 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

My 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
)

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

Использованная литература:

  1. https://stackoverflow.com/a/56828958/3763032
  2. https://github.com/gradle/gradle/issues/9272
person mochadwi    schedule 11.04.2020

Это решение работает с Android Studio 4.0.1.

Помимо создания нового модуля, как предложено в решении выше, вы можете попробовать это решение.

Если в вашем приложении несколько модулей и вы хотите добавить ARA только к одному из них, то это решение пригодится.

В корневом проекте build.gradle

Добавить

repositories {
flatDir {
    dirs 'libs'
}}

Затем в модуле, в который вы хотите добавить файл .aar локально. просто добавьте строки кода ниже.

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

}

Удачного кодирования :)

person Kumar Utkarsh    schedule 22.07.2020

Эта строка включает все файлы aar и jar из папки libs:

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

Это решение работает с Android Studio 4.0.1.

Помимо создания нового модуля, как предложено в приведенном выше решении, вы можете попробовать это решение.

Если в вашем приложении несколько модулей и вы хотите добавить ARA только к одному из них, то это решение пригодится.

В вашем корневом проекте build.gradle

Добавить

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

Затем в модуле, в который вы хотите добавить файл .aar локально. просто добавьте строки кода ниже.

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

}

Удачного кодирования :)

person Kumar Utkarsh    schedule 22.07.2020

Добавьте ниже в проект реализации файла приложения gradle (путь: ': имя проекта')

person Dinesh.P    schedule 25.07.2019