在我的Android Studio项目中,我有两个子项目/模块:一个Android应用程序(App1)和一个Android库项目(LibraryProject1)。 App1取决于LibraryProject1。到现在为止还挺好。

但是,LibraryProject1反过来需要导入AAR库才能正常工作。

所以我的配置如下:App1包括LibraryProject1LibraryProject1包括dependency.aar
现在,要包含dependecy.aar,我将使用此处详细介绍的方法:

How to manually include external aar package using new Gradle Android Build System

所以基本上在我的build.gradleLibraryProject1中,我有:

repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    compile (name:'dependency', ext:'aar') //my AAR dependency
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
}

显然,我将我的dependency.aar文件放在LibraryProject1的libs目录中

但是,这不起作用。似乎完全忽略了LibraryProject1添加的存储库,并且本地“libs”文件夹未作为存储库包含在内,从而导致编译失败。

如果我从App1build.gradle添加存储库,则可以使用,但我不想这样做,它是需要AAR文件的LibraryProject1,而不是App1

我怎样才能做到这一点??

最佳答案

好吧,我找到了一种方法,但是由于它非常“棘手”,所以我将不容置疑,以防万一有人提出更好,更“合适”的解决方案。

基本上,问题在于,如果从flatDir的build.gradle脚本中包含了LibraryProject1信息库,则在编译时将其忽略,所以我要做的是使用App1的build.gradle将“flatDir”信息库“注入(inject)” LibraryProject1。像这样的东西:

//App1 build.gradle
dependencies {
    //get libraryproject1 Project object
    Project p = project(':libraryproject1')

    //inject repository
    repositories{
        flatDir {
            dirs p.projectDir.absolutePath + '/libs'
        }
    }

    //include libraryproject1
    compile p
}

这有效地允许LibraryProject1包含外部AAR库,而无需App1包含它。这很hacky,但是可以用。请注意,您仍然必须输入:
//LibraryProject1 build.gradle
repositories {
    flatDir {
        dirs './libs'
    }
}

否则在LibraryProject1的build.gradle内,即使项目本身可以正常编译,IDE也无法识别AAR库中包含的类型。请注意,路径中的./似乎也很重要,没有它,IDE仍无法识别类型。

10-08 18:26