Несколько приложений для Android в зависимости от библиотеки Android с gradle

Я все еще изучаю Gradle, но из того, что я прочитал, мне интересно, возможно ли это.

У меня есть несколько приложений для Android (app1, app2, app3), которые зависят от библиотеки Android (L). Библиотека Android (L) будет зависеть от внешних библиотек, таких как volley, а приложения будут зависеть от внешних библиотек, таких как picasso.

Мне не нужно несколько копий библиотеки и залпа для каждого приложения. Вот как я думал, будет выглядеть моя структура папок/градулов:

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

но я не уверен, как будет выглядеть мой файл build.gradle для app1, поскольку кажется, что зависимости проекта (библиотека) должны находиться внутри папки 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?


person heero    schedule 12.11.2013    source источник


Ответы (2)


Вы можете использовать эту структуру:

app1/
  build.gradle
app2/
app3/
library/
  src/
     main
  libs
  build.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')
}

С помощью aar от maven (как picasso) Gradle обнаружит несколько экземпляров одной и той же зависимости и будет управлять всем за вас. С jar (как и с Volley) надо быть внимательнее. Вы не можете добавить его дважды. если ваш проект библиотеки зависит от jar, то проект APK унаследует эту зависимость.

person Gabriele Mariotti    schedule 13.11.2013
comment
Благодарю вас! Это был именно тот совет, который мне был нужен. Как в этой структуре будет выглядеть build.gradle корня, чтобы Android Studio по-прежнему работал? - person JohnnyLambada; 08.04.2014
comment
Ответил на мой собственный вопрос о root build.gradle. Лучше всего поместить buildscript {}, общий для app/build.gradle и library/build.gradle, в root build.gradle. - person JohnnyLambada; 09.04.2014

Вы запутались в settings.gradle. Он должен находиться в корне вашей многомодульной структуры папок.

Итак, у вас есть два варианта:

  • Создайте единую многомодульную установку, в которой у вас есть 4 модуля (библиотека, приложение1, приложение2, приложение3). В этом случае вы всегда будете открывать все 4 проекта в студии, сможете создавать все для приложений одновременно, и все они будут использовать одну и ту же версию библиотеки. Это, вероятно, означает, что вам нужно, чтобы каждое приложение разрабатывалось одновременно и, возможно, выпускалось одновременно (в зависимости от цикла разработки проекта библиотеки).

  • Создайте 4 независимых проекта. В этом случае вы разрабатываете библиотеку отдельно и публикуете ее во (внутреннем) репозитории, используя любую желаемую версию. Затем каждое приложение может зависеть от другой версии библиотеки.

person Xavier Ducrohet    schedule 12.12.2013
comment
вариант № 1 был бы отличным дополнением к примерам gradle — это вариант использования, который, вероятно, возникает все время! - person JohnnyLambada; 08.04.2014