Как вручную включить внешний пакет aar с помощью новой системы сборки Gradle Android


406

Я экспериментировал с новой системой сборки Android и столкнулся с небольшой проблемой. Я собрал свой собственный aar-пакет ActionBarSherlock, который я назвал «actionbarsherlock.aar». На самом деле я пытаюсь использовать этот файл для создания моего окончательного APK. Если я включу всю библиотеку ActionBarSherlock в качестве модуля android-библиотеки в свой основной проект с использованием проекта компиляции (': actionbarsherlock'), я смогу успешно собрать без проблем.

Но моя проблема в том, что я хочу предоставить эту зависимость в виде пакета файлов aar ВРУЧНУЮ, просто если бы я использовал JAR, я не могу понять, как правильно включить его в свой проект. Я пытался использовать конфигурацию компиляции, но, похоже, это не работает. Я продолжаю получать, что не могу найти символ во время компиляции, который говорит мне, что class.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"
}

РЕДАКТИРОВАТЬ: Таким образом, ответ заключается в том, что в настоящее время он не поддерживается, вот проблема, если вы хотите отслеживать его.

РЕДАКТИРОВАТЬ: В настоящее время, поскольку это все еще не поддерживается напрямую, лучшей альтернативой, кажется, является предлагаемое решение от @RanWakshlak

РЕДАКТИРОВАТЬ: Также проще с использованием синтаксиса, предложенного @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'
      }
   }
}

а теперь откройте файл уровня приложения build.grdle и добавьте .aarфайл

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

Если все пойдет хорошо, вы увидите, что запись библиотеки сделана в build -> exploded-aar

Также обратите внимание, что если вы импортируете файл .aar из другого проекта, который имеет зависимости, вам также необходимо включить их в свой build.gradle.


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

2
Может быть, стоит посоветовать внести изменения в модуль приложения «build.gradle», а не в верхнюю папку «build.gradle».
— loloof64

4
нашел ответ на мой вопрос выше: вместо compileзависимости добавьте две зависимости debugCompile(name:'cards-debug', ext:'aar')иreleaseCompile(name:'cards-release', ext:'aar')
— Ифта

2
Не путайте с примером кода. Первый блок с allprojects {...}идет в файл Gradle уровня «проекта», а второй блок с dependencies {...}должен идти в файл Gradle уровня «приложения».
— Кирилл Кармазин

8
Пожалуйста, обновите свой ответ: ВНИМАНИЕ: Конфигурация 'compile' устарела и была заменена на 'реализация' и '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 почему тебе больно! Я хочу использовать IDE NetBeans в качестве платформы разработчика Android
— java acm

@ Оливер Ты потрясающий!
— Ankit Purwar

Вы самые лучшие!
— Codezombie

2
Не лучшая идея создавать новый модуль каждый раз, когда вы просто хотите добавить какую-нибудь aarбиблиотеку в свой проект
— Кирилл Кармазин

Ты потрясающий мой друг. !! Приветствия к этому.
— Тимоти Мачария

112

Вы можете ссылаться на файл AAR из репозитория. Maven - это вариант, но есть более простое решение: поместите файл aar в каталог libs и добавьте репозиторий каталога.

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

Затем обратитесь к библиотеке в разделе зависимостей:

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

Вы можете проверить сообщение в блоге Min'an для получения дополнительной информации.


1
Это прекрасно работает и лучше, чем принятые / более высоко оцененные ответы, потому что это проще, и я могу включить это в контроль версий, не добавляя файл в локальное хранилище maven каждого разработчика (если мне пришлось это делать, зачем использовать Gradle в первую очередь ?) Спасибо!
— ajpolt

@ajpolt Вероятно, рекомендуется вместо этого настроить сервер репо (для проприетарного отдела), чтобы вам не приходилось размещать его на компьютерах разработчиков или в папке lib вашего проекта. Если у вас есть только одна зависимость, выбросьте ее в репозиторий структурированного кода Google maven (в качестве временного репо)
— Lo-Tan

4
Наиболее важный момент, на который следует обратить внимание в этом ответе, - упоминание «@aar» в конце зависимости.
— Атхарва

Я полагаю, что это не будет работать с последним плагином Gradle: stackoverflow.com/questions/60878599/…
— Дэвид

Это единственный ответ, включающий простейшую форму со всем современным синтаксисом, включая implementationи т. Д. Это решение для копирования и вставки. Поступило много новых голосов, потому что Android Build Gradle Plugin 4.0.0 теперь выдает ошибку, а не игнорирует неработающие пути .aar
— Патрик

