Добавление локальных файлов.aar в мою сборку Gradle
Итак, я создал Android-библиотеку и успешно скомпилировал ее в файл.aar, который я назвал этим файлом aar: "projectx-sdk-1.0.0.aar"
теперь я хочу, чтобы мой новый проект зависел от этого аара, поэтому я следил за этим постом: http://life.nimbco.us/referencing-local-aar-files-with-android-studios-new-gradle-based-build-system/
Но пост меня смущает, так как я не получаю желаемого результата:
Название пакета Аар: com.projectx.photosdk
и модуль внутри называется sdk
вот моя текущая структура проекта:
|-SuperAwesomeApp
|--.idea
|--gradle
|--App
|---aars
|----projectx-sdk-1.0.0.aar
|---build
|---jars
|---src
|---build.gradle
И он мой файл сборки Gradle:
apply plugin: 'android'
buildscript {
repositories {
mavenCentral()
flatDir {
dirs 'aars'
}
}
}
android {
compileSdkVersion 19
buildToolsVersion "19.0.1"
defaultConfig {
minSdkVersion 11
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile 'com.android.support:gridlayout-v7:19.0.1'
compile 'com.android.support:support-v4:19.0.1'
compile 'com.android.support:appcompat-v7:19.0.1'
compile 'com.projectx.photosdk:sdk:1.0.0@aar'
// compile files( 'aars/sdk-1.0.0.aar' ) // Does not work either
}
// РЕДАКТИРОВАТЬ
Ошибки, которые я получаю:
Failed to refresh Gradle project 'SuperAwesomeApp'
Could not find com.projectx.photosdk:sdk:1.0.0.
Required by:
SuperAwesomeApp:App:unspecified
7 ответов
Вы положили flatDir
блокировать неправильно repostories
блок. repositories
блок внутри buildscript
говорит Gradle, где найти плагин Android-Gradle, но не остальные зависимости. Вам нужно иметь еще один верхний уровень repositories
блок, как это:
repositories {
mavenCentral()
flatDir {
dirs 'aars'
}
}
Я проверил это, и все работает нормально на моей установке.
В последних версиях Android Studio, протестированных в версии 1.3, для использования локального файла.AAR, а не одного файла, извлеченного из репозитория maven / jcenter, просто перейдите в " Файл"> "Создать"> "Новый модуль" и выберите " Импорт пакета.JAR/.AAR".
В результате вы получите новый модуль в вашем проекте, который содержит очень простой файл build.gradle, который выглядит примерно так:
configurations.create("default")
artifacts.add("default", file('this-is-yours-package-in-aar-format.aar'))
Конечно, другие проекты должны ссылаться на этот новый модуль с регулярной директивой проекта компиляции. Таким образом, в проекте, который использует этот новый модуль, который является простым, локальный файл.aar имеет это в своем build.gradle
[...]
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
ompile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:design:23.1.0'
[...]
compile project(':name-of-module-created-via-new-module-option-described-above')
}
[...]
В Android Studio 3.1.3 с gradle 3.0.1.
Просто добавив implementation fileTree(dir: 'libs', include: ['*.aar'])
или же implementation files('libs/app-release.aar')
без каких-либо других flatdir
работает.
В эти дни (более 1 года после этого вопроса) с Android Studio >1.0 локальная зависимость работает правильно:
- Android SDK ищет зависимости в локальном репо по умолчанию:
$ANDROID_HOME/extras/android/m2repository/
В проекте локальной библиотеки вы можете опубликовать aar в этом каталоге. Вот фрагмент, который можно добавить к вашему модулю
build.gradle
файл (напр.: sdk/build.gradle)apply plugin: 'maven' uploadArchives { repositories { mavenDeployer { repository(url: "file://localhost" + System.getenv("ANDROID_HOME") + "/extras/android/m2repository/") pom.version = '1.0-SNAPSHOT' pom.groupId = 'your.package' pom.artifactId = 'sdk-name' } } }
- некоторые справочные документы по Gradle http://gradle.org/docs/current/userguide/artifact_management.html
- В своем проекте библиотеки запустите
./gradlew uploadArchives
опубликовать AAR в этот каталог - В проекте приложения, в котором вы хотите использовать библиотеку, добавьте зависимость в ваш проект /app/build.gradle.
compile 'your.package:sdk-name:1.0-SNAPSHOT'
Для локальной зависимости следующая сборка gradle должна найти ранее развернутый архив и все!
В моем случае я использую вышеупомянутое для локальной разработки, но у меня также есть сервер непрерывной интеграции Bamboo для библиотеки, который публикует каждую сборку в общем хранилище артефактов Nexus. Полный код библиотеки для развертывания артефакта становится:
uploadArchives {
repositories {
mavenDeployer {
if (System.getenv("BAMBOO_BUILDNUMBER") != null) {
// Deploy to shared repository
repository(url: "http://internal-nexus.url/path/") {
authentication(userName: "user", password: "****")
}
pom.version = System.getenv("BAMBOO_BUILDNUMBER")
} else {
// Deploy to local Android sdk m2repository
repository(url: "file://localhost" + System.getenv("ANDROID_HOME")
+ "/extras/android/m2repository/")
pom.version = '1.0-SNAPSHOT'
}
pom.groupId = 'your.package'
pom.artifactId = 'sdk-name'
}
}
}
Чтобы указать приложениям для загрузки из моего внутреннего репозитория Nexus, я добавил внутренний репозиторий Nexus maven чуть выше jcenter() в обоих блоках "хранилища" в проекте / build.gradle.
repositories {
maven {
url "http://internal-nexus.url/path/"
}
jcenter()
}
И зависимость приложения тогда выглядит compile 'your.package:sdk-name:45'
Когда я обновляю версию 45 до 46, это когда мой проект получит новый артефакт с сервера Nexus.
В новейшей версии Gradle теперь есть немного обновленный способ сделать то, что предложил Стэн (см. Публикацию maving)
apply plugin: 'maven-publish'
publishing {
publications {
aar(MavenPublication) {
groupId 'org.your-group-id'
artifactId 'your-artifact-id'
version 'x.x.x'
// Tell maven to prepare the generated "*.aar" file for publishing
artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
}
}
repositories {
maven {
url("file:" + System.getenv("HOME") + "/.m2/repository")
}
}
}
Кажется, что добавление файлов.aar как локальной зависимости еще не поддерживается (планируется в бета-версии 0.5.0)
https://code.google.com/p/android/issues/detail?id=55863
Но то, как вы используете свою библиотеку в зависимости, будет работать только в том случае, если ваша библиотека находится в центральном репозитории maven или в локальном репозитории maven.
Обратитесь к разделу Как использовать локальный репозиторий maven для использования.aar в зависимостях модуля.
http://www.flexlabs.org/2013/06/using-local-aar-android-library-packages-in-gradle-builds
Это для Kotlin DSL (build.gradle.kts), если вы поместите файлы в
my-libs
подкаталог относительно того, где находится файл сборки:
dependencies {
implementation(
fileTree("my-libs/") {
// You can add as many include or exclude calls as you want
include("my-first-library.aar")
include("another-library.aar")
// You can also include all files by using a pattern wildcard
include("*.jar")
exclude("the-bad-library.jar")
}
)
// Other dependencies...
}
Дополнительные способы сделать это см. в документации Gradle , а также в этом посте и этом посте .