前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >看不懂的 build.gradle 代码

看不懂的 build.gradle 代码

作者头像
请叫我大苏
修改于 2018-05-19 15:57:43
修改于 2018-05-19 15:57:43
1.6K00
代码可运行
举报
文章被收录于专栏:AndroidTvAndroidTv
运行总次数:0
代码可运行

Android Studio 这么强大的工具,就算我们不懂 gradle, groovy, 也照样能借助AS对 Android 项目进行编译、调试、运行、打包等操作。build.gradle 这个文件接触这么久了,基本的项目配置也基本很熟悉了,毕竟每次自动创建的 build.gradle 里的代码就那么几项配置,看一下那些英文单词也基本猜到是什么配置。

但是,不知道你们会不会跟我一样,在 github 上 clone 大神的项目后,总会发现他们的 build.gradle 里多了很多平常没看见过的代码,而且还看不懂代码要做什么;

或者是比如当需要进行签名时,网上资料会让你在 Android 标签内加个 signingConfigs, 然后在它里面进行各种配置,比如 storeFile, keyAlias 等等之类的。还有其他类似这种情况,比如当需要打包时,在哪个地方加个什么标签再对它进行各种配置之类的。不知道你们会不会也跟我一样会有这样的疑问,这个标签名怎么来的,为什么要放在这个位置,它里面有哪些属性可以进行配置?

疑惑久了,总想去了解下这是为什么,所以花了一段时间来学习 gradle 的相关知识,这次在这里记录也分享一下,如果有错的地方,还望指点一下。

本次计划是写个 gradle 系列博客,大概会有3-4篇,第一篇只是简单的针对某个具体的 build.gradle 文件代码进行注释解释以及抛出一些疑问,当然这个 build.gradle 不会是AS自动创建的那么简单的代码。然后再写1-2篇介绍 gradle, groovy, 相关的资料网上很多,所以不会写得很基础,大概是挑选一些我认为比较重要的知识点进行介绍。最后在前面的基础上,对 build.gradle 里面的代码进行分析讲解,比如介绍说都有哪些标签,哪里去找这些标签等等。

好了,废话就唠叨到这,下面就开始正文。


系列索引

build.gradle系列一:看不懂的build.gradle代码

build.gradle系列二:学点Groovy来理解build.gradle代码

build.gradle系列三:如何用Android Studio查看build.gradle源码

...


build.Gradle

这个 build.Gradle 文件来自 drakeet 大神的 Meizi 项目

我直接在代码上加注释,参照着注释看代码就行,是不是发现有很多代码平时都没看见过。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Model都有各自的build.gradle,这里声明该Model作为主项目,常见的还有另一个取值:
//apply plugin: 'com.android.library' 声明该Model作为库使用,当然还有其他取值,后面博客会介绍
apply plugin: 'com.android.application'

//这里是在as里引入一个retrolambda插件,具体我也不大懂,可以看看这篇博客: 
//http://blog.csdn.net/zhupumao/article/details/51934317?locationNum=12
apply plugin: 'me.tatarka.retrolambda'

//这里是groovy的代码了,定义了一个获取时间的方法,groovy是兼容java,它可以直接使用jdk里的方法
def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

//file()是Project.java里的一个方法,这里定义一个File类型的对象,Project后面博客会介绍到
def keyStore = file('meizhi.keystore')

