【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.properties 和 project.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、

相关推荐
千里马学框架3 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone3 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui