在我的Android Studio项目中,我有两个子项目/模块:一个Android应用程序(App1
)和一个Android库项目(LibraryProject1
)。 App1
取决于LibraryProject1
。到现在为止还挺好。
但是,LibraryProject1
反过来需要导入AAR库才能正常工作。
所以我的配置如下:App1
包括LibraryProject1
LibraryProject1
包括dependency.aar
现在,要包含dependecy.aar
,我将使用此处详细介绍的方法:
How to manually include external aar package using new Gradle Android Build System
所以基本上在我的build.gradle
的LibraryProject1
中,我有:
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”文件夹未作为存储库包含在内,从而导致编译失败。如果我从
App1
的build.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仍无法识别类型。