android {

    //这个大家应该很熟悉了,有疑问的应该是后面的代码,这里表示获取一些全局变量
    //这些变量的值在根目录下的build.gradle中定义,具体可以看看这篇博客:
    //http://blog.csdn.net/fwt336/article/details/54613419
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    buildToolsVersion rootProject.ext.android.buildToolsVersion

    //同理,这里都是通过获取全局设置的变量值来进行相关配置,这样做的好处在于当
    //你的项目里有多个model时,可以方便修改这些公共的配置,只需要修改一个地方就可以同步了
    defaultConfig {
        applicationId rootProject.ext.android.applicationId
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode rootProject.ext.android.versionCode
        versionName rootProject.ext.android.versionName
    }

    //这里应该是设置打包后的apk里的META-INF移除指定的文件吧
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        //省略部分exclude 代码...
    }

    //关闭指定的lint检查
    lintOptions {
        disable 'MissingTranslation', 'ExtraTranslation'
    }

    //lint检查到错误时不中断编译,好像是说lint检查是为优化代码,发现的错误其实并不会导致程序异常
    //所以有的时候及时发现Lint检查错误还是可以直接运行查看效果
    lintOptions {
        abortOnError false
    }

    //签名的相关配置
    signingConfigs {
        //这个标签名可以随意命名,这里的作用大概类似于定义一个对象,该对象里设置好了签名需要的各种配置
        //可以定义不止一种配置的签名对象,例如常见的还有 debug{...}, release{...},然后在buildTypes{}里
        //通过 signingConfigs.app1 进行调用
        app1 {
            //签名的相关配置,网上资料很多,STOREPASS, KEYALIAS, KEYPASS 这些常量是定义在
            //gradle.properties 文件里,如果没有该文件手动创建即可,这样可以保证安全
            //只有定义在 gradle.properties 里的常量才可以直接通过常量名引用
            storeFile file('meizhi.keystore')
            storePassword project.hasProperty('STOREPASS') ? STOREPASS : ''
            keyAlias project.hasProperty('KEYALIAS') ? KEYALIAS : ''
            keyPassword project.hasProperty('KEYPASS') ? KEYPASS : ''
        }
    }

    //编译,打包的项目配置
    buildTypes {

        debug {
            //在 BuildConfig 里自定义一个 boolean 类型的常量
            //更多资料可以查看:http://stormzhang.com/android/2015/01/25/gradle-build-field/ 
            buildConfigField "boolean", "LOG_DEBUG", "true"
            
            debuggable true
            applicationIdSuffix ".debug"
        }

        release {
            buildConfigField "boolean", "LOG_DEBUG", "false"

            debuggable false
            
            //开启混淆
            minifyEnabled true
            //删除无用的资源
            shrinkResources true
            //混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            if (keyStore.exists()) {
                println "Meizhi: using drakeet's key"
                //根据在signingConfigs.app1里的签名配置进行签名
                signingConfig signingConfigs.app1
            } else {
                println "Meizhi: using default key"
            }

            //这段代码应该会在大神的项目里挺常见的,我在很多项目里都看见过了
            //这也是groovy的代码,这里的代码作用是重命名最后打包出来的apk
            //根据 def fileName 设置的格式来命名,${}表示的是某个变量的引用
            //例如根据设置的格式最后apk命名可能是: Meizhi_v1.0.0_2017-03-28_fir.apk
            //至于 applicationVariants 这些变量含义后面博客会介绍
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        def fileName = "Meizhi_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }

        //这里的作用跟 singingConfigs 差不多,只是为不同的 flavor 设置一些属性
        //常见的设置比如设置不同的渠道编号,设置不同的 api 服务器等等
        productFlavors {
            fir {
                //这个的作用是将 AndroidManifest.xml 里的占位符 ¥{UMENG_CHANNEL_VALUE} 的值替换成fir
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "fir"]
            }
            GooglePlay {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "GooglePlay"]
            }
            Umeng {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Umeng"]
            }
        }
    }

    //设置JDK的版本通过compileOptions
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    //lint的相关配置吧
    lintOptions {
        disable "InvalidPackage"
        lintConfig file("lint.xml")
    }
}

//这里就不用说了
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(":libraries:headsupcompat")
    compile project(":libraries:smooth-app-bar-layout")
    //as默认会去下载传递依赖,下面是指定不需要去下载传递依赖
    compile ('com.squareup.retrofit2:retrofit:2.1.0') {
        exclude module: 'okhttp'
    }
    retrolambdaConfig 'net.orfjackal.retrolambda:retrolambda:2.3.0'
    //省略部分compile代码...
}

疑问

1.apply plugin: 'com.android.application' 听说这是调用一个方法?

