标题中的问题。类似的问题被问到here,唯一的解决方法是将项目发布到本地Maven存储库。
Android Studio 0.5中是否修复了此问题(如某些人所声称的那样)。+?在release note中有一条声明说“支持模块内容根目录之外的源文件夹”。这是否意味着我们最终可以从项目文件夹外部导入库?
我尝试了File->导入项目..但它不起作用。
编辑2:查看最新解决方案的已接受答案(截至0.8。+)
修改
我的项目目录结构只有一个模块main
,看起来像这样
MyApp
main
build.gradle
src
build.gradle
settings.gradle
库项目目录只有一个名为lib
的模块(它们都是在创建新库项目时自动生成的)
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
无法识别库项目结构。
答案 0 :(得分:80)
(从2.1版+开始):
以下是我在项目目录之外共享库源的步骤。我的代码不是普通的Java库,而是编译为Android模块,但该库模块不包含在主项目中。只要没有代码重复,我就可以了,我只需要为所有项目维护一组库代码:
1)文件 - >新项目。给你的图书馆项目命名(这里我使用LibraryProject
)。继续剩下的步骤来创建一个正常的项目(因为这是一个库,我选择“添加没有活动”)
2)默认情况下,Android studio会在项目文件夹中创建名为“app”的模块。为了防止名称与实际应用程序模块发生冲突,请将模块重命名为其他名称(右键单击左侧面板中的“app”模块 - >重构 - >重命名)。
3)在库模块文件夹中的build.gradle
中,更改第一行
apply plugin: 'com.android.application'
到
apply plugin: 'com.android.library'
然后删除“defaultConfig”下的“applicationId”行。此外,由于这是一个库,因此也要从Manifest.xml中删除xlmns:...
命名空间和<application ..>
正文。
这就是图书馆部分的全部内容。现在,创建/修改主应用程序:
4)如果是新项目,首先要创建新项目File-&gt; new Project-&gt; ApplicationName。
5)打开settings.gradle
(每个项目中应该只有一个这样的文件)并包含以下行(注意库模块中缺少前导的分号):
include ':app', '..:LibraryProject:yourLibraryModule'
6)然后转到文件 - >项目结构。
7)在“依赖关系”选项卡下,单击右侧的绿色“+”按钮。选择“模块依赖”。选择库模块,然后单击“确定”。
您现在应该可以在应用程序中使用库类了。
替代方法 如果出于某种原因,上述方法仍然存在问题,您可以尝试以下方法(here中建议):
1)重复上面的步骤1到4。默认情况下,主要和外部(库)项目看起来像这样:
/MainProject
+ build.gradle
+ settings.gradle
+ app/
+ build.gradle
+ src/
/LibraryProject
+ build.gradle
+ settings.gradle
+ app/
+ build.gradle
+ src/
2)像往常一样,将模块名称(在android studio右键单击模块 - >重构 - &gt;重命名)重构为不那么混乱的东西,例如
/MainProject
+ build.gradle
+ settings.gradle
+ MainModule/
+ build.gradle
+ src/
/LibraryProject
+ build.gradle
+ settings.gradle
+ LibraryModule/
+ build.gradle
+ src/
3)修改settings.gradle
中的MainProject
:
include ':LibraryModule', ':app'
project(':LibraryModule').projectDir = new File(settingsDir, '../LibraryProject/LibraryModule')
同步项目,你就完成了。
关于Proguard的说明
目前,您不应在外部库项目/模块上使用proguard。而是替换以下(原始答案here)
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规则的文件。
答案 1 :(得分:9)
是的,它现在在0.5.0中有效。没有一个友好的用户界面(导入项目不是你想要的,因为它创建了一个全新的项目;导入模块仍然被破坏;请参阅https://code.google.com/p/android/issues/detail?id=62122),但您可以将您的构建文件设置为让它发挥作用。
假设你有一个如下所示的目录结构:
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')
}
这对我有用。在我的Project查看器中,我现在将MyApp和MyPlainJavaLibrary视为视图中的两个根级模块目录,并且我可以使java import
语句跨模块边界等工作。
请注意,在此默认设置中,此共享模块将只有一个构建输出文件夹,该文件夹将在使用它的所有项目之间共享。这可能是也可能不是你想要的。如果你想使用共享模块为每个项目创建一个不同的输出目录,你可以对sourceSet
中的输出目录做一些魔术。如果您需要这方面的帮助,我建议您自己尝试一下,如果您遇到困难,可以在工作中发布详细信息。
每个项目只能有一个 settings.gradle 文件,所以这不会占用整个其他多模块Gradle项目并一举引入所有模块;你需要将它们单独带入。但是,它应该满足在多个项目中使用模块的用例。
答案 2 :(得分:1)
我想为我的Android Wear项目做类似的事情,你有mobile
和wear
个模块。在Android Studio 1.5.1中,您可以执行File-&gt; New-&gt;模块并选择Android库作为模块。这将处理上述许多设置,并将您的库置于现有的Android Wear项目中。
答案 3 :(得分:1)
要充分利用 Android Studio ,我建议您最初创建一个普通的Android项目。然后,在该项目中添加一个模块&#34; android library
&#34;类型和(可选)&#34; java library
&#34; (如果您有想要使用的代码,这可能是Android应用程序和服务器端代码所共有的。)
使用此机制,您无需操作和修改gradle和manifest文件。
答案 4 :(得分:0)
我还想在项目中使用相同的类集合,我发现了一种更简单的方法。
将要使用的类文件放在所有项目文件夹之外的自己的文件夹中。
在此文件夹中创建一个符号链接(linux)或快捷方式(win)并将其复制到:
~/src/main/java/com/yourco/yourproject/
在每个项目文件夹中。
您现在拥有了一个在所有项目上同步的所有常用类的包。不客气。
答案 5 :(得分:0)
您可以在项目中使用模块(作为共享源代码库)apply plugin: 'com.android.library'
。