Как вручную включить внешний пакет 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

ashoke
источник
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')
Changhoon
источник
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'])
}
Mixel
источник
Это сработало, но как поставить проверку, если зависимость уже добавлена ​​как зависимость 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. Кредит идет к решению в этом посте

Nonos
источник
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 开发 中 使用

shusheng007
источник
этот ответ был действительно полезным для меня
Csabi
Если следовать первому способу, классы внутри aar-файла не обнаруживаются в основном проекте, нужно ли нам добавлять дополнительные настройки?
Киран
Пожалуйста, обновите или удалите, но ответы уже опубликованы, а вторая "компиляция" устарела.
Дэвид
12

С Android Studio 3.4 и Gradle 5 вы можете просто сделать это следующим образом

dependencies {
    implementation files('libs/actionbarsherlock.aar')
}
m0skit0
источник
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

jiparis
источник
Это верно, и вот пример: в 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
    ...
}
MOHAX
источник
3

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

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

GMsoF
источник
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 вашего проекта.

anupam_kamble
источник
0

В моем случае просто работайте, когда я добавляю «проект» для компиляции:

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


dependencies {
   compile project('com.x.x:x:1.0.0')
}
josedlujan
источник
0

Вы можете сделать что-то вроде этого:

  1. Поместите свои локальные библиотеки (с расширением: .jar, .aar, ...) в папку 'libs' (или другую, если хотите).

  2. В build.gradle (уровень приложения) добавьте эту строку в зависимости

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

nguyencse
источник