Can't use local .aar file inside the library m

2019-04-09 21:42发布

问题:

I have an aar of socialauth-android library added to my project. I've put it inside the flatDir directory as described here and it works just fine.
Now, I'm moving some of my code into the library module named commons, to reuse it in the another project. socialauth-android will be used entirely by library module, so I've moved it inside the project/commons/libs/ an rewritten my build.gradle files. From now on I can't build my project, because the following error arises:

Error:A problem occurred configuring project ':ScrollApplication'.
> Could not resolve all dependencies for configuration ':ScrollApplication:_developmentDebugCompile'.
   > Could not find :socialauth-android:.
     Searched in the following locations:
         http://dl.bintray.com/populov/maven//socialauth-android//socialauth-android-.pom
         http://dl.bintray.com/populov/maven//socialauth-android//socialauth-android-.aar
         https://oss.sonatype.org/content/repositories/snapshots//socialauth-android//socialauth-android-.pom
         https://oss.sonatype.org/content/repositories/snapshots//socialauth-android//socialauth-android-.aar
         https://repo1.maven.org/maven2//socialauth-android//socialauth-android-3.2.pom
         https://repo1.maven.org/maven2//socialauth-android//socialauth-android-3.2.aar
         file:/home/artem/Workspace/scrollandroid/libraries/socialauth-android-3.2.aar
         file:/home/artem/Workspace/scrollandroid/libraries/socialauth-android.aar
     Required by:
         scrollandroid:ScrollApplication:unspecified > scrollandroid:commons:unspecified

The error says that dependency resolver tries to find socialauth-android.aar inside the project/libraries folder which is the folder for all common libraries shared between modules of my project. But I've written in my project/commons/build.gradle file that the flatDir for the commons module is project/commons/libs! Moreover, all jar libraries contained inside the project/commons/libs/ are found during the build w/o any issues.

What can be the source of this issue?

Following are my build.gradle files (some of its code, like dependencies declarations, is dropped for brevity):

project/settings.gradle:

include ':ScrollApplication', ':commons'

project/build.gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0-rc1'
    }
}

project/commons/build.gradle:

apply plugin: 'com.android.library'

repositories {
    maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
    mavenCentral()

    flatDir {
        dirs "libs"
    }
}

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile(name:'socialauth-android', ext:'aar')
}

project/app/build.gradle:

apply plugin: 'com.android.application'

repositories {
    maven { url "http://dl.bintray.com/populov/maven" }
    maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }

    mavenCentral()

    flatDir {
        dirs "../libraries"
    }
}

configurations {
    apt
}

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 21
    }

    lintOptions {
        abortOnError false
    }
}

dependencies {
    compile project(':commons')

    compile fileTree(dir: '../libraries', include: ['*.jar'])
}

Upd: project structure added

├── build.gradle
├── commons
│   ├── build.gradle
│   ├── libs
│   ├── proguard-rules.pro
│   └── src
│       ├── androidTest
│       │   └── java
│       └── main
│           ├── AndroidManifest.xml
│           ├── assets
│           ├── java
│           └── res
├── gradle
│   └── wrapper
├── libraries
│   ├── aws-android-sdk-1.7.1.1-core.jar
│   ├── aws-android-sdk-1.7.1.1-s3.jar
│   ├── libGoogleAnalyticsServices.jar
│   └── supertooltips-3.0.1.aar
├── scrollandroid-hg.iml
├── ScrollApplication
│   ├── build.gradle
│   ├── proguard.cfg
│   ├── ScrollApplication.iml
│   └── src
│       └── main
│           ├── AndroidManifest.xml
│           ├── assets
│           ├── java
│           └── res
├── settings.gradle
└── stacktrace.txt

回答1:

It appears that the commons library is being built correctly (can you compile it separately to verify?) but the application is not. Gradle has some special rules for handling transitive dependencies (dependences nested in other dependencies) which exists since commons depends on socialauth-android.

Try adding an extra directory to the "flatDir" attribute in "project/app/build.gradle"

flatDir {
    dirs "../libraries", "../commons/libs"
}


回答2:

Seems to be a known issue that has been there for long time. The way to include the .aar dependency now days is like referenced in this question:

Adding local .aar files to Gradle build using "flatDirs" is not working

By default the resulting artifact will not include the files in the .aar file, unless you create a gradle task that copy the .aar content into your desired artifact.

If you plan to publish your .aar library in a Maven repo, the resulting POM file will have your dependency version set as undefined. To change it, you will need to work with the Dependency Substitution methods from gradle in your project.