当前位置: 首页 > news >正文

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

文章目录

  • 变量定义
  • 函数定义
  • 函数调用
  • 闭包参数
  • APK输出配置
  • 多channel配置
  • 依赖配置
  • 关键总结
  • 常见混淆点
  • groovy高度兼容java

变量定义

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 lineimplementation '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特性。

相关文章:

  • 【神经网络与深度学习】VAE 中的先验分布指的是什么
  • “胖都来”商标申请可以通过注册不!
  • Eclipse通过Tomcat启动web项目报错
  • 使用 AI 如何高效解析视频内容?生成思维导图或分时段概括总结
  • 基于 ISO 22301 与国产化实践的 BCM 系统菜单设计指南
  • 【疑难杂症2025-003】Java-mvn项目在gitlab-ci构建镜像时遇到的问题和解决方案
  • ✍️【TS类型体操进阶】挑战类型极限,成为类型魔法师![特殊字符]♂️✨
  • EDU/EDU.CN教育邮箱的申请(申请成功可以免费使用一年CursorPro)
  • 【漫话机器学习系列】245.权重衰减(Weight Decay)
  • CentOS 系统升级失败的原因与排查
  • 理解网站导航文件:robots.txt、sitemap.xml与LLMs.txt的全面解析
  • 大数据、物联网(IoT)、平台架构与设计重构大模型应用
  • 【Spring】Spring MVC笔记
  • 深入解析Http11AprProtocol:Tomcat高性能通信的底层原理
  • 快速上手 Docker:从入门到安装的简易指南(Mac、Windows、Ubuntu)
  • 【java】使用iText实现pdf文件增加水印功能
  • Postman最佳平替, API测试工具Bruno实用教程(一):基础篇
  • 广告屏蔽插件的内部细节EasyList 规则详解:为什么广告屏蔽不直接用 CSS/JS?​(彩蛋)
  • Flink + Kafka 数据血缘追踪与审计机制实战
  • 开发搭载阿里云平台的物联网APP(支持数据接收与发送)
  • 玉渊谭天丨中方为何此时同意与美方接触?出于这三个考虑
  • 71岁导演詹姆斯・弗雷病逝,曾执导《纸牌屋》、麦当娜MV
  • 追光|铁皮房、土操场,这有一座“筑梦”摔跤馆
  • 习近平同俄罗斯总统普京举行会谈
  • 汪明荃,今生不负你
  • 波音公司计划于2027年交付新版“空军一号”飞机