9

I am still learning about gradle but from what I have read, I am wondering if this is possible.

I have multiple android apps (app1,app2,app3), that depends on a android library (L). The android library (L) would depend on external libraries like volley, and the apps would depend on external libraries like picasso.

I dont want multiple copies of library and volley for each app. Here is what I was thinking my folder/gradle structure would look like:

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

but I am not sure what my build.gradle file for app1 would look like since project dependencies (library) seems like it needs to be inside the app1 folder.

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

What would be the best way for me to structure my projects to use gradle?

4

2 回答 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'
}

在库/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)你必须注意。你不能添加它两次。如果您的库项目对 jar 具有依赖项,则 APK 项目将继承此依赖项。

于 2013-11-13T14:31:04.833 回答
4

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

所以你有两个选择:

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

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

于 2013-12-12T05:55:15.213 回答