2.rootProject.ext.android.compileSdkVersion, 不用 ext 来设置全局变量是否可以?

3.defaultConfig{}, packagingOptions{}, signingConfigs{}, buildTypes{} 等等这些,我怎么知道 Android{} 里都有哪些可以使用?

...

参考资料

·徐宜生写的《Android群英传:神兵利器》第4章:与Gradle的爱恨情仇

·retrolambda使用教程

·Gradle配置全局变量

·GRADLE自定义你的BUILDCONFIG

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.03.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)
最近有个需求一次要打包9个类型的App,而且常量和String.xml都有变量。虽然之前也是一直存在变量,但是每次也仅仅只打包一个。这让我每次改变量,打包9个。要是以后每次都打包9次,我得疯了。 根据之前的了解,gradle 应该是可以解决这个问题的。所以就仔细研究了一番。
用户2802329
2018/08/07
1.9K0
Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)
AndroidStudio3.0多渠道打包:我用一行命令打出N个包
csdn: http://blog.csdn.net/k_bb_666
蜻蜓队长
2018/08/03
4050
AndroidStudio3.0多渠道打包:我用一行命令打出N个包
在Android Studio中配置Gradle做到 “根据命令行提示符生成指定versionCode, versionName,指定apk的打包输出路径”
1. 使用 Android studio ,使用 gradle 进行构建   2. 在实际开发中,我们需要使用jenkins进行打包。就需要配置我们的 gradle 脚本以支持参数化的方式。   3. 想获得一个可配置打包脚本的方法,允许 配置人员根据需要修改 服务器地址,versionCode, versionName 等   4. 隔离的源代码的配置,使用者在 jenkins里进行配置。
张云飞Vir
2020/03/16
1.8K0
关于Gradle配置的小结
使用 Android Studio 来开发 Android 工程的过程中,接触 Gradle 是不可避免的,比如配置签名、引入依赖等。那么 Gradle 到底是什么东西呢? Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化建构工具。它使用一种基于 Groovy 的特定领域语言 (DSL) 来声明项目设置,抛弃了基于 XML 的各种繁琐配置 (此定义来自于百度百科-_- !) 。啰里啰唆一堆,幸运的是,一般来说 Android 开发者只要会配置 Gradle 就可以了,并不需要深入了解。那么下面我们就来揭开 Gradle 的面纱吧。
俞其荣
2022/07/28
6480
关于Gradle配置的小结
Android-Gradle(二) Gradle相关配置详解
Gradle是一个项目自动化建构工具,它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。Gradle主要帮我们做了依赖,打包,部署,发布,各种渠道的差异管理等工作。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。
android_薛之涛
2019/08/23
3.7K0
Android-Gradle(二) Gradle相关配置详解
使用Gradle管理你的Android Studio工程
关于Android Gradle更多详细内容已经出书《Android Gradle权威指南》,大家可以购买,看更多没有介绍的知识点和内容,购买链接如下
飞雪无情
2018/08/28
1.1K0
Gradle多渠道打包
国内Android应用市场品种太多,血统不纯,每次上线App都打包打到手软,上传上到吐血!好在我们有了Android studio和gradle,一条命令打包各种渠道版本App!
GitOPEN
2019/03/01
1.1K0
Android蹲坑的疑难杂症集锦(兼Gradle) 二
 这次我们继续聊聊项目中遇到的问题吧,作为上辈子的天使,才换来今生的入坑Android,码农不易,我们的梦想就是,下辈子下班时,不再月上柳梢头,可以看到夕阳下的奔跑,那是我们逝去的青春〒〒。
