依赖于Gradle的Android库的多个Android应用程序

9
我仍在学习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呢?

2个回答

7
您可以使用以下结构:

您可以使用以下结构:

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

在library/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(如Picasso)的情况下,Gradle会检测到相同依赖项的多个实例,并为您管理好这些依赖项。 但如果使用JAR(如Volley),需要注意不能添加两次。如果您的Library项目依赖于一个JAR文件,则APK项目将继承此依赖项。


谢谢!这正是我需要的建议。在这个结构中,根目录的 build.gradle 应该是什么样子,以便 Android Studio 仍然能够工作? - JohnnyLambada
我自己解决了关于root的build.gradle的问题。最好的方法是将在app/build.gradle和library/build.gradle中共同使用的buildscript {}放在root的build.gradle中。 - JohnnyLambada

4
你对settings.gradle感到困惑。它应该位于你的多模块文件夹结构的根目录下。
所以你有两个选择:
1. 创建一个多模块设置,其中包含4个模块(library、app1、app2、app3)。在这种情况下,你将始终在Studio中打开所有4个项目,可以同时构建所有4个应用程序,并且它们都将使用相同版本的库。这可能意味着需要同时开发每个应用程序,而且可能需要同时发布(取决于库项目的开发周期)。
2. 创建4个独立的项目。在这种情况下,你将单独开发库,并使用任何你想要的版本控制在(内部)存储库中发布它。然后每个应用程序都可以依赖于不同版本的库。

1
选择 #1 将是 gradle-samples 的一个很棒的补充 -- 这是一个可能经常出现的使用案例! - JohnnyLambada

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接