Выбор определенного типа сборки в зависимости - PullRequest
0 голосов
/ 09 июня 2018

Предположим, у меня есть приложение Android с тремя типами сборки:

buildTypes {
    release {
        ....
    }
    optRelease {
        ....
    }
    debug {
        ....
    }
}

И у меня есть зависимый модуль:

dependencies {
    implementation project(':myDependency')
}

Предположим, что эта зависимость имеет только два типа сборки (скажем,debug и release), и я хочу получить полный контроль над тем, какой из типов сборки моего приложения использует какой из типов построения зависимости.Например, я хотел бы, чтобы мое приложение optRelease использовало библиотеку release, а приложение release использовало библиотеку debug.

Это раньше было возможно до Android Studio 3.0,но новая система вариантов сборки, кажется, не позволяет этого больше.

Как я могу явно указать, какой тип сборки использовать?Допустим, я не контролирую зависимость и не могу изменить ее конфигурацию gradle.

Ответы [ 4 ]

0 голосов
/ 20 июня 2018

То, что я сделал, это:

Созданные варианты продукта, которые похожи на создание типов сборки:

    android {
        flavorDimensions 'tier'
        compileSdkVersion 27
        defaultConfig {
            applicationId "com.example.sample"
            minSdkVersion 15
            targetSdkVersion 27
        }

        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                --------------
            }
            debug {
                debuggable true
            }
        }
        productFlavors {
            qc {
                applicationIdSuffix ".qc"
                dimension "tier"

            }
            production {
                applicationIdSuffix ".production"
                dimension "tier"
            }
        }
    }

Разрешить зависимостям выбирать типы сборки, как показано ниже

dependencies { 
    qcDebugCompile project(path: ':libName', configuration: "debug") 
    qcReleaseCompile project(path: ':libName', configuration: "release") 
    productionDebugCompile project(path: ':libName', configuration: "debug") 
    productionReleaseCompile project(path: ':libName', configuration: "release") 
... 
} 

enter image description here

0 голосов
/ 19 июня 2018

Вы можете использовать matchingFallback

buildTypes {
    release {
       matchingFallbacks = ['debug']
       ... 
    }
    optRelease {
       matchingFallbacks = ['release']  
       ...
    }
    debug {
       matchingFallbacks = ['debug']  
       ...
    }
}

Вы также можете указать список резервирования следующим образом:

optRelease {
    matchingFallbacks = ['release','debug']  
}

Это будет указывать отсортированный список типов сборки резервированиячто плагин должен пытаться использовать, когда зависимость не включает тип сборки "optRelease".Вы можете указать столько откатов, сколько захотите, и плагин выбирает первый тип сборки, доступный в зависимости .

Вы можете сослаться на официальный документ для более подробной информации.

Однако, если вы хотите использовать специфичные для варианта конфигурации при нацеливании на внешние зависимости.Вы можете сделать это следующим образом:

debugImplementation project(':myDependency')

Это сделает myDependency зависимостью только от "отладочной" версии вашего модуля.

0 голосов
/ 19 июня 2018

Большое спасибо ahasbini за ваше решение.Копирование ответа ahasbini из этой цепочки для удобства поиска решения.

Вам необходимо указать matchingFallback с помощью Android Gradle Plugin 3.0.0, чтобы плагин знал, какой резервный тип сборки библиотеки использовать при компиляции с кодом приложения в случае, если определенный тип сборки, определенный в вашем приложении, не найден в библиотеке.

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        applicationIdSuffix '.debug'
    }
    staging {
        initWith release
        applicationIdSuffix '.staging'
        matchingFallbacks = ['release']
    }
}

Дополнительная информация здесь: Плагин миграции на Android для Gradle 3.0.0.

0 голосов
/ 14 июня 2018

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

  • реализация
  • releaseImplementation
  • testImplementation
  • debugImplementation
  • androidTestImplementation

Простой пример:

android {
   ....
}
dependencies {
    implementation "com.google.dagger:dagger-android-support:$DAGGER_VERSION"
    androidTestImplementation jUnit
    testImplementation mockito
}

Если у вас есть несколько вариантов вашего приложения, начиная с версии 3.0, у вас естьчтобы сначала объявить измерения разновидности, определите резервную стратегию и стратегию сопоставления в конфигурации по умолчанию (для удаленных зависимостей и зависимостей без измерений), и gradle распознает, какие зависимости должны быть включены для этой разновидности.Для получения дополнительной информации проверьте это руководство по миграции.

...