安卓工程build.gradle中的Groovy的常见知识点

变量定义

def debugCdnUrl = "\"http://xxx\"" //变量赋值

函数定义

def getTime() {  // 函数定义(def 是 Groovy 中定义变量/函数的关键字)
    return new Date().format("yyyyMMdd", TimeZone.getDefault())
}

函数调用

apply plugin: 'com.android.application'  // apply 是方法,参数是一个 Map
// (plugin: 'com.android.application' 等价于 [plugin: 'com.android.application'])

println "hello world"  // 方法调用(Groovy的 println)

signingConfigs {  // 方法调用(接收闭包参数)
    debug {  // 方法调用(配置 debug 签名)
        storeFile file('..\\myKey\\xxxKey.jks')  // 方法调用(storeFile 是方法,参数是 file() 的返回值)
        keyPassword '123456'  // 方法调用(参数字符串)
        // ...其他同理
    }
}

buildTypes {  // 方法调用
    debug {  // 方法调用(配置 debug 类型)
        signingConfig signingConfigs.debug  // 方法调用(参数是 signingConfigs.debug 的返回值)
        minifyEnabled false  // 方法调用(参数布尔值)
        buildConfigField("String", "app_key", "\"${app_key}\"")  // 方法调用(三个参数)
    }
}

闭包参数

android {  // 方法调用(接收闭包参数)
    compileSdkVersion 30        // 方法调用(参数30)
    buildToolsVersion '28.0.3'   // 方法调用(参数字符串)
    useLibrary 'org.apache.http.legacy'  // 方法调用(参数字符串)

    defaultConfig {  // 方法调用(接收闭包参数)
        applicationId "com.jy.demo"      // 方法调用(参数字符串)
        minSdkVersion 21                 // 方法调用(参数21)
        targetSdkVersion 30              // 方法调用(参数30)
        // ...其他类似
    }

    sourceSets {  // 方法调用(接收闭包参数)
        main {  // 方法调用(配置 main 的 source set)
            jniLibs.srcDir 'libs'  // 方法调用(jniLibs 是对象,srcDir 是方法)
        }
        // ...其他channel配置同理
    }
}

APK输出配置

applicationVariants.all { variant ->  // 方法调用(all 是方法,参数是闭包)
    def buildType = variant.buildType.name  // 属性访问(variant.buildType 是对象,name 是属性)
    variant.getPackageApplicationProvider().get().outputDirectory = ...  // 方法调用链(getPackageApplicationProvider() 返回对象,再调用 get())
    variant.outputs.each {  // 方法调用(each 是 Groovy 的迭代方法)
        it.outputFileName = ...  // 属性赋值(it 是 outputs 的元素,outputFileName 是属性)
    }
}

多channel配置

flavorDimensions "channel", 'cdn'  // 方法调用(两个字符串参数)
productFlavors {  // 方法调用(接收闭包参数)
    p_xxx {  // 方法调用(创建名为 p_xxx 的 flavor)
        dimension "channel"  // 方法调用(参数字符串)
        applicationId "com.xxx.demo"  // 方法调用(参数字符串)
        buildConfigField "String", "apkUpdateUrl", '"..."'  // 方法调用(三个参数)《注入字段》
    }
    // ...其他同理
}

依赖配置

dependencies {  // 方法调用(接收闭包参数)
    p_xxxImplementation fileTree(...)  // 方法调用(p_xxxImplementation 是方法名,参数是 fileTree 的返回值)    
    p_pftestImplementation fileTree(include: ['*.jar', '*.aar'], dir: 'gamelibs') //demo of previous line
    implementation 'androidx.appcompat:appcompat:1.3.1'  // 方法调用(implementation 是方法,参数字符串)
}

关键总结

  • 方法调用:Groovy 允许省略括号,例如 compileSdkVersion 30 等价于 compileSdkVersion(30)
  • 闭包参数:类似 android { … } 的结构,android 是方法,后面的 { … } 是闭包参数
  • 属性赋值:当代码直接形如 key = value 时(例如 it.outputFileName = …),这是真正的属性赋值。
  • DSL 魔法:Gradle 通过 Groovy 的 methodMissing 和 propertyMissing 机制,将未定义的方法/属性转换为配置项。

常见混淆点

// buildConfigField:看似是属性,实则是方法,接受三个参数(类型、字段名、值)。

// manifestPlaceholders:是方法调用(manifestPlaceholders = [ ... ]),参数是一个 Map。

// jniLibs.srcDir 'libs':jniLibs 是对象,srcDir 是方法,参数是路径。

groovy高度兼容java

  • 在 build.gradle 文件中,可以直接使用 Java 代码的语法,因为 Groovy(Gradle 的默认 DSL 语言)与 Java 高度兼容。
  • 总的来说:可以使用java语法、调用java库;但是更推荐优先使用groovy语法和gradle的DSL特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值