【问题标题】:Multiple Android apps depending on android library with gradle多个 Android 应用程序依赖于带有 gradle 的 android 库
【发布时间】:2013-11-12 18:36:28
【问题描述】:

我仍在学习 gradle,但从我所阅读的内容来看,我想知道这是否可能。

我有多个 android 应用程序(app1、app2、app3),这取决于一个 android 库 (L)。 android 库 (L) 将依赖于 volley 等外部库,而应用程序将依赖于 picasso 等外部库。

我不希望每个应用程序都拥有多个库和 volley 副本。这是我认为我的文件夹/gradle 结构的样子:

app1/
  settings.gradle
  build.gradle
  src/
    com/
    test/
app2/
app3/
library/
  settings.gradle
  build.gradle
  src/
    com/
    test/
external/
  volley/
  picasso/

但我不确定 app1 的 build.gradle 文件是什么样子,因为项目依赖项(库)似乎需要位于 app1 文件夹中。

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.5+'
    }
}

apply plugin: 'android'

dependencies {
    compile files('libs/android-support-v4.jar')
    compile project(':library')
}

android {
    buildToolsVersion "17.0"
    compileSdkVersion 18

     sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aild.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        instrumentTest.setRoot('tests')
    }
} 

对我来说,构建项目以使用 gradle 的最佳方式是什么?

【问题讨论】:

    标签: android gradle android-gradle-plugin build.gradle


    【解决方案1】:

    你可以使用这个结构:

    app1/
      build.gradle
    app2/
    app3/
    library/
      src/
         main
      libs
      build.gradle
    
    settings.gradle
    

    在 settings.gradle 中

    include ':library' ,':app1' , ':app2', ':app3'
    

    在 app1/build.gradle 中

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.6.+'
        }
    }
    apply plugin: 'android'
    
    repositories {
        mavenCentral()
    }
    
    android {
        compileSdkVersion 19
        buildToolsVersion "19.0.0"
    
        defaultConfig {
            minSdkVersion 14
            targetSdkVersion 19            
        }
    }
    
    dependencies {
       //Library
       compile project(':library')
       // Support Libraries
       compile 'com.android.support:support-v4:19.0.0'
       //OkHttp
       compile 'com.squareup.okhttp:okhttp:1.2.1'
       //Picasso
        compile 'com.squareup.picasso:picasso:2.1.1'
    }
    

    在库/build.gradle 中

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.6.+'
        }
    }
    apply plugin: 'android-library'
    
    repositories {
        mavenCentral()
    }
    
    android {
        compileSdkVersion 19
        buildToolsVersion "19.0.0"
    
        defaultConfig {
            minSdkVersion 14
            targetSdkVersion 19
    
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: '*.jar')
    }
    

    使用来自 maven 的 aar(如 picasso),Gradle 将检测相同依赖项的多个实例,并为您管理事物。 使用 jar(作为 Volley)你必须注意。你不能添加它两次。 如果你的Library项目对jar有依赖,那么APK项目会继承这个依赖。

    【讨论】:

    • 谢谢!这正是我需要的建议。在这个结构中,root 的 build.gradle 会是什么样子,这样 Android Studio 仍然可以工作?
    • 回答了我自己关于 root 的 build.gradle 的问题。最好的用法是将 app/build.gradle 和 library/build.gradle 通用的 buildscript {} 放在 root 的 build.gradle 中。
    【解决方案2】:

    您对 settings.gradle 感到困惑。它应该位于多模块文件夹结构的根目录。

    所以你有两个选择:

    • 创建一个多模块设置,其中有 4 个模块(库、app1、app2、app3)。在这种情况下,您将始终在工作室中打开所有 4 个项目,您将能够同时为应用程序构建所有项目,并且它们都将使用相同版本的库。这可能意味着您需要同时开发每个应用程序,并且可能同时发布(取决于库项目的开发周期)

    • 创建 4 个独立项目。在这种情况下,您将单独开发库并使用您想要的任何版本将其发布到(内部)存储库中。然后每个应用程序可以依赖于不同版本的库。

    【讨论】:

    • 选择 #1 将是对 gradle-samples 的一个很棒的补充——它是一个可能一直出现的用例!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 2015-05-03
    • 2014-07-27
    • 2014-08-18
    • 2014-07-17
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多