如何跨多个项目共享单个库源
题目中的问题。 这里提出了一个类似的问题,唯一的解决方法是将项目发布到本地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项目做类似的事情,在那里你有mobile
和wear
模块。 在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文件。