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

Neo*_*eoh 59 android android-studio

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

Android Studio 0.5中是否修复了此问题(如某些人所声称的那样).+?在其发行说明中,有一条声明说"支持模块内容根目录之外的源文件夹".这是否意味着我们最终可以从项目文件夹外部导入库?

我尝试了File-> Import Project ..但它不起作用.

编辑2:查看最新解决方案的已接受答案(截至0.8.+)

编辑:

我的项目目录结构只有一个模块main,如下所示

MyApp
    main
        build.gradle
        src
    build.gradle
    settings.gradle
Run Code Online (Sandbox Code Playgroud)

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

MyLibrary
    lib
        build.gradle
        src
    build.gradle
    settings.gradle
Run Code Online (Sandbox Code Playgroud)

以下行添加到MyApp/settings.gradle:

include ':main', '..:MyLibrary'
Run Code Online (Sandbox Code Playgroud)

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

dependencies {
    compile project(':..:MyLibrary')
}
Run Code Online (Sandbox Code Playgroud)

结果是以下错误:

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':main'.
> Configuration with name 'default' not found.
Run Code Online (Sandbox Code Playgroud)

作为旁注,库项目MyLibrary本身可以编译而不会出错.问题似乎是settings.gradle无法识别图书馆项目结构.

Neo*_*eoh 82

(自2.1+版本起):

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

1)文件 - >新项目.给你的图书馆项目命名(我在这里使用LibraryProject).继续剩下的步骤来创建一个正常的项目(因为这是一个库,我选择"添加没有活动")

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

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

apply plugin: 'com.android.application'
Run Code Online (Sandbox Code Playgroud)

apply plugin: 'com.android.library'
Run Code Online (Sandbox Code Playgroud)

然后删除"defaultConfig"下的"applicationId"行.此外,由于这是一个库,因此也要从Manifest.xml中删除xlmns:...命名空间和<application ..>主体.这就是图书馆部分的全部内容.现在,要创建/修改您的主应用程序:

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

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

include ':app', '..:LibraryProject:yourLibraryModule'
Run Code Online (Sandbox Code Playgroud)

6)然后转到文件 - >项目结构.

7)在"依赖关系"选项卡下,单击右侧的绿色"+"按钮.选择"模块依赖".选择库模块,然后单击"确定".

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


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

1)重复上面的步骤1到4.默认情况下,主要和外部(库)项目看起来像这样:

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

  /LibraryProject
    + build.gradle
    + settings.gradle
    + app/
      + build.gradle
      + src/
Run Code Online (Sandbox Code Playgroud)

2)像往常一样,重构模块名称(在android studio右键单击模块 - >重构 - >重命名)到一些不那么混乱的东西,比如

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

  /LibraryProject
    + build.gradle
    + settings.gradle
    + LibraryModule/
      + build.gradle
      + src/
Run Code Online (Sandbox Code Playgroud)

3)修改settings.gradleMainProject:

include ':LibraryModule', ':app'
project(':LibraryModule').projectDir = new File(settingsDir, '../LibraryProject/LibraryModule')
Run Code Online (Sandbox Code Playgroud)

同步项目,你就完成了.


关于Proguard的注意事项

目前,您不应在外部库项目/模块上使用proguard.相反,你替换以下(这里的原始答案)

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

以下(在build.gradle库中):

buildTypes {
    release {
        consumerProguardFiles 'proguard-project.txt'
    }
}
Run Code Online (Sandbox Code Playgroud)

proguard-project.txt包含库项目的proguard规则的文件在哪里.

  • 如果导入的模块依赖于其他外部模块,则此解决方案将不起作用.在这种情况下,请查看此处描述的解决方案http://stackoverflow.com/questions/17479076/android-studio-add-external-project-to-build-gradle (3认同)
  • 最后一个提示`project(':LibraryModule').projectDir = new File(settingsDir,'../LibraryProject/LibraryModule')`做了我的一天 (2认同)

Sco*_*rta 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
Run Code Online (Sandbox Code Playgroud)

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

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

include ':appmodule', '..:MyPlainJavaLibrary'
Run Code Online (Sandbox Code Playgroud)

并在build.gradle中包含它的依赖关系(不要忘记前导冒号):

dependencies {
    ...
    compile project(':..:MyPlainJavaLibrary')
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 我假设依赖项被添加到模块`build.gradle`而不是项目根`build.gradle`.我收到以下错误:`配置项目时发生问题':main'.`>找不到名称'default'的配置 (4认同)
  • @Neoh我能够解决"默认未找到问题".在我的例子中,我在build.gradle中更改了```compile project(':..:MyPlainJavaLibrary')```到```compile project(':: MyPlainJavaLibrary:app')``` ``include'..:lucovaAndroidSDK'```到```include'..:lucovaAndroidSDK:app.```在settings.gradle中. (3认同)