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

文章详细介绍了如何使用variantFilter闭包在AndroidStudio的Gradle构建脚本中过滤不需要的APK变体,以及如何利用ext闭包在不同Gradle文件之间共享配置信息,例如versionCode和versionName。示例包括过滤特定变体和在多个文件间共享配置变量的方法。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值