Gradle学习学习之鸿蒙&Android

Android 使用Gradle全解

2021-07-18  本文已影响0人  奔跑吧李博

gradle是基于Apache Maven概念的项目自动化构建开源工具。他是使用一种基于groovy的 特定领域语言来声明项目配置,抛弃了 基于 XML的各种繁琐配置。
虽然gradle都是基于groovy的,但是由于其提供了一整套DSL,所以在开发gradle脚本时几乎脱离了groovy的感知。

我的另一篇关于groovy语法的学习

Gradle生命周期分为三个部分,如下:

  1. 初始化阶段: 解析整个工程中所有Project,构建所有的Project对应的project对象,这个阶段主要就是解析setting.gradle文件
  2. 配置阶段:解析所有的projects对象中的task,构建好所有的task拓扑图,主要解析各个project下的build.gradle文件
  3. 执行阶段:执行具体的的task及其依赖task

Gradle的生命周期的监听:

beforeEvaluate {
    println "配置阶段开始"
}

afterEvaluate {
    println "配置阶段完毕"
}

//等同于 beforeEvaluate
this.gradle.beforeProject {
    println "配置阶段开始"
}

//等同于 afterEvaluate
this.gradle.afterProject {
    println "配置阶段完毕"
}

//最后执行buildFinished
gradle.buildFinished {
    println "执行阶段完毕"
}

在项目的根build.gradle文件中,配置需要从哪里的仓库下载jar包

repositories {
        google()
        jcenter()
    }
repositories {
        //构建项目时会拉取gradle资源,而goole和jcenter在国内的网络环境并不好,容易出现包拉取失败的问题,那么就可以使用国内阿里的镜像。
        //repositories里仓库具有从上到下先后获取顺序
        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
        maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
        google()
        jcenter()
}
task taskName {
    //do some things
 }

定义简单task

//定义 task , 名字 hello
task hello {
    println "hello world"
}

//定义 task,名字 hello
task(hello2) {
    println "hello world2"
}

//定义 task,名字 hello3
task ('hello3') {
    println "hello world3"
}

task 本质上又是由一组被顺序执行的 Action 对象构成,Action其实是一段代码块,类似于Java中的方法。

task actionUse {
    //在Action 队列头部添加Action
    doFirst {

    }
    //在Action 队列尾部添加Action
    doLast {

    }
    //创建一个 Action , 添加到 Action 列表的头部
    doFirst(new Action<Task>() {
        @Override
        void execute(Task task) {

        }
    })
}

apply plugin: 插件名 引入插件以后相当于包含了该插件所有的任务类型、任务、属性等。

apply from: '../xxx.gradle'

示例:读取gradle.properties中一个属性值NET_TYPE=dev,用来对应当前安装包的环境类型。

//使用文件流读取properties数据
def getServer() {
    def netType
    Properties properties = new Properties()  //使用Properties读取流文件
    def file = file("../gradle.properties")  // file() 创建一个Java中的File对象
    if (file.canRead()) {
        //可以读取到文件
        properties.load(file.newInputStream())
        if (properties != null) {
            //文件读取成功
            netType = properties.getProperty('NET_TYPE')  //getProperty读取属性值
        }
    }
    return netType
}
        //需要三个参数  1.属性类型(String/int)   2.属性名  3.属性值
        //String类型,需要加入转义的双引号才表示字符串,不然生成的变量没有双引号
        buildConfigField 'String', 'IS_DEV', "\"dev\""
        buildConfigField 'String', 'IS_BETA', "\"beta\""
        buildConfigField 'String', 'IS_RELEASE', "\"release\""
        buildConfigField 'String', 'NET_TYPE', "\""+getServer()+"\""  //net_type读取properties中NET_TYPE值

在BuildConfig中生成了新的属性和值:


然后可以根据BuildConfig中类型来获取对应BaseUrl

        /**
         * 获取当前环境的域名
         */
        fun getBaseUrl(): String {
            return when (BuildConfig.NET_TYPE) {
                BuildConfig.IS_DEV -> {
                    SERVER_ADDRESS_DEV
                }
                BuildConfig.IS_BETA -> {
                    SERVER_ADDRESS_BETA
                }
                BuildConfig.IS_RELEASE -> {
                    SERVER_ADDRESS_RELEASE
                }
                else -> SERVER_ADDRESS_DEV
            }
        }

在app下的build.gradle文件的android{}中配置签名所需信息,可直接用gradle命令打包。

    //签名配置
    signingConfigs {
        release {
            keyAlias 'xxxx'
            keyPassword 'xxx'
            storeFile file('xxxx.jks')
            storePassword 'xxxx'
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }

在app下的build.gradle文件中,配置一键化多渠道打包:

    defaultConfig {
        ...
        flavorDimensions "versionCode"  //还需要配置多渠道打包code
    }

    productFlavors {
        yingyongbao {}
        qh360 {}
        xiaomi {}
        vivo {}
        oppo {}
        huawei {}
    }

    productFlavors.all { flavor->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
        buildConfigField 'String', 'PLAT_FORM', "\"${name}\""
    }

      buildTypes {
        release {

            //通过Gradle生成apk名称,带有渠道名称,时间戳,版本号,版本名称等信息
            android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "${new Date().format("yyyy-MM-dd")}_${defaultConfig.versionName}_release.apk"
                }
            }
        }
    }

参考:
https://www.bilibili.com/video/BV14541137MV?p=5&spm_id_from=pageDriver

上一篇 下一篇

猜你喜欢

热点阅读