无法在库模块中使用本地.aar文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在库模块中使用本地.aar文件相关的知识,希望对你有一定的参考价值。

我有一个aarsocialauth-android库添加到我的项目中。我把它放在flatDir目录中,如here所述,它工作得很好。 现在,我将一些代码移动到名为commons的库模块中,以便在另一个项目中重用它。 socialauth-android将完全被库模块使用,所以我把它移到了project/commons/libs/里面,重写了我的build.gradle文件。从现在开始,我无法构建我的项目,因为出现以下错误:

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

错误说依赖解析器试图在socialauth-android.aar文件夹中找到project/libraries,这是我项目模块之间共享的所有公共库的文件夹。但我在我的project/commons/build.gradle文件中写道,flatDir模块的commonsproject/commons/libs!此外,jar中包含的所有project/commons/libs/库都可以在构建期间找到任何问题。

这个问题的根源是什么?

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

项目/ settings.gradle:

include ':ScrollApplication', ':commons'

项目/的build.gradle:

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

项目/公/的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')
}

项目/应用/的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

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

flatDir {
    dirs "../libraries", "../commons/libs"
}
另一答案

似乎是一个长期存在的已知问题。现在包含.aar依赖项的方式就像在这个问题中引用的那样:

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

默认情况下,生成的工件不会包含.aar文件中的文件,除非您创建将.aar内容复制到所需工件中的gradle任务。

如果您计划在Maven仓库中发布.aar库,则生成的POM文件将使您的依赖项版本设置为undefined。要更改它,您需要在项目中使用gradle中的Dependency Substitution方法。

以上是关于无法在库模块中使用本地.aar文件的主要内容,如果未能解决你的问题,请参考以下文章

关于创建Android Library所需要知道的一切

关于创建Android Library所须要知道的一切

本地aar文件引用

Android Studio 打包 jar 及 aar 包

Android Studio 打包 jar 及 aar 包

Android Studio 打包 jar 及 aar 包