【Android-Gradle】多模块开发中,定义额外属性(全局变量),穿梭在不同的Gradle文件中(kotlin脚本版)

其他信息可以参考官网:https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html#org.gradle.api.plugins.ExtraPropertiesExtension

但是本文讲一些简单应用:

需求1:根目录gradle文件定义一个全局变量

build.gradle.kts(根目录)

1.1 添加额外属性:var isRelease by extra(false)// 其中 key = "isRelease" , value = false

1.2 改写属性值:project.setProperty("isRelease",true)

1.3 读取属性值:project.properties["isRelease"] // 或者project.ext.properties["isRelease"] 都可以

需求2:在子模块的中读写上面那个变量:

2.1 改写属性值:project.setProperty("isRelease",true)

2.2 读取属性值:project.properties["isRelease"] // 注意:project.ext.properties["isRelease"] 只能读取本文件的额外属性,不能读取根目录下的

示例:

1、在安卓根目录创建 build2.gradle.kts 文件

写入:

kotlin 复制代码
var isRelease by extra(false)//添加额外的属性

2、在根项目的 build.gradle.kts 文件中:

kotlin 复制代码
apply(from = "build2.gradle.kts") // 应用另外一个文件的配置

// 然后你也可以再此进行读写:
//project.setProperty("isRelease",true)// 测试------修改其中的属性
//println(project.ext.properties)// 输出全部已经定义的key-value,其中会包含刚刚加入的:isRelease=true
println("isRelease value = "+project.properties["isRelease"])// 输出这个key的 value:true,也是读取额外属性的方法------------可以在其他子文件中读取
//println("isRelease?: "+project.ext.properties.containsKey("isRelease"))// 检查是否包含某个key:true

3、上面养好了根项目之后,就可以在子项目中的 build.gradle.kts 读写

注意点就是:project.propertiesproject.ext.properties 读取结果(可以自行打印测试)

kotlin 复制代码
参考以上代码即可

项目实战:

注意,使用DSL语法,可能不能使用动态应用插件,具体官网有讲:
https://docs.gradle.org/current/userguide/plugins.html#sec:binary_plugin_locations

假设我们的项目结构为:

复制代码
root(根目录)
	-app(主模块)
		-build.gradle.kts(app)
	-app-study(其他应用模块,或者库模块)
		-build.gradle.kts(app-study)
	-build.gradle.kts(root)
	-build2.gradle.kts(自己新加的一个统一构建配置文件)

我们需要在最顶层(build.gradle.kts(root))定义一个变量,

来控制模块 app-study 是作为库(library)模块还是应用(application)模块

当插件 id 为:id("com.android.application") 的时候,是作为应用模块构建,此时编译成 apk 归档文件,可直接安装。

当插件 id 为:id("com.android.library") 的时候,是作为应用模块构建,此时编译成 aar 归档文件,作为其他模块的依赖库。

但是所有逻辑都写在 build.gradle.kts(root)文件中有时候可能会比较大,此时如果你想分出一个单独文件写和管理的话,可以新建一个类似的文件,然后再 build.gradle.kts(root)中引用即可。

1、

kotlin 复制代码
var isRelease by extra(false)//添加额外的属性

2、

kotlin 复制代码
apply(from = "build2.gradle.kts") // 应用另外一个文件的配置
//project.setProperty("isRelease",true)// 测试------修改其中的属性
//println(project.ext.properties)// 输出全部已经定义的key-value,其中会包含刚刚加入的:isRelease=true
//println("isRelease value = "+project.properties["isRelease"])// 输出这个key的 value:true,也是读取额外属性的方法------------可以在其他子文件中读取
//println("isRelease?: "+project.ext.properties.containsKey("isRelease"))// 检查是否包含某个key:true

// 插件可以扩展 Gradle 的功能,并为项目贡献任务。
// 在构建过程中添加插件称为应用插件,它能提供额外的功能。
plugins {
    // 应用程序插件有助于创建可执行的 JVM 应用程序。
    // 应用应用程序插件也会隐式应用 Java 插件。Java 插件为项目添加了 Java 编译、测试和捆绑功能。
    id("com.android.application") version "8.2.2" apply false  //  	添加插件。
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}

3、

kotlin 复制代码
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
}

改成:
val isRelease = project.properties["isRelease"] as Boolean
apply {
    if (isRelease) {// 如果是发布版本,这个模块应该作为一个库被别人使用
        plugins.apply("com.android.library")
    } else {// 如果不是发布版本,这个模块应该作为一个独立的app可以被调试
        plugins.apply("com.android.application")
    }
    plugins.apply("org.jetbrains.kotlin.android")// 这个不论是应用模块,还是库模块,都是用一样的。
}

4、

相关推荐
Kapaseker1 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴1 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭11 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab12 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe17 小时前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农1 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
鹏程十八少1 天前
4.Android 30分钟手写一个简单版shadow, 从零理解shadow插件化零反射插件化原理
android·前端·面试
Kapaseker1 天前
一杯美式搞定 Kotlin 空安全
android·kotlin
三少爷的鞋1 天前
Android 协程时代,Handler 应该退休了吗?
android
火柴就是我2 天前
让我们实现一个更好看的内部阴影按钮
android·flutter