如何跨多个项目共享单个库源

题目中的问题。 这里提出了一个类似的问题,唯一的解决方法是将项目发布到本地Maven仓库。

这个问题在Android Studio 0.5中修复了吗? 在发行说明中,有一个声明说:“支持模块内容根目录之外的源文件夹”。 这是否意味着我们最终可以从项目文件夹外部导入库?

我试过文件 – >导入项目..但它不工作。

编辑2:查看最新解决scheme的接受答案(从0.8。开始)

编辑:

我的项目目录结构只有一个模块main ,看起来像这样

 MyApp main build.gradle src build.gradle settings.gradle 

库项目目录只有一个名为lib模块(当创build一个新的库项目时,它们都是自动生成的)

 MyLibrary lib build.gradle src build.gradle settings.gradle 

以下行添加到MyApp/settings.gradle

 include ':main', '..:MyLibrary' 

以下内容添加到MyApp/main/build.gradle

 dependencies { compile project(':..:MyLibrary') } 

结果是以下错误:

 FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring project ':main'. > Configuration with name 'default' not found. 

作为一个方面说明,库项目MyLibrary本身可以编译没有错误。 问题似乎是settings.gradle无法识别图书馆项目结构。

(截至版本2.1+):

以下是我在项目目录之外共享库源的步骤。 我的代码不是简单的Java库,而是编译为Android模块,但是这个库模块不包含在主项目中。 只要没有代码重复,我只需要为所有项目维护一套库代码即可:

1)文件 – >新build项目。 给你的图书馆项目命名(这里我使用LibraryProject )。 继续其余的步骤来创build一个正常的项目(因为这是作为一个图书馆,我select“不添加任何活动”)

2)默认情况下,Android Studio在项目文件夹内创build名为“app”的模块。 为了防止名称与实际的应用程序模块冲突,将模块重命名为其他名称(右键单击左侧面板的“应用程序”模块 – >重构 – >重命名)。

3)在库模块文件夹内build.gradle ,更改顶行

 apply plugin: 'com.android.application' 

 apply plugin: 'com.android.library' 

然后删除“defaultConfig”下的“applicationId”行。 此外,由于这是一个库,所以xlmns:...从Manifest.xml中删除xlmns:... namespace和<application ..>主体。 这就是图书馆的一部分。 现在,创build/修改你的主应用程序:

4)如果是新build项目,首先创build新项目File-> new Project-> ApplicationName。

5)打开settings.gradle (每个项目中只能有一个这样的文件),并包含以下行(注意库模块中缺less的前导分号):

 include ':app', '..:LibraryProject:yourLibraryModule' 

6)然后进入文件 – >项目结构。

7)在“Dependencies”标签下点击右边绿色的“+”button。 select“模块依赖”。 select您的图书馆模块,然后单击确定。

您现在应该可以在应用程序中使用库类。


替代方法如果由于某种原因,上述方法仍然存在问题,您可以尝试以下方法(在此处build议):

1)重复上述步骤1至4。 默认情况下,主和外部(库)项目看起来像这样:

  /MainProject + build.gradle + settings.gradle + app/ + build.gradle + src/ /LibraryProject + build.gradle + settings.gradle + app/ + build.gradle + src/ 

2)像往常一样,重构模块的名称(在android工作室右键单击模块 – >重构 – >重命名),以减less混淆,如

  /MainProject + build.gradle + settings.gradle + MainModule/ + build.gradle + src/ /LibraryProject + build.gradle + settings.gradle + LibraryModule/ + build.gradle + src/ 

3)修改MainProject中的MainProject

 include ':LibraryModule', ':app' project(':LibraryModule').projectDir = new File(settingsDir, '../LibraryProject/LibraryModule') 

同步项目,你就完成了。


关于Proguard的注意事项

目前,您不应该在外部库项目/模块上使用proguard。 相反,你取代以下(原始答案在这里 )

 buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' } debug { minifyEnabled false } } 

与以下(在图书馆build.gradle ):

 buildTypes { release { consumerProguardFiles 'proguard-project.txt' } } 

其中proguard-project.txt是包含您的库项目的proguard规则的文件。

是的,现在在0.5.0。 没有一个友好的用户界面(导入项目不是你想要的,因为这会创build一个全新的项目;导入模块仍然是坏的;请参阅https://code.google.com/p/android/issues/ detail?id = 62122 ),但你可以设置你的构build文件,使其工作。

假设你有一个目录结构如下所示:

 MyApp appmodule build.gradle src main java build.gradle settings.gradle MyPlainJavaLibrary build.gradle src java 

请注意, MyPlainJavaLibrary不在文件系统中的MyApp目录下。

设置你的settings.gradle文件,如下所示:

 include ':appmodule', '..:MyPlainJavaLibrary' 

并像这样在build.gradle中包含对它的依赖(不要忘记引号冒号):

 dependencies { ... compile project(':..:MyPlainJavaLibrary') } 

这对我有用。 在我的项目查看器中,我现在将MyApp和MyPlainJavaLibrary视为视图中的两个根级模块目录,并且可以使java import语句跨模块边界等工作。

请注意,在此默认设置下,此共享模块将只有一个构build输出文件夹,将在所有使用它的项目之间共享。 这可能是也可能不是你想要的。 如果您希望为每个使用共享模块的项目使用不同的输出目录,则可以使用sourceSet的输出目录做一些魔术; 如果你需要这方面的帮助,我build议你自己尝试一下,如果你遇到困难,可以发表一个关于你工作细节的问题。

每个项目只能有一个settings.gradle文件,所以这不会占用整个其他的多模块Gradle项目,并一次性引入所有的模块; 你需要把他们单独带入。 但是,它应该满足在多个项目中使用模块的用例。

我想为Android Wear项目做类似的事情,在那里你有mobilewear模块。 在Android Studio 1.5.1中,您可以执行File-> New-> Module并selectAndroid Library作为您的模块。 这将处理上述许多设置,并将您的库放入现有的Android Wear项目中。

要充分利用Android Studio ,我会build议最初创build一个普通的Android项目。 然后,在该项目中,添加一个模块“ android library ”types,(可选)添加一个“ java library ”(如果你有你想要使用的代码,这对于Android应用程序和服务器端代码可能是常见的)。

使用这种机制,您不需要操作和修改gradle和manifest文件。