一.variantFilter{}闭包过滤变体
1.说明
上一章节,我们使用productFlavors{}闭包以及flavorDimensions属性打了八个包。如图。
那么,我们能不能过滤几个包呢?答案是可以的。因为谷歌官网也有说明。即使用variantFilter{}包实现。具体代码下面讲解。
https://developer.android.google.cn/studio/build/gradle-tips?hl=zh_cn
2.代码
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
/** defaultConfig闭包 默认配置 */
defaultConfig {
applicationId "com.wjn.okhttpmvpdemo"
minSdkVersion 19
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
/** signingConfigs闭包 项目签名配置 */
signingConfigs {
release {
storeFile file('C:\\Users\\wujianning\\AndroidStudioProjects\\demo\\OKHttpMVPDemo\\test.jks')
storePassword '123456'
keyAlias 'key0'
keyPassword '123456'
v1SigningEnabled true
v2SigningEnabled true
}
debug {
storeFile file('C:\\Users\\wujianning\\AndroidStudioProjects\\demo\\OKHttpMVPDemo\\test.jks')
storePassword '123456'
keyAlias 'key0'
keyPassword '123456'
v1SigningEnabled true
v2SigningEnabled true
}
}
/** buildTypes闭包 项目打包配置 比如是否混淆 是否压缩 是否支持调式等等 这里为了区分下面多渠道打包Debug包和Release包 在versionName后添加了不同的后缀*/
buildTypes {
release {
minifyEnabled false
debuggable false
multiDexEnabled false
versionNameSuffix '-Release'
}
debug {
minifyEnabled false
debuggable true
multiDexEnabled false
versionNameSuffix '-Debug'
}
}
/** productFlavors闭包 多渠道打包 flavorDimensions属性确定维度 分支&免费付费 */
flavorDimensions "branch", "free_pay"
productFlavors {
red {
dimension "branch"
applicationIdSuffix ".red"
signingConfig signingConfigs.release
}
blue {
dimension "branch"
applicationIdSuffix ".blue"
signingConfig signingConfigs.debug
}
free {
dimension "free_pay"
buildConfigField "boolean", "IS_FREE", "true"
}
pay {
dimension "free_pay"
buildConfigField "boolean", "IS_FREE", "false"
}
}
/** variantFilter闭包 过滤变体 可以设置忽略那个包 比如这里过滤掉了red&free的包*/
variantFilter { variant ->
def names = variant.flavors*.name
if (names.contains("red") && names.contains("free")) {
setIgnore(true)
}
}
/** compileOptions闭包 配置项目使用JDK1.8 */
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:support-v4:27.1.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'io.reactivex:rxjava:1.3.2'
implementation 'io.reactivex:rxandroid:1.2.1'
implementation 'com.squareup.okhttp3:okhttp:3.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'
implementation 'com.readystatesoftware.systembartint:systembartint:1.0.3'
implementation 'com.squareup.retrofit2:retrofit:2.7.0'
implementation 'com.github.bumptech.glide:glide:4.4.0'
}
即,忽略了red包的free版本(Release版本和Debug版本)。
3.结果
配置以上过滤体后的打包截图
少了app-red-free-debug.apk和app-red-free-release.apk两个包 。
4.其他过滤条件
上述是过滤了red&free的包,但是Debug包和Release包都给过滤了。那么有没有一种方法可以过滤掉一个指定的包呢?答案是可以的。代码如下
android{
/** variantFilter闭包 过滤变体 可以设置忽略那个包 比如这里过滤掉了不在列表中的包*/
variantFilter { variant ->
def needed = variant.name in [
'redFreeRelease',
'redFreeDebug',
'redPayRelease',
'redPayDebug',
'blueFreeRelease',
'blueFreeDebug',
'bluePayRelease',
'bluePayDebug',
]
setIgnore(!needed)
}
...
}
列举了全部的八个包。过滤掉不在列表中的包 截图。
如果去掉列表中最后一项呢?截图
去掉
'bluePayDebug'
截图
少了bluePayDebug包。
二.ext{}闭包详解
1.简介
ext属性是ExtensionAware类型的一个特殊的属性,本质是一个Map类型的变量。常用来在项目中的gradle文件中配置,在其他的gradle文件中使用。
2.官网
3.常见用法
<1> 同一个Gradle文件中声明&使用
举例
在APP的Gradle文件中使用ext{}闭包配置了versionCode&versionName。然后在本Gradle文件的defaultConfig{}包使用。
代码
/** ext闭包 在本Gradle中配置 versionCode&versionName 本Gradle的defaultConfig{}包使用 */
ext {
versionInt = 2
versionString = "2.0.0"
}
android {
compileSdkVersion 28
/** defaultConfig闭包 默认配置 */
defaultConfig {
applicationId "com.wjn.okhttpmvpdemo"
minSdkVersion 19
targetSdkVersion 27
versionCode versionInt
versionName versionString
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
说明
在本Gradle文件中配置了ext闭包,在本Gradle文件中的其他地方就可以 像使用变量一样使用ext闭包中声明的属性了。
验证
打了一个app-blue-free-debug.apk包
<2> 项目的Gradle文件中声明&APP的Gradle文件中使用
举例
在项目的Gradle文件中使用ext{}闭包配置了versionCode&versionName。然后在APP的Gradle文件中的defaultConfig{}包使用。
代码
项目的Gradle文件
/** ext闭包 在项目的Gradle文件中配置 versionCode&versionName 在APP的Gradle文件的defaultConfig{}包使用 */
ext {
versionInt = 3
versionString = "3.3.3"
}
buildscript {
...
}
allprojects {
...
}
task clean(type: Delete) {
delete rootProject.buildDir
}
APP的Gradle文件
/** defaultConfig闭包 默认配置 */
defaultConfig {
applicationId "com.wjn.okhttpmvpdemo"
minSdkVersion 19
targetSdkVersion 27
versionCode rootProject.ext.versionInt
versionName rootProject.ext.versionString
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
说明
在项目的Gradle文件中使用ext{}闭包配置了versionCode&versionName。在APP的Gradle文件中的其他地方使用 rootProject.ext.变量 就可以引用了。
验证
打了一个app-blue-free-debug.apk包
<3> 新建一个myConfig.gradle文件声明&APP的Gradle文件中使用
举例
新建一个myConfig.gradle文件中使用ext{}闭包配置了versionCode&versionName。然后在APP的Gradle文件中的defaultConfig{}包使用。
代码
自定义Gradle文件myConfig.gradle放在项目的根目录
ext {
android = [
versionInt : 6,
versionString: "6.6.6",
mapId : "6.6.6.666000"
]
}
项目的Gradle文件引入刚刚新建的Gradle文件
apply from: "myConfig.gradle"
buildscript {
...
}
allprojects {
...
}
task clean(type: Delete) {
delete rootProject.buildDir
}
APP的Gradle文件使用
android{
...
defaultConfig {
versionCode rootProject.ext.android.versionInt
versionName rootProject.ext.android.versionString
}
buildTypes {
release {
minifyEnabled false
debuggable false
multiDexEnabled false
versionNameSuffix '-Release'
}
debug {
minifyEnabled false
debuggable true
multiDexEnabled false
versionNameSuffix '-Debug'
buildConfigField "String", "MAPID", "\"" + rootProject.ext.android.mapId + "\""
}
}
}
说明
新建一个myConfig.gradle文件中使用ext{}闭包配置了versionCode&versionName&mapId。然后在APP的Gradle文件中的defaultConfig{}包使用。
验证
打了一个app-blue-free-debug.apk包
转载:https://blog.csdn.net/weixin_37730482/article/details/70760450