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

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

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

пожалуйста, найдите ниже ошибки:

возникла проблема с настройкой проекта ': 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 файл ниже был упомянут, чтобы включить проект

зависимости { compile project (': misnapworkflow')}

пожалуйста, найдите ниже файл gradle 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'
    }
}

5 ответов


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

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

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


для Android studio

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

Шаг 1:

импорт .aar

Файл - - - > Создать - - - > новый модуль - - - > (выбрать) импорт .СОСУД./Пакет AAR - - - > Далее - - - >(выберите .aar файл тогда) Finish

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

Шаг 2:

добавить dependencies

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

To add dependencies(1)  add dependencies(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')
}

необходимо включить репозиторий jcenter. В сборке уровня приложения.тип gradle:

   repositories {
           jcenter()
    }

dependencies {
      compile 'com.package.youraarpackagename@aar'
}

эти зависимости отличаются от остальных.


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

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

    repositories { 
        flatDir { 
            dirs 'libs' 
        } 
    } 

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

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

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

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

правильный подход-это:

  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:mavenPassword@nexus.example.com/repository/maven-releases/"

или через android-maven-опубликовать Gradle в плагин.

gradle yourlibrary:assembleRelease yourlibrary:publishMavenReleaseAarPublicationToMavenRepository
  1. поделиться своей библиотекой с коллегами:

в приложения-уровень build.gradle добавить гав библиотеки.

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

вы и ваши сверстники должны иметь возможность использовать yourlibrary сейчас.