Android Studio添加外部项目以build.gradle


139

我有一个示例项目,具有以下设置:

/root
  + Pure Java Lib
  + Android Test Lib
  + Android Test Project

测试项目 ”依赖于“ 测试库 ”,而最后一个依赖于“ 纯Java库 ”。 编译项目并启动此安装程序就可以了。

我现在正在考虑导入以前的Eclipse工作区并与Android Studio一起使用,问题是项目设置不同,我想保留这种方式。

例如,如果使用前面的示例:

/root
  + Android Test Lib
  + Android Test Project

/Some Other folder (another repository for example)
  + Pure Java Lib

我尝试了许多配置,但是没有找到在父文件夹(在本例中为' root ')范围之外引用项目的方法。

在许多平台/模块中,您都可以使用'..'在文件夹中上移,但这对我而言不起作用,也许我使用错了。

有谁知道用Gradle如何做到这一点?

更新

我将尝试更通用:

/C:/

  /Project A
    + Module 1 - Pure Java
    + Module 2 - Android Test Lib
    + Module 3 - Android Test Project

  /Project B
    + Module 1 - Pure Java
    + Module 2 - Pure Java
    + Module 3 - Pure Java

我想用模块1的B项目在项目中


更新:09-03-19

我现在看到了,我必须更新……将近六年之后,今天我变得更加聪明了,我可以肯定地说,问题是我误解了“真理之源”的概念。

虽然拥有一个库的引用是一个很好的概念..并且看起来像是一个“真理之源”,但真正的“真理之源”将是每个项目正在使用该库的代码版本,因为库本身具有版本。许多版本的“真相来源”与使用该库的项目有关。

正确的方法是使用大多数开发人员不喜欢的东西,那就是git子模块,是的,重复每个项目中的源代码会导致每个项目使用不同版本的代码的可能性很大。

但是,您将需要使所有项目都使用所有库的最新和最佳版本。这本身就是一个挑战。

这是使用库源代码开发项目的正确方法的原因是这样可以扩展...您可以拥有数百个具有各自库配置的项目。


4
我看到这个问题引起了人们的关注……经过非常认真的尝试,我现在放弃了Android studio,因为我尝试构建的安装程序过于复杂,并且构建最终项目是可行的,但高度不稳定。每次启动Android Studio时,我都必须再次设置一些参数,并手动使构建正常进行。我放弃了大约两个月,我希望现在情况会好起来!
TacB0sS 2013年

方法2在这里解释如何做到这一点很容易:stackoverflow.com/questions/25610727/...
多伦·本-阿里

Answers:


222

假设“其他文件夹”是一个gradle项目,则可以将以下内容添加到settings.gradle文件中:

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')

1
someOtherFolder指向项目文件夹,并且其中有模块,我有兴趣将这些模块添加为Android Lib项目的模块
TacB0sS 2013年

设置目录指向“ root”,我需要获得更高的级别,才能指向另一个项目中的另一个模块。
TacB0sS 2013年

之后可以添加子模块吗?包括':someOtherFolder:proj1'–
Ethan

1
更新了一些细节。settings.gradle应该位于/ Project A
Ethan

5
好答案。在AS 1.0.2,我还需要做到以下几点:右键单击模块- >打开模块设置- >相关性- > +(底部),选择模块依赖关系,从列表中选择您的图书馆,点击ok :)
T. Coutlakis 2015年

49

您必须输入文件settings.gradle这行:

include ':module2'
project(':module2').projectDir = new File(settingsDir, '../Project 2/Module2')

然后,您必须在依赖关系树中的以下行中添加builde.gradle(模块:app)

implementation project(':module2')

或进入“ 项目结构” >“ 应用程序” >“ 依赖关系”,单击“ 添加”,选择“ 3个模块依赖关系”并选择您的模块


1
如果您在从主应用程序引用库的类时遇到问题,这是因为该库可能具有不同的变体。因此,只需以适当的方式指定依赖项:compile project(path: ':library', configuration: 'variant')。在这里,variantflavorbuildType由库的定义build.gradle文件。例如,如果您想release以某种形式构建库的类型developvariant则为developRelease
Sevastyan Savanyuk '17

9

使用Gradle 1.10(不知道该版本还适用于什么其他版本),这是我根据以下此处给出的响应提出的:http://forums.gradle.org/gradle/topics/reference_external_project_as_dependancy

我有一个api库项目,一个公共库项目和主应用程序项目。每个库都是一个独立的开发项目,并且两个库旨在在多个应用程序之间共享。

在公共项目的settings.gradle中:

def apiLibDir = file('../android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

然后在主应用程序项目settings.gradle中:

def apiLibDir = file('../android-libs/android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

def commonLibDir = file('../android-libs/android-common/android-common-lib')
settings.createProjectDescriptor(rootProjectDescriptor, 'android-common-lib', commonLibDir)
include ':android-common-lib'

在每个各自的build.gradle文件中,您都可以使用在settings.createProjectDescriptor中为其指定的名称来引用它们,就像您对任何其他项目的依赖一样:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':android-api-lib')
    compile project(':android-common-lib')
}

这似乎有效。我怀疑它甚至没有为定义api库的多个DEX文件抛出错误,我怀疑这是因为它都是同一构建过程的一部分,并且Gradle足够聪明以至于可以全部解决。


2
我一直尝试这样做,但问题是各个库中的依赖项似乎从未加载。因此,如果我只打开了库,那似乎很好,但是当我从主应用程序尝试时,它说所有导入的库都丢失了。
捷克学2014年

@Czechnology遇到了同样的问题。解决了。看到我对这个答案的评论:stackoverflow.com/a/29603354/7408927
Sevastyan Savanyuk

9

右键单击项目-选择“打开模块设置”-在左窗格中选择“模块”-单击顶部的“ +”符号-选择“导入模块”。

导入模块后。您需要将其添加为当前项目的依赖项。

在左侧窗格中保持“模块”处于选中状态,然后单击您的项目-现在进入“依赖项”选项卡,然后单击位于底部的“ +”符号-选择第三个选项“模块依赖项”,如果您正确导入了项目,它将向您显示可以作为依赖项添加到当前项目的所有可用模块。


这几乎可以正常工作...项目无法构建,因为依赖项模块的输出未添加到build.gradle文件中,这正是我的原始问题。
TacB0sS 2013年

我认为使用gradle,您需要将所有项目放在同一个根文件夹中。试试看 将要添加的项目作为依赖项放入与当前项目相同的文件夹中。
Varundroid

如果您想使用Android Studio,这就是ATM没人愿意做的事情,这是使事情正常进行的方法。我遵循的另一种替代方法是,我在Intellij中创建项目以设置所有依赖项,然后将该项目导入Android Studio,这是我强迫Android Studio使用蚂蚁构建系统而非Gradle。希望能帮助到你。干杯!!
Varundroid

1
@Varundroid,解决方案是先使用Ethan的答案导入对独立库的引用。然后使用您的答案将该模块添加到主应用程序的依赖项中。这使您可以在多个应用程序中引用相同的库,而不必重复库代码。
bcorso 2014年


-1

如Ethan所说,如果将其添加到settings.gradle,它将向Android Studio添加一个外部项目(在此示例中,它位于父文件夹中):

project(':../ProjectB/:module1')

然后,要将其添加为您的一个项目的依赖项,只需将其作为另一个依赖项添加到该项目的build.gradle中(也可以在此处以图形方式进行添加):

compile project(':../ProjectB/:module1')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.