52

Приведенный ниже подход работает с последней версией Android Studio (> 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')

2
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
— Александр

1
Работая нормально, это путь, если библиотека проста. Но здесь есть проблема: вам нужно импортировать всю библиотеку, импортированную в ваш файл aar, чтобы она работала. Импорт из файла aar не распространяется с использованием этого метода.
— Тоблюг

Или еще проще:implementation fileTree(include: ['*.?ar'], dir: 'libs')
— Friederbluemle

@friederbluemle Вместо того, чтобы проще, я бы сказал, короче, и в то же время неопределенным, теоретически.
— Дэвид

21

Я только что преуспел!

  1. Скопируйте файл mylib-0.1.aar в папку libs /.

  2. Добавьте эти строки в конец build.gradle (должно быть приложение, а не проект):

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

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

Убедитесь, что вы включили автономную работу с помощью флажка в Project Structures / 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-студией? В eclipse «gradle eclipse» добавляет файл aar в путь к классам, но eclipse не распознает классы внутри него.
— andrej_k

Проверьте этот вопрос stackoverflow.com/questions/20911665/… если после выполнения этого урока ваш локальный файл .aar не найден (на Gradle 1.9 или выше)
— Maragues,

Пожалуйста, обновите или удалите, этот ответ устарел.
— Дэвид

19

Вы можете добавить несколько 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

@Adi Если у вас уже есть зависимость от maven, не помещайте соответствующий aar в libsпапку.
— миксель

Спасибо за ответ, как я уже говорил, добавление aar в libs автоматизировано плагином для студии Android, который находится в процессе разработки, поэтому я хочу знать, была ли ранее добавлена ​​зависимость, которую плагин добавляет в файл build.gradle.
— Ади

У меня нет ответа прямо сейчас. Я думаю, что лучше создать отдельный вопрос.
— Mixel

15

К сожалению, ни одно из решений здесь не сработало для меня (я получаю неразрешенные зависимости). Что, наконец, сработало, и это самый простой способ IMHO: выделите имя проекта из Android Studio, затем File -> New Module -> Import JAR или AAR Package. Кредит идет к решению в этом посте


1
Следует отметить, что Android Studio является исключительно неопределенным в своем мастере импорта. Когда они указывают «Имя файла» на одном из шагов, на самом деле они запрашивают путь к файлу ... Надеюсь, это сообщение спасет других от головной боли.
— Тукахо,

13

Есть 2 способа:

Первый способ

  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. Поместите свою aar lib в папку 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/…
— Дэвид

@ Давид Спасибо за отчет, я постараюсь проверить это как можно скорее.
— m0skit0

10

ОБНОВЛЕНИЕ ANDROID STUDIO 3.4

  1. Перейти к файлу -> Структура проекта

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

  1. Модули и нажмите на +

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

  1. Выберите Импорт .aar Package

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

  1. Найти маршрут .aar

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

  1. Завершите и примените , затем проверьте, добавлен ли пакет

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

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

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

  1. Проверьте пакет библиотеки и ОК

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

  1. Проверьте добавленную зависимость

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

  1. И структура проекта, как это

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


1
это 17-й ответ, который я прочитал, что наконец добавил зависимость .. эээ
— Тарас Мацык

6

У меня тоже была эта проблема. Этот отчет о проблеме: https://code.google.com/p/android/issues/detail?id=55863, по- видимому, предполагает, что прямая ссылка на файл .AAR не поддерживается.

Возможно, альтернативой на данный момент является определение библиотеки actionbarsherlock как библиотеки Gradle в родительском каталоге вашего проекта и ссылки соответственно.

Синтаксис определяется здесь http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Referencing-a-Library


Спасибо за ссылку на вопрос. Да, я знаю, как заставить это работать, используя Gradle Android Library, но этот вариант не совсем оптимален для проекта, над которым я работаю, но спасибо!
— Мигель Лавин

3

Я нашел этот обходной путь в трекере проблем Android: https://code.google.com/p/android/issues/detail?id=55863#c21

Хитрость (а не исправление) состоит в том, чтобы изолировать ваши файлы .aar в подпроект и добавить ваши библиотеки в качестве артефактов:

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

Дополнительная информация: Обработка транзитивных зависимостей для локальных артефактов jars-and-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
— Ли Чжэн

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 (уровень приложения) добавьте эту строку в зависимости

    реализация fileTree (включает: ['* .jar', '* .aar'], dir: 'libs')

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.