Как включить файлы aar, используемые в библиотечных проектах в основном проекте на Android
Мой проект включает в себя некоторый проект библиотеки. Библиотека использует некоторые файлы aar, и ее dependecny уже определен в модуле: gradle file. Я столкнулся с проблемой включения этой библиотеки в свой проект.
Если я сохраняю дубликаты файлов aar в app- > lib и определяю их зависимость в файле app → gradle, тогда проблем нет. Но это не должно быть правильным подходом.
Ниже приведена ошибка:
Возникла проблема с настройкой проекта ': app'.
Could not resolve all dependencies for configuration ':app:_qaDebugCompile'. Could not find :api-release:. Searched in the following locations:
https://jcenter.bintray.com//api-release//api-release-.pom
https://jcenter.bintray.com//api-release//api-release-.aar
file:/D:/sample/sample-android-app/app/libs/api-release-.aar
file:/D:/sample/sample-android-app/app/libs/api-release.aar
Required by:
sample-android-app:app:unspecified > sample-android-app:misnapworkflow:unspecified
найдите структуру проекта:
sample
|-- app
|-- misnapworkflow
|
|-- lib
|-- api-release.aar
В приложении gradle указан следующий файл, который включает проект
зависимости {компилировать проект (': misnapworkflow')}
Ниже приведен файл misnapworkflow gradle:
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
minSdkVersion 10
targetSdkVersion 23
consumerProguardFiles 'proguard-rules.pro'
}
lintOptions {
abortOnError false
}
// Publish both debug and release libraries
publishNonDefault true
buildTypes {
debug {
debuggable true
jniDebuggable true
minifyEnabled false
shrinkResources false
testCoverageEnabled true
}
release {
signingConfig signingConfigs.debug
debuggable false
jniDebuggable false
minifyEnabled true
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
task grantPermissions(type: Exec, dependsOn: 'installDebugTest') {
logger.warn('Granting permissions...')
commandLine "adb shell pm grant com.miteksystems.misnap.misnapworkflow.test android.permission.WRITE_EXTERNAL_STORAGE".split(' ')
commandLine "adb shell pm grant com.miteksystems.misnap.misnapworkflow.test android.permission.CAMERA".split(' ')
logger.warn('Permissions granted.')
}
tasks.whenTaskAdded { task ->
if (task.name.startsWith('connected')
|| task.name.startsWith('create')) {
task.dependsOn grantPermissions
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.0.1'
// Add dependency for MiSnap external API
compile(name: 'api-release', ext: 'aar')
// Add dependency for MiSnap
compile(name: 'misnap-release', ext: 'aar') {
exclude module: 'appcompat-v7'
}
// Eventbus dependency
compile 'de.greenrobot:eventbus:2.4.0'
// Add OPTIONAL dependency for Manatee
compile(name: 'manatee-release', ext: 'aar')
compile(name: 'cardio-release', ext: 'aar')
}
repositories {
flatDir {
dirs 'libs'
}
}
Ответы
Ответ 1
Файл aar не содержит transitive зависимости и doesn У меня есть файл pom, который описывает зависимости, используемые библиотекой.
Это означает, что если вы импортируете файл aar с помощью flatDir
repo , вы должны указать зависимости также в своем проекте.
Вам следует использовать хранилище maven (вы должны публиковать библиотеку в частном или публичном репозитории maven), у вас не будет такой же проблемы.
В этом случае gradle загружает зависимости, используя файл pom, который будет содержать список зависимостей.
Ответ 2
Для студии Android
Выполните следующие действия:
Шаг 1:
Импорт .aar
Файл --- > Новый --- > Новый модуль --- > (выберите) import.JAR/.AAR package --- > Далее --- > (выберите .aar
файл затем) Закончить
Теперь импортируется ваш существующий проект.
Шаг 2:
Добавить dependencies
Файл --- > Структура проекта --- > (Теперь вы получите список модулей слева внизу.) --- > (Выберите app
модуль) --- > выберите вкладку зависимостей --- > нажмите кнопку (+) --- > выберите зависимости модуля --- > (выберите модуль, который вы добавили) --- > ok --- > ok
![добавить зависимости (2)]()
Примечание. Чтобы проверить зависимость, добавляется
ваш build.gradle
выглядит как
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
compile 'com.squareup.picasso:picasso:2.5.0'
compile project(':ScreenSharingSDK')
}
Ответ 3
В моем случае работа над следующим:
Поместите ваш .aar файл в каталог libs (создайте, если необходимо), затем добавьте следующий код в свой build.gradle(уровень приложения):
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile(name:'your_arr_filename', ext:'aar')
}
Ответ 4
Вам нужно включить репозиторий jcenter. На уровне уровня приложения build.gradle:
repositories {
jcenter()
}
dependencies {
compile '[email protected]'
}
Эти зависимости отличаются от других.
Ответ 5
Если я сохраню дубликаты aar файлов в app-> lib и определю их зависимость в app-> gradle файле, то проблем не будет. Но это не должен быть правильный подход.
Вы правы, ваше app
не должно определять зависимости вашей библиотеки AAR в build.gradle
. Это обычная практика для сторонних библиотек, таких как OkHttp, Picasso или RxJava. Эти библиотеки, на самом деле, имеют свои собственные зависимости, как и ваша библиотека AAR.
Итак, почему OkHttp, Picasso или RxJava не просят ваше приложение включить их зависимости? Потому что они включили свои зависимости в файл POM. Файл POM содержит файл конфигурации для вашего AAR, включая ваш артефакт, имя группы, версию и ее зависимости.
Давайте возьмем OkHttp в качестве примера. OkHttp и его зависимости хранятся на компьютере других людей. Перейдите на mvnrepository.com и найдите OkHttp.
![Ok Http Maven]()
Вы найдете OkHttp и его файл POM.
<project>
<modelVersion>4.0.0</modelVersion>
<parent>...</parent>
<artifactId>okhttp</artifactId>
<name>OkHttp</name>
<dependencies>
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
</dependency>
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>...</build>
</project>
Когда вы включаете библиотеку в свой build.gradle()
, Gradle будет искать эту библиотеку в репозиториях, определенных в build.gradle
верхнего уровня. Для OkHttp он был сохранен в mavenCentral()
.
repositories {
google()
mavenCentral()
jcenter()
}
Gradle автоматически загрузит зависимости, вам не нужно указывать зависимости библиотеки для вашего проекта приложения.
Но это не должен быть правильный подход.
Правильный подход:
- Храните вашу библиотеку и ее зависимости в репозитории Maven.
Вы можете использовать локальный репозиторий Maven, разместить собственный репозиторий Maven или опубликовать свою библиотеку в Maven Central или Bintray. В этом заводе есть хороший учебник для этого.
- Создайте файл POM для своей библиотеки.
При развертывании AAR вы должны включить файл POM. Это можно сделать вручную.
mvn deploy:deploy-file \
-DgroupId=com.example \
-DartifactId=your-library \
-Dversion=1.0.1 \
-Dpackaging=aar \
-Dfile=your-library.aar \
-DpomFile=path-to-your-pom.xml \
-DgeneratePom=true \
-DupdateReleaseInfo=true \
-Durl="https://mavenUserName:[email protected]/repository/maven-releases/"
Или используя плагин Gradle для android-maven-publish.
gradle yourlibrary:assembleRelease yourlibrary:publishMavenReleaseAarPublicationToMavenRepository
- Поделитесь своей библиотекой с вашими коллегами:
В работе app- уровня build.gradle
добавить Гав вашей библиотеки.
dependencies{
implementation "com.example:yourlibrary:1.0.1"
}
Вы и ваши коллеги должны иметь возможность использовать yourlibrary
сейчас.