android 组件化gradle语法

本文介绍了Android项目中Gradle的使用,强调了Gradle基于Groovy脚本语言的特性,并展示了如何在项目中创建和管理全局配置。通过在config.gradle中定义属性,然后在app和library模块的build.gradle中引用,实现属性值的统一管理。此外,还探讨了如何将自定义变量写入BuildConfig类,以便在不同环境中灵活控制应用行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android项目中都有build.gradle文件,其实这是gradle构建工具,gradle是由Groovy语言开发的,之前只是把简单的语法学习了下,由于要找工作 没时间学习了,如果能找到工作 上班后再学习,也有可能这辈子就离开it了,

Gradle核心是基于Groovy脚本语言的,Groovy脚本是基于java意思是它完全的兼容jvm,而且还在此基础上做了扩展,因此Gradle需要jdk和Groovy库.

之前的构建工具有ant maven这二个是基于xml的,

比如我在项目的目录下打印hello gradle

apply plugin: 'com.android.application'
println("hello gradle")

然后点击同步或者builde项目

这就是groovy脚本语言,如果学过groovy脚本语言的知道 它是个弱语言,不像Java那样,其实上面的打印这样写也是对的,

println "hello gradle"

不用()也可以的

现在我创建一个Android library然后也打印出一句话 看是否有输出

apply plugin: 'com.android.library'
println "hello library"

然后点击同步

> Configure project :app
hello gradle

> Configure project :library
hello library

发现也打印出来了

我们发现你在app的build.gradle   libray中的build gradle都是可以打印出来字符串的,那么如果是打印一个变量,这个变量统一管理,就很好了,这是可以的.

在项目的根目录下创建一个config.gradle 文件

创建完后它是一个空文件,现在config.gradle文件中写入这行代码

ext{
    userName = "zhouguizhi"
    age=18
}

ext:表示添加多个自定义属性,就使用ext代码块,类似Java同步的synchronized代码块

userName表示属性名。zhouguizhi表示属性值

那么在app或者library中的build.gradle使用到呢?那就要把这个config.gradle在根目标的build.gradle进行配置,如下

现在分别在app和library中打印出config.gradle的自定义属性

apply plugin: 'com.android.application'
println "${userName}"
apply plugin: 'com.android.library'
println "${age}"

同步下代码


> Configure project :app
zhouguizhi

> Configure project :library
18

都把对应的属性值打印出来了,当然上面的是简写,还可以使用这种方式


println "${rootProject.ext.userName}"

上面的写法是缩写,从这点也可以看的出来groovy语言是一门弱语言,比如我在打印之前还可以重新对这个属性进行赋值操作

apply plugin: 'com.android.application'
rootProject.ext.userName = "app"
println "${rootProject.ext.userName}"

这个打印出来的就是字符串app了,当然你还可以赋值一个int类型给它都是可以的,这有点像js中的var修饰的变量

比如真实的项目开发中可能有很多个module,比如

compileSdkVersion 28
buildToolsVersion "29.0.0"
minSdkVersion 15
targetSdkVersion 28

还有依赖库的版本都希望统一管理,如果修改的话 改一处就行了,这就相当于Java中的封装了,不就很好了,

我们现在就做一个全局的配置,这样不管在哪个build.gradle文件都是用同一份
config.gradle

ext{
    isRelease = true
    androidId=[
            compileSdkVersion:28,
            buildToolsVersion:"29.0.0",
            minSdkVersion: 15,
            targetSdkVersion: 28,
            versionCode: 1,
            versionName: "1.0"
    ]
    appId=[
            applicationId: "com.example.gradle",
    ]
    url=[
            debug:"http://www.baidu.com",
            release:'http://qq.com'
    ]
    supportLibrary = '28.0.0'
    support=[
            appcompat:"com.android.support:appcompat-v7:${supportLibrary}",
            constraint: "com.android.support.constraint:constraint-layout:1.1.3"
    ]
}

在build.gradle使用

apply plugin: 'com.android.application'
def androidId=rootProject.ext.androidId
def appId = rootProject.ext.appId
def support = rootProject.ext.support
android {
    compileSdkVersion androidId.compileSdkVersion
    buildToolsVersion androidId.buildToolsVersion
    defaultConfig {
        applicationId appId.applicationId
        minSdkVersion androidId.minSdkVersion
        targetSdkVersion androidId.targetSdkVersion
        versionCode androidId.versionCode
        versionName androidId.versionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation support.appcompat
    implementation support.constraint
}

上面的def就是类型定义变量的关键词

我们开发可能对这个类BuildConfig不会陌生,这是系统帮我们生成的,不管是app还是library都有这个类,这个类的所在目录是

看看这个类都有啥

package com.example.gradle;

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.example.gradle";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
}

那如何写入一个变量到这个类中呢,肯定不是直接在这里面写,你也写不了,在build.gradle文件中这个位置

buildTypes {
        debug{
            buildConfigField("String","debug","\"${url.debug}\"")
        }
        release {
            buildConfigField("String","release","\"${url.release}\"")
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

我现在写入了这段话,然后同步下 rebuild下看看BuildConfig类

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.example.gradle";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
  // Fields from build type: debug
  public static final String debug = "https://www.baidu.com";
}

比如我们在项目中打log,在release版本希望把这个log关闭,一般都写个工具类 ,自己去控制,而如果添加buildConfigField属性从而在BuildConfig中生成的字段去控制就灵活多了.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值