Как включить файлы 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

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

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

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

  1. Храните вашу библиотеку и ее зависимости в репозитории Maven.

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

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

В работе app- уровня build.gradle добавить Гав вашей библиотеки.

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

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