不能在库模块中使用本地 .aar 文件

问题描述:

我添加了 socialauth-android 库的 aar我的项目.我已将它放在 flatDir 目录中,如 此处,效果很好.
现在,我将我的一些代码移动到名为 commons 的库模块中,以便在另一个项目中重用它.socialauth-android 将完全由库模块使用,所以我将它移到 project/commons/libs/ 中并重写了我的 build.gradle代码>文件.从现在开始我无法构建我的项目,因为出现以下错误:

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

该错误表明依赖项解析器试图在 project/libraries 文件夹中查找 socialauth-android.aar,该文件夹是我的模块之间共享的所有公共库的文件夹项目.但是我在我的 project/commons/build.gradle 文件中写了 flatDircommons 模块是 project/commons/库!此外,在构建过程中可以找到 project/commons/libs/ 中包含的所有 jar 库,没有任何问题.

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?

以下是我的 build.gradle 文件(为简洁起见,删除了其中的一些代码,如依赖项声明):

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:添加的项目结构

├── 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

看来 commons 库正在正确构建(可以单独编译以验证吗?) 但应用程序不是.Gradle 有一些特殊的规则来处理传递依赖(嵌套在其他依赖中的依赖),因为 commons 依赖于 socialauth-android.

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.

尝试在project/app/build.gradle"中的flatDir"属性中添加一个额外的目录

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

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