GSYTech
2018/08/22
3610
Android蹲坑的疑难杂症集锦(兼Gradle) 二
Android Studio 使用Gradle多渠道打包
我们都知道国内应用市场非常多,为了统计各个应用市场的app下载量和使用情况,我们需要多渠道的打包。如果一个一个的手动去打包岂不烦死了,要多麻烦就有多麻烦。这就要求我们学会使用Gradle进行多渠道打包。废话不多说了,直接进入正题吧! 第一步:配置AndroidManifest.xml 以友盟渠道为例,渠道信息一般都是写在 AndroidManifest.xml文件中,大约如下: <meta-data android:name="UMENG_CHANNEL" android:value="xiaomi" />
非著名程序员
2018/02/02
9550
这一次彻底弄明白Gradle相关配置
作者:19snow93 链接:https://www.jianshu.com/p/8b8a550246bd 本文由作者 19snow93 授权发布。 当毕业不够两年,身边的朋友慢慢得有车有房有女朋友周末有自己的节目,而我觉得很多美好的事情我都遥不可及,找不到可以让自己开心的事情做,心情很不好。但是同时我觉得沉淀需要时间、努力、耐心和自律,所以我总相信艰难的时候是总会过去,迎接自己的美好生活总到来的,给自己喊一句:“加油!”。 好了,牢骚发完了,最近我看了《Android Gradle权威指南》这本书,虽然
用户1269200
2018/06/22
4.9K0
Android Gradle知识梳理
Android Studio已经成为现在Android 开发的主要工具,在开发过程中学习使用gradle显得格外重要,本篇博客,我们一起学习gradle打包的一些知识。
老马的编程之旅
2022/06/22
7840
Android  Gradle知识梳理
gradle打包android (实现外部导入签名文件、多渠道打包、导入ant脚本)
       最近一直在做android自动打包,之前已经完成了用纯命令行的形式打包、原生态ant脚本打包,和基于android的SDK的打包,并且实现了多渠道打包,后来同事推荐了gradle,网上的资料说gradle各种好,自己也感兴趣是实现一下,其实一般来说由于android对eclipse的支持减弱,大部分的人都是用gradle与android studio融合,这样面的例子也会比较多,但笔者所在的项目还是在eclipse的比较多,由于开发人员在移植过程中发现报错比较多所以一直没有完全移植(好吧,其实早晚会移植),所以笔者是用eclipse的IDE做的实验,下面先贴几个基础知识
粲然忧生
2022/08/02
7910
配置统一的build.gradle
1、写一个.gradle配置文件 在Progject里面新建一个config.gradle文件,然后里面添加工程需要的配置。如图所示: 2、在Project的build.gradle里面添加配置 9B
code_horse
2018/07/02
4760
Android Studio 多渠道打
build.gradle实例: apply plugin: 'com.android.application' android { /** * 设置编译 sdk 和编译工具的版本 */ compileSdkVersion 19 buildToolsVersion "24.0.3" /** * 为所有的 build variants 设置默认的值. 关于 build variant, 我们后面会用一张图片说明 */ defau
霡霂
2018/06/04
5770
Gradle For Android(7)--创建Task以及Plugin
到目前为止,我们已经看到了很多Gradle构建的属性,并且知道了怎么去执行Tasks。这一章,会更多的了解这些属性,并且创建我们自己的Task。一旦知道如何自定义Task之后,就可以完成更多的事情,并且自定义自己的插件,而在多工程中使用这些Task和Plugin。
None_Ling
2018/10/24
2K0
Gradle For Android(7)--创建Task以及Plugin
Android Gradle必备基础知识
随着Google对Eclipse的无情抛弃以及Studio的不断壮大,Android开发者逐渐拜倒在Studio的石榴裙下。 而作为Studio的默认编译方式,Gradle已逐渐普及。我最开始是被它的多渠道打包所吸引。
xiangzhihong
2021/07/21
9490
studio多渠道打包
由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这事就简单了。 友盟多渠道打包 废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段: <meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID" /> 里面的 Channel_ID 就是渠道标示。我们的目标就是在编译的时
xiangzhihong
2018/01/30
7540
《Android群英传 神兵利器》读书笔记
这是一本Android开发的工具书,里面的提到的工具基本上是每个Android开发者必备的技能,买这本书的起因是看到有介绍Gradle和性能优化。里面提到的很多工具之前都是用过,所以看得很快,只care自己不熟知的,所以这篇读书笔记是对自己不熟的地方的整理和摘录。
Jingbin
2018/09/10
6060
相关推荐
Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验