APP的Gradle详解-----variantFilter ext

一.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.官网

https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html#org.gradle.api.plugins.ExtraPropertiesExtension

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

猜你喜欢

转载自blog.csdn.net/gqg_guan/article/details/131896542
ext