Android 使用Gradle全解

作者: 奔跑吧李博 | 来源:发表于2021-07-18 17:07 被阅读0次

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

    • groovy语法掌握

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

    • gradle生命周期

    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 "执行阶段完毕"
    }
    
    • 配置gradle 仓库

    在项目的根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
    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) {
    
            }
        })
    }
    
    • 引入gradle插件

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

    • 在gradle文件中引入独立gradle文件:
    apply from: '../xxx.gradle'
    
    • 读取gradle.properties文件中数据

    示例:读取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
    }
    
    • 往该模块的BuildConfig文件注入属性和值
            //需要三个参数  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
            }
        }
    
    • 多渠道配置,并将相关信息配置进apk名字

    在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

    相关文章

      网友评论

        本文标题:Android 使用Gradle全解

        本文链接:https://www.haomeiwen.com/subject/ozcepltx.html