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

В моем приложении есть 3 вкуса продукта (аромат1, аромат2, аромат3). аромат1 и аромат2 имеют общие зависимости, связанные с рекламой.

Есть ли способ связать зависимости, связанные с рекламой, с измерением или конфигурацией gradle и добавить их к Flavour1 и Flavour2 без дублирования строк compileFlavor1 и compileFlavor2 в моем build.gradle?

Это часть моего текущего градиента. Это работает. Но мне интересно, есть ли лучший способ сделать это? Так что мне не нужно повторять рекламные зависимости для каждого аромата.

android {
    productFlavors {
        flavor1 {}
        flavor2 {}
        flavor3 {}
    }

    sourceSets {
       main {}
       flavor1.java.srcDir 'common/ads/java'     <--- shared sourceSet
       flavor2.java.srcDir 'common/ads/java'
       flavor3.java.srcDir 'common/no_ads/java'
    }
}

dependencies {
    compile 'dependency1'
    compile 'dependency2'

    compileFlavor1 'dependency3'   <----- Same list
    compileFlavor1 'dependency4'
    compileFlavor1 'dependency5'

    compileFlavor2 'dependency3'   <------ Same list
    compileFlavor2 'dependency4'
    compileFlavor2 'dependency5
}

person OrangeTree    schedule 08.08.2017    source источник


Ответы (2)


Решение для разделения зависимостей между разновидностями (обновлено для implementation, которое теперь заменило compile):

Поскольку implementation, flavor1Implementation, flavor2Implementation и т. Д. На самом деле сами являются конфигурациями, вы может фактически применить отношения наследования между этими шагами в процессе сборки.

Поэтому в этом случае вы можете указать свои общие зависимости и зависимости только для flavor1:

dependencies {
    implementation 'dependency1'
    implementation 'dependency2'

    flavor1Implementation 'dependency3'
    flavor1Implementation 'dependency4'
    flavor1Implementation 'dependency5'
}

... А затем просто разрешите flavor2Implementation наследовать от flavor1Implementation:

configurations.flavor2Implementation.extendsFrom(flavor1Implementation)

Это также можно использовать для определения более сложных отношений между ароматами, и поддерживается множественное наследование, например:

configurations {
    flavor3Implementation.extendsFrom(
            flavor1Implementation,
            flavor2Implementation
    )
}

(Наконец, просто обратите внимание, что совместное использование кода между вариантами должно по-прежнему обрабатываться с помощью sourceSets в соответствии с исходным вопросом.)

person Jonathan Ellis    schedule 18.02.2019
comment
Спасибо за отрицательный голос без объяснения, что не так с этим решением ... ???? (которое мы используем уже ~ 1 год и отлично работает для нас) - person Jonathan Ellis; 07.01.2020

Вот что мы сделали, чтобы разделить каталоги между ароматами:

sourceSets {
    main {
      java.srcDirs = ['src/main/java']
      res.srcDirs = ['src/main/res']
      assets.srcDirs = ['src/main/assets']
    }
    production {
      java.srcDirs = ['src/main/java', 'src/shared/java']
      res.srcDirs = ['src/main/res', 'src/shared/res']
      assets.srcDirs = ['src/main/assets', 'src/shared/assets']
    }
    logger {
      java.srcDirs = ['src/main/java', 'src/shared/java', 'src/mock/java']
      res.srcDirs = ['src/main/res', 'src/shared/res']
      assets.srcDirs = ['src/main/assets', 'src/shared/assets']
    }
    nowav {
      java.srcDirs = ['src/main/java', 'src/nowav/java', 'src/mock/java']
      res.srcDirs = ['src/main/res', 'src/nowav/res']
      assets.srcDirs = ['src/main/assets', 'src/nowav/assets']
    }
}
person Christine    schedule 08.08.2017
comment
Спасибо @Christine. Я уже делаю это с помощью (Совместное использование папок между ароматами). Но мой вопрос касался совместного использования внешних зависимостей между разновидностями (пожалуйста, проверьте блок зависимостей из моего вопроса). - person OrangeTree; 09.08.2017