安卓工程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特性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化

作者:裘文成(翊韬) 摘要 随着企业全球化业务的扩展,如何高效、经济且可靠地将分布在海外各地的应用与基础设施日志统一采集至阿里云日志服务 (SLS) 进行分析与监控,已成为关键挑战。 本文聚焦于阿里云高性能日志采集…

deep seek简介和解析

deepseek大合集,百度链接:https://pan.baidu.com/s/10EqPTg0dTat1UT6I-OlFtg?pwdw896 提取码:w896 一篇文章带你全面了解deep seek 目录 一、deep seek是什么 DeepSeek-R1开源推理模型,具有以下特点: 技术优势: 市场定位&…

在ISOLAR A/B 工具使用UDS 0x14服务清除单个DTC故障的配置

在ISOLAR A/B 工具使用UDS 0x14服务清除单个DTC故障的配置如下图所示 将DemClearDTCLimitation参数改成DEM_ALL_SUPPORTED_DTCS 此时0x14 服务就可以支持单个DTC的故障清除, 如果配置成 DEM_ONLY_CLEAR_ALL_DTCS 则只能够用0x14服务清楚所有DTC。

Redis面试 实战贴 后面持续更新链接

redis是使用C语言写的。 面试问题列表: Redis支持哪些数据类型?各适用于什么场景? Redis为什么采用单线程模型?优势与瓶颈是什么? RDB和AOF持久化的区别?如何选择?混合持久化如何实现&#x…

Selenium自动化测试工具常见函数

目录 前言 一、什么是自动化? 二、元素的定位 三、测试对象的操作 3.1输入文本send_keys() 3.2按钮点击click() 3.3清除文本clear() 3.4获取文本信息text 3.5获取页面的title与URL 四、窗口 4.1窗口的切换switch_to.window() 4.2窗口大小设置 …

seata 1.5.2 升级到2.1.0版本

一、部署1.5.2 1、解压缩 tar -xvf apache-seata-***-incubating-bin.tar.gz 2、修改conf下的application.yml 只需要修改seata下的此配置,然后再nacos中添加其它配置,下面是application.yml的配置: server:port: 7091spring:applic…

Vue知识框架

一、Vue 基础核心 1. 响应式原理 数据驱动:通过 data 定义响应式数据,视图自动同步数据变化。 2、核心机制 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)实现数据劫持。依赖收集:追踪…

Nginx静态资源增加权限验证

Nginx静态资源增加权限验证 一、前言二、解决思路2.1、方式一2.2、方式二三、代码3.1、方式一3.1.1、前端代码3.1.2、后端代码3.1.3、Nginx调整3.1.4、注意事项3.2.方式二四、参考资料一、前言 在项目开发的过程中,项目初期,及大部分小型项目都是使用共享磁盘进行静态文件的…

分析NVIDIA的股价和业绩暴涨的原因

NVIDIA自2016年以来股价与业绩的持续高增长,是多重因素共同作用的结果。作为芯片行业的领军企业,NVIDIA抓住了技术、战略、市场与行业趋势的机遇。以下从技术创新、战略布局、市场需求、财务表现及外部环境等维度,深入分析其成功原因&#xf…

更换芯片后因匝数比变化,在长距离传输时出现通讯问题。我将从匝数比对信号传输的影响、阻抗匹配等方面分析可能原因,并给出相应解决方案。

匝数比影响信号幅度与相位:原 HM1188 芯片匝数比 1:1,信号在变压器原副边传输时幅度基本不变;更换为 XT1188 芯片(匝数比 1:2)后,根据变压器原理,副边输出信号幅度会变为原边的 2 倍。短距离 10…

Python引领前后端创新变革,重塑数字世界架构

引言:Python 在前后端开发的崭新时代 在当今数字化时代,软件开发领域持续创新,而 Python 作为一门功能强大、应用广泛的编程语言,正引领着前后端开发的变革浪潮。Python 以其简洁易读的语法、丰富的库和框架生态系统,以及强大的跨领域适用性,在计算机领域占据了举足轻重…

IP SSL证书常见问题助您快速实现HTTPS加密

一、什么是IP SSL证书? IP SSL证书是一种专门用于保护基于IP地址的网站或服务器的SSL证书。与传统的域名SSL证书不同,它不需要绑定域名,而是直接与公网IP地址关联。当用户访问该IP地址时,浏览器与服务器之间会建立加密连接&#…

「Mac畅玩AIGC与多模态27」开发篇23 - 多任务摘要合成与提醒工作流示例

一、概述 本篇基于兴趣建议输出的方式,扩展为支持多任务输入场景,介绍如何使用 LLM 对用户输入的多项待办事项进行摘要整合、生成重点提醒,并保持自然语言风格输出,适用于任务总结、进度引导、日程提醒等轻量型任务生成场景。 二…

前端自学入门:HTML 基础详解与学习路线指引

在互联网的浪潮中,前端开发如同构建数字世界的基石,而 HTML 则是前端开发的 “入场券”。对于许多渴望踏入前端领域的初学者而言,HTML 入门是首要挑战。本指南将以清晰易懂的方式,带大家深入了解 HTML 基础,并梳理前端…

js 两个数组中的指定参数(id)相同,为某个对象设置disabled属性

在JavaScript中,如果想要比较两个数组并根据它们的id属性来设置某个对象的disabled属性为true,你可以使用几种不同的方法。这里我将介绍几种常用的方法: 方法1:使用循环和条件判断 const array1 [{ id: 1, name: Item 1 },{ id…

编写大模型Prompt提示词方法

明确目标和任务 // 调用LLM进行分析const prompt 你是一名严格而友好的英语口语评分官,专业背景包括语音学(phonetics)、二语习得(SLA)和自动语音识别(ASR)。你的任务是: ① 比对参…

MCP系列(一)什么是MCP?

MCP 是什么:从 USB-C 到 AI 的「万能接口」哲学 MCP(Model Context Protocol,模型上下文协议) 是Anthropic于2024年11月推出的AI跨系统交互标准,专为解决LLM(大语言模型)的「数字失语症」——让…

NoMachine 将虚拟显示器改为物理显示器

一、前言 大多数服务器需求是设置为虚拟显示器,因为服务器本身不接物理的显示器。但我的需求不太一样,服务器就在身边,有时候关闭远控也需要实时监测,所以接了物理的显示器。 NoMachine 默认会为用户创建一个新的桌面会话&#xf…

YOLOv8 优化:基于 Damo-YOLO 与 DyHead 检测头融合的创新研究

文章目录 YOLOv8 的背景与发展Damo-YOLO 的优势与特点DyHead 检测头的创新之处融合 Damo-YOLO 与 DyHead 检测头的思路融合后的模型架构融合模型的代码实现导入必要的库定义 Damo-YOLO 的主干网络定义特征金字塔网络(FPN)定义 DyHead 检测头定义融合后的…

关税冲击下,FBA国际物流企业如何靠智能拓客跑出增长“加速度”?

国际物流行业正迎来前所未有的增长机遇。据中研普华最新报告,2025年全球物流市场规模已突破6.27万亿美元,其中中国跨境物流市场预计达2.71万亿元。在全球化与数字化双轮驱动下,国际物流从“规模扩张”迈向“价值重构”。可以说,国…