【构建工具】Gradle Kotlin DSL中的大小写陷阱:BuildConfigField

在Android开发当中,BuildConfig是一个非常有用的功能,它允许我们在构建过程中定义常量,并在运行时使用它们。But!!当我们从传统的Groovy DSL迁移到Kotlin DSL时或者被Android Studio坑的时候,有一些细微的差别可能会导致意想不到的问题。今天,我要分享一个我最近遇到的陷阱:BuildConfigField vs buildConfigField(主要是Android Studio的代码的锅!)。

如果你不知道什么是BuildConfig,可以去看我上一篇博客

  • 【构建工具】Gradle 8中Android BuildConfig的变化与开启方法

问题场景

假设有一个使用Kotlin DSL的build.gradle.kts文件,其中包含以下配置:

android {
    namespace = "dev.xuanran.xxxx"
    compileSdk = 35

    defaultConfig {
        applicationId = "dev.xuanran.xxxx"
        minSdk = 26
        targetSdk = 35
        versionCode = 1
        versionName = "1.0"
    }

    buildTypes {
        debug {
            BuildConfigField("boolean", "DEBUG", "true")
            BuildConfigField("boolean", "APP_PACKAGE_BIND", "false")
        }
        release {
            isMinifyEnabled = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
            BuildConfigField("boolean", "DEBUG", "false")
            BuildConfigField("boolean", "APP_PACKAGE_BIND", "false")
        }
    }
    
    buildFeatures {
        buildConfig = true
    }
    // 其他配置...
}

我们已经启用了BuildConfig功能(通过buildFeatures { buildConfig = true }),但是当查看生成的BuildConfig类时,只看到默认字段:

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "dev.xuanran.xxxxx";
  public static final String BUILD_TYPE = "debug";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  // 但是没有APP_PACKAGE_BIND字段!
}

问题出在哪???

问题根源:大小写敏感性

问题出在方法名的大小写上。在Kotlin DSL中,正确的方法名应该是小写开头的buildConfigField,而不是大写开头的BuildConfigField

这是因为Kotlin语言和Gradle DSL遵循特定的命名约定:

  • 类名和接口名以大写字母开头(PascalCase)
  • 方法名和属性名以小写字母开头(camelCase)

而在Groovy DSL中,由于Groovy的动态特性,方法调用对大小写不那么敏感,所以可能两种写法都能工作。但在更严格的Kotlin中,这是一个明确的区别。

解决方案

修改build.gradle.kts文件,将所有的BuildConfigField改为buildConfigField

buildTypes {
    debug {
        buildConfigField("boolean", "DEBUG", "true")
        buildConfigField("boolean", "APP_PACKAGE_BIND", "false")
    }
    release {
        isMinifyEnabled = true
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro"
        )
        buildConfigField("boolean", "DEBUG", "false")
        buildConfigField("boolean", "APP_PACKAGE_BIND", "false")
    }
}

进行这个简单的修改后,重新构建项目,就会看到生成的BuildConfig类中现在包含了自定义字段:

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "dev.xuanran.xxxx";
  public static final String BUILD_TYPE = "debug";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  public static final boolean APP_PACKAGE_BIND = false; // 然后就可以了
}

错误原因(甩锅Android Studio)

我是知道如果要启用这个功能的话需要使用buildConfigField的,但是我在输入的时候Android Studio只有这一个代码补全,并没有小写字母开头的代码补全(即使我首字母是小写的),然后我就发现生成的并没有我想要的,排查了半天才发现是首字母大小写的问题,而且这个问题Gradle Sync和编译的时候不会报错,但是就是不生成这个字段
在这里插入图片描述

结论

我就说Android Studio是整个jetbrain中最烂的ide吧

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

递归、搜索与回溯第二讲:二叉树中的深搜 穷举vs暴搜vs深搜vs回溯vs剪枝

递归、搜索与回溯第二讲:二叉树中的深搜 && 穷举vs暴搜vs深搜vs回溯vs剪枝 1.计算布尔二叉树的值2.求根节点到叶结点数字之和3.二叉树剪枝4.验证二叉搜索树5.二叉搜索树中第K小的元素6.二叉树的所有路径7.全排列8.子集 1.计算布尔二叉树的值 2.求根节点到叶…

可编辑PPT | DeepSeek如何赋能职场应用

这个PPT的核心内容是介绍DeepSeek如何赋能职场应用,从提示语技巧到多场景应用的详细解读。PPT首先介绍了DeepSeek的背景和团队,展示了其在AI领域的多项赛事奖项和研究成果,突出了其在人机协同和人机共生领域的专业能力。接着,PPT详…

网络层(Internet Layer)

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 🚀 :🔥 前言 🦋 IP 地址:网络中的“门牌号”🦋 IP 地址的组成🦋 IPv4 到 IPv6 的过渡 一:…

final / 抽象类与抽象方法 / 接口

1. final 关键字 final:最终的 1.final可以用来修饰的结构:类,方法,变量 2.final用来修饰一个类:此类不能被其它类继承; 如 String类,System类,StringBuffer类 3.final用来修饰…

DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!

项目地址:GitHub - deepseek-ai/FlashMLA 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天! ​ 一、开源周震撼启幕 继上周预告后,DeepSeek于北京时间今晨9点准时开源「FlashMLA」,打响开源周五连…

9.编写负载均衡模块|编写judge功能|postman进行调试(C++)

编写负载均衡模块 代码整体结构 oj_control.hpp // code: #include... // input: "" void Judge(const std::string &number, const std::string in_json, std::string *out_json) {// 0. 根据题目编号,直接拿到对应的题目细节// 1. in_json进行反…

安装react报错

安装react报错 背景 执行命令npx create-react-app my-app,然后出现报错unable to resolve dependency tree 解决: 出现这个报错是因为依赖包版本出现冲突,查看package.json可以看到react版本是19.0.0,但是testing-library/rea…

CAD实现一键 面域转线(闭合多段线)——CAD c#二次开发

CAD中存在面域(region),当用系统自带命令是,生成的是断开的直线Line。 此插件可实现面域转为闭合的多段线(Polyline)。效果如下: 一次转600个图形 部分代码如下: public class 面…

快速理解Raft分布式共识算法

目录 拜占庭将军问题 Raft算法是干什么的? 一、领导选举(选老板) 二、日志复制(发通知) 三、安全性(防篡改) 🌰 举个真实例子 ✔️ Raft的优势 基础 状态机 节点类型 任期…

Python学习第十七天之PyTorch保姆级安装

PyTorch安装与部署 一、准备工作二、pytorch介绍三、CPU版本pytorch安装1. 创建虚拟环境2. 删除虚拟环境1. 通过环境名称删除2. 通过环境路径删除 3. 配置镜像源4. 安装pytorch1. 首先激活环境变量2. 进入pytorch官网,找到安装指令 5. 验证pytorch是否安装成功 四、…

Para-Lane: 首个真实世界多车道数据集,目的评估自动驾驶系统中的新型视角合成能力。

2025-02-22,阿里巴巴集团菜鸟自动驾驶实验室和百度研究院共同创建了一个名为 Para-Lane 的真实世界多车道数据集。该数据集目的评估自动驾驶系统中的新型视角合成(NVS)能力,通过提供大量真实世界的数据,弥补了现有合成…

Linux | Ubuntu 与 Windows 双系统安装 / 高频故障 / UEFI 安全引导禁用

注:本文为 “buntu 与 Windows 双系统及高频故障解决” 相关文章合辑。 英文引文,机翻未校。 How to install Ubuntu 20.04 and dual boot alongside Windows 10 如何将 Ubuntu 20.04 和双启动与 Windows 10 一起安装 Dave’s RoboShack Published in…

flutter 专题 八十二 Flutter路由框架Fluro简介

在Flutter应用开发过程中,除了使用Flutter官方提供的路由外,还可以使用一些第三方路由框架来实现页面管理和导航,如Fluro、Frouter等。 Fluro作为一款优秀的Flutter企业级路由框架,Fluro的使用比官方提供的路由框架要复杂一些&…

(十)趣学设计模式 之 外观模式!

目录 一、 啥是外观模式?二、 为什么要用外观模式?三、 外观模式的实现方式四、 外观模式的优缺点五、 外观模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…

为AI聊天工具添加一个知识系统 之124 详细设计之65 人类文化和习俗,即文化上的差异-根本差异 之2

本文要点 要点 “取” 本身 是一个具有 主谓宾 三格的 多“格”词。 三“格”(主/谓/宾)分别是: 主取,取法(能取:两组分别 是 析取取“异”(三个“不同”)和合取取“同”&#xf…

AXI协议详解及FPGA仿真

AXI协议详解及FPGA仿真 1 摘要 AMBA AXI 协议是以高性能,高频系统设计为目标,提供了很多适合高速亚微型系统互连的特征。为相邻存储器连续进行数据传输提供的一种高频率,高带宽,低延迟的总线协议,是一种突发传输协议…

互联网怎样利用人性-思维导图-markdown

互联网怎样利用人性 傲慢 留言、点评饥饿营销、吵架营销 懒惰 一键下单、扫二维码默认登录、多平台同步单点登录SSO美女论坛、美女头像事业线开箱防御力破女性装饰 贪婪 团购、秒杀、抽奖免费试吃、下载存储空间、在家赚钱晒单返现 窥视 订阅、悄悄关注名人博客微博、惊人标题…

javascript-es6 (五)

内置构造函数 在 JavaScript 中 最主要 的数据类型有 6 种: 基本数据类型: 字符串、数值、布尔、undefined、null 引用类型: 对象 但是,我们会发现有些特殊情况: //普通字符串 const str peiqi console.log(str.length) //…

Hive从入门到运用

hive简介 hive的设计思想(本质是一个翻译器) 上传安装包 解压,查看 运行hive(一定要启动hadoop,是有依赖关系的。) 测试启动方法,和建表 文件创建很上传到hdfs,直接上传到hive表的目…

RK3588部署YOLOv8(1):YOLOv8和YOLOv8-pose转ONNX及Python后处理代码实现

前言 由于种种原因,原始的YOLOv8系列的模型,在RK3588上难以部署,在 .pt 转 .onnx 的时候需要去掉后处理层(主要是DFL层)。因此,模型的后处理需要自己来实现。 本文基于Rockship 官方给的源码(导…