Как включить файлы aar, используемые в проектах библиотек, в основной проект на Android

Мой проект включает в себя некоторый библиотечный проект. Библиотека использует несколько файлов aar, и ее зависимость уже определена в модуле: файл gradle. У меня возникла проблема с включением этой библиотеки в мой проект.

Если я сохраню дубликаты файлов 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:

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

person Manish    schedule 21.06.2016    source источник
comment
Вам удалось решить эту проблему? Я столкнулся с той же проблемой. Если я не скопирую файл aar в модуль приложения, он не будет работать. У меня есть инструкция jcenter и flatDir в приложении gradle, но это не имеет значения.   -  person Lancelot    schedule 26.05.2017
comment
@Lancelot Я решил эту проблему в своем проекте, пожалуйста, проверьте ответ ниже   -  person aldok    schedule 28.01.2018
comment
@aldok спасибо!!! Прошло какое-то время, так что он действительно больше не нужен. Спасибо, в любом случае :)   -  person Lancelot    schedule 02.02.2018


Ответы (5)


Файл aar не содержит ссылку transitive зависимости и не имеет pom-файла, описывающего зависимости, используемые библиотекой.

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

Вы должны использовать репозиторий maven (вы должны опубликовать библиотеку в частном или общедоступном репозитории maven), у вас не будет такой же проблемы.
В этом случае gradle загружает зависимости, используя pom, который будет содержать список зависимостей.

person Gabriele Mariotti    schedule 21.06.2016
comment
если есть какой-то файл aar, используемый модулем библиотеки, но не в модуле приложения, мне все равно нужно хранить две копии одного и того же файла aar? Обратите внимание, что в моем случае библиотечный модуль является сторонней библиотекой. поэтому я не хочу изменять файл градиента модуля lib - person Manish; 21.06.2016
comment
Может ли это быть достигнуто с использованием предоставленного тега - person Manish; 21.06.2016
comment
Вы можете использовать тот же файл aar, не копируя его. В любом случае вам не нужно изменять файл gradle библиотеки, но вы должны иметь зависимости в файле build.gradle вашего приложения. - person Gabriele Mariotti; 21.06.2016
comment
Я сделал то же самое, но получаю ошибку. Все файлы aar копируются в папку lib модуля, а также упоминаются в файле gradle библиотеки. Теперь в моем модуле приложения в файле gradle я написал включенный проект lib в зависимость, а также все файлы aar. Gradle ищет их в папке app:libs - person Manish; 21.06.2016
comment
@Manish Вы должны указать папку aar в вашем flatDir, а также вы должны добавить репозиторий jcenter в свой файл build.gradle. - person Gabriele Mariotti; 21.06.2016
comment
Вы можете указать aar в модуле, используя - flatDir { dirs ${rootProject.projectDir}/path/to/aar } - person enyciaa; 25.10.2017
comment
@GabrieleMariotti, на этот раз у меня проблема с Maven. Я опубликовал один из модулей lib (скажем, lib1) в jfrog. Теперь другой библиотечный модуль (lib2) зависел от модуля lib1. Другие модули lib (lib3, lib4) и модуль приложения зависят от lib2 и могут использовать lib1 без добавления lib1 в зависимости. но с того момента, как lib2 ссылается на lib1 через репозиторий jfrog, все остальные модули (lib3, lib4, app) также должны добавлять lib1 в зависимость, иначе возникает ошибка, неспособная разрешить lib1:1.0.0 - person Manish; 11.12.2017

Для Android-студии

Выполните следующие действия:

Шаг 1:

Импортировать .aar

Файл ---> Создать ---> Новый модуль ---> (выбрать) импортировать пакет .JAR/.AAR ---> Далее ---> (затем выбрать .aar файл)Готово

Теперь ваш существующий проект импортирован.

Шаг 2:

Добавить dependencies

Файл ---> Структура проекта ---> (Теперь вы получите список модулей слева внизу.) ---> (Выберите app модуль) ---> выберите вкладку зависимостей ---> щелкните (+) кнопка ---> выберите зависимости модуля ---> (выберите модуль, который вы добавили) ---> ок ---> ок

«Добавить  добавить зависимости(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')
}
person Pramod Waghmare    schedule 21.06.2016
comment
Привет, Pramod, все зависимости проекта уже определены, но есть некоторые файлы aar, которые используются самим проектом библиотеки. эти файлы aar находятся в папке lib папки модуля, но gradle ищет их в папке lib приложения - person Manish; 21.06.2016

В моем случае сработало следующее:

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

    repositories { 
        flatDir { 
            dirs 'libs' 
        } 
    } 

    dependencies { 
        compile fileTree(dir: 'libs', include: ['*.jar']) 
        compile(name:'your_arr_filename', ext:'aar') 
    } 
person Monika Moon    schedule 14.02.2018

Если я сохраню дубликаты файлов aar в app-> lib и определю их зависимость в файле app-> gradle, тогда проблем не будет. Но это не должно быть правильным подходом.

Вы правы, ваш app не должен определять зависимости вашей библиотеки AAR в build.gradle. Это обычная практика для сторонних библиотек, таких как OkHttp, Picasso или RxJava. Эти библиотеки, по сути, имеют свои собственные зависимости, как и ваша библиотека AAR.

Так почему же OkHttp, Picasso или RxJava не просят ваше приложение включить их зависимости? Поскольку они включили свои зависимости в файл POM. Файл POM содержит файл конфигурации для вашего AAR, включая ваш артефакт, имя группы, версию и ее зависимости.

Возьмем в качестве примера OkHttp. OkHttp и его зависимости хранятся на чужом компьютере. Перейдите на mvnrepository.com и найдите OkHttp.

Хорошо 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 автоматически загрузит зависимости, вам не нужно указывать зависимость библиотеки от вашего проекта приложения.

Но это не должно быть правильным подходом.

Правильный подход такой:

  1. Сохраните свою библиотеку и ее зависимости в репозитории Maven.

Вы можете использовать локальный репозиторий Maven, разместить собственный репозиторий Maven или опубликовать свою библиотеку на Maven Central или Bintray. В inthecheesefactory есть хорошее руководство по этому вопросу.

  1. Создайте файл 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
  1. Поделитесь своей библиотекой с коллегами:

На уровне приложения build.gradle добавьте GAV своей библиотеки.

dependencies{
    implementation "com.example:yourlibrary:1.0.1"
}

Теперь вы и ваши коллеги сможете использовать yourlibrary.

person aldok    schedule 28.01.2018

Моника Мун указала мне правильный путь, но у меня недостаточно очков репутации, чтобы прокомментировать выше. вздох

Таким образом, приложение для Android по умолчанию, созданное в 2020 году с помощью Android Studio 3.5.3, будет иметь следующую структуру проекта в представлении проекта:

--[yourAppName]
  --[app]
  --[gradle]
  build.gradle <this is the TOP LEVEL one and NOT the one you normally mess with>

В файлах build.gradle верхнего уровня добавьте элемент «flatDir»:

allprojects {
        repositories {
            google()
            jcenter()

            // needed so it picks up my aar files
            flatDir {
                dirs 'libs'
            }
        }
}

Затем в папке «приложение», показанной выше. У вас будут два ключевых ресурса:

 -- [libs] folder where you should drop your aar files
 build.gradle file that is the one you add your aar dependencies to.

Сборка проекта по умолчанию уже будет содержать для вас включение «libs», но на случай, если в вашей версии его нет, это то, что вам нужно добавить:

dependencies {
    implementation fileTree(dir: './libs', include: ['*.jar'])
    implementation(name: 'fileNameBeforeExtension', ext:'aar')

Это чисто и работает так, как ожидалось.

Файл AAR, который я использую, является собственным заказом, созданным для внутреннего оборудования, и никогда не будет в общедоступном репозитории.

person Waxhaw    schedule 02.01.2020