2014-03-07 86 views
49

题目中的问题。一个类似的问题被问到here,唯一的解决方法是将项目发布到本地Maven存储库。如何跨多个项目共享单个图书馆来源

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

我试过File-> Import Project ..但它不起作用。

编辑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无法识别库项目结构。

回答

75

(如版本2.1+):

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

1)File-> new Project。给你的图书馆项目命名(这里我使用LibraryProject)。继续剩下的步骤来创建一个正常的项目(因为这是一个库,我选择了“添加没有活动”)

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

3)在build.gradle你的库模块文件夹里面,顶线

apply plugin: 'com.android.application' 

改变

apply plugin: 'com.android.library' 

,然后删除在 “defaultConfig” 了 “的applicationID” 行。另外,由于这是一个库,所以从Manifest.xml中删除xlmns:...名称空间和<application ..>正文。 这就是图书馆的一部分。现在,创建/修改您的主应用程序:

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

5)打开settings.gradle(应该只有在每一个项目一个这样的文件),并包括以下行(注意库模块中丢失的前导分号):

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

6)然后去文件 - >项目结构。

7)在“Dependencies”标签下点击右侧绿色的“+”按钮。选择“模块依赖”。选择你的图书馆模块,然后点击确定。

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


其它方法 如果由于某种原因,仍存在上述方法的问题,你可以尝试以下内容(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中右键单击模块 - > refactor->重命名)的东西少混乱如

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

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

3)修改settings.gradleMainProject

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

同步的项目,你就大功告成了。在Proguard的


说明目前你不应该使用外部库项目/模块的ProGuard。相反,你替换(在图书馆的build.gradle)以下(原来的答案here

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

下列要求:

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

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

+1

您能否提供一个档案,包含您的主要图书馆和项目的骨架?或者你可以解释如何使库项目目录结构?当我创建一个图书馆项目时,AS创建了更深的结构。我试图像创建目录一样创建目录,但AS报告了有关分解目录中错误“错误路径名”的错误。我在过去的2个小时里尝试了很多变体,但没有成功。 :( –

+1

@ScottBarta。我在Android Studio 0.6.1上,即使按照Scott Barta和Neoh的小心指示,我仍然无法工作。我坚持使用“Error:Configuration with name'default '找不到',即使在根据Neoh的规范重新排列MyLibrary的文件结构(并在MyLibrary的build.gradle中将“MyLibary”指定为“apply plugin:'android-library'”),最后我认为这个问题最好由Android Studio开发人员(Scott Barta,你似乎是这样的开发人员)继续他们的好工作,以便它变成一个简单的事情。 –

+0

请参阅我的答案编辑 – Neoh

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') 
} 

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

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

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

+4

我假设的依赖加入到模块'build.gradle'不是项目的根'build.gradle'。我得到了以下错误:'出现问题配置项目“:main'.''>配置名称为‘默认’不found.' – Neoh

+0

@Neoh我有同样的错误,请使用**编制项目(解决它: MyPlainJavaLibrary')** – omermuhammed

+0

@omermuhammed这似乎只当您将项目文件夹中的'MyPlainJavaLibrary'工作。我的问题是询问如何在项目文件夹外包含一个库源代码。 – Neoh

1

我想做我的Android Wear的项目,那就是你有mobilewear模块类似的东西。在Android Studio 1.5.1中,您可以执行File-> New-> Module并选择Android Library作为模块。这将处理上述许多设置,并将您的图书馆放入您现有的Android Wear项目的之内。

+0

工作就像一个魅力!我所需要完成的工作肯定比接受的答案更容易 –

1

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

利用这种机制,你不需要操纵和修改的gradle产出和清单文件。