build.gradle文件使用

导读
<a name="label">1、初识build.gradle</a>
<a name="label">2、使用build.gradle文件</a>
<a name="label">3、settings.gradle文件</a>
(ps:由于Markdown在简书里对锚点的支持效果不是很好,就没设置跳转)

一、初识build.gradle

在一个标准的AS工程中,最少都会有两个build.gradle文件,其一在项目的根目录,而另一个在module的根目录里面。如下图:

build.gradle文件

我们先来理了解下两个build.gradle文件的区别?

AS的工程结构其实可以理解为就是由module组成,但是只运行有一个主module作为我们实际运行的项目,其他module都是以依赖module形式存在,如上图中所示:就仅有module——app,并且是我们当前Demo的主module。AS中,每一个module都必须会有一个属于自己的build.gradle文件<br />
主module:有个手机图片标识<br />
依赖module:有个类似列表柱状图片标识<br >


主module和依赖module

了解了module后,回到我们问题,其实就很好理解两个build.gradle文件的区别了<br />

工程根目录的build.gradle文件

项目构建时,会先找到该文件执行构建,里面的配置对整个工程全局有效,我们可以在这里做些全局性的配置,在创建一个新AS工程时,会默认创建该文件,并且添加相关默认配置,如:gralde插件,jcenter仓库,maven仓库。当然也可以在这里自定义一些全局的设置,后面我们会提到<br >

module的build.gradle文件

构建具体到每一个module时,会执行该文件,里面的配置仅对当前module生效。在创建一个新module时,也会默认创建该文件,并且添加相关默认配置,如我们Demo中主module app的build.gradle文件:

apply plugin: 'com.android.application'//声明主module,com.android.application

android {//android工程配置
compileSdkVersion 25  //编译sdk版本号
buildToolsVersion "25.0.2"//编译工具版本
defaultConfig {//工程默认配置
    applicationId "com.example.myapplication"//程序运行时真正的包名,可以与java中包名不同
    minSdkVersion 15//最小sdk版本号
    targetSdkVersion 25//目标sdk版本号
    versionCode 1//应用程序的版本号,以这里修改为准,manifest文件中配置无效
    versionName "1.0"//应用程序的版本名,以这里修改为准,manifest文件中配置无效

}
buildTypes {//运行方式配置,可以配置debug,release或者其他自定义
    release {//release运行方式执行的配置
        minifyEnabled false //混淆开关
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆文件
    }
}
}

dependencies {//依赖配置
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}

二、使用build.gradle文件

清楚了两种build.gradle文件的区别后,那么我们就可以进行些我们自定义的配置了;假想下这么一种场景,自己的工程如果有好几个module,而每一个module都会有自己的build.gradle文件,因为是android工程,所以都会存在compileSdkVersionbuildToolsVersion等一些默认配置,有时候自己项目中明明是配置ok了,而且一直编译没有问题,或许突然某一天,其他同时把他自己环境的一些配置提交上来了,那么可能就会出现原来好好的可以跑,突然就报错勒,当然这解决起来也非常简单,会说了,我把他改回来不就好了。但是我们能不能通过一些简单配置,这种问题尽可能的减少出现呢?<br />

1.使用根目录build.gradle文件,配置共有的属性

build.gradle文件代码,ext里面就是我们自定义的一些配置

buildscript {
repositories {
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle:2.3.0'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
}

ext {
compileSdkVersion=25
buildToolsVersion="25.0.2"
minSdkVersion=14
targetSdkVersion=25
versionCode=1
versionName="1.0"
}

allprojects {
repositories {
    jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

使用代码:

compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion 

defaultConfig {
    applicationId "com.example.myapplication"
    minSdkVersion rootProject.ext.minSdkVersion
    targetSdkVersion rootProject.ext.targetSdkVersion
    versionCode rootProject.ext.versionCode
    versionName rootProject.ext.versionName
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

2.自动使用签名配置

在主module的build.gradle文件的android区域里面添加如下代码,下面配置中,debug和release都配置了同一签名

    signingConfigs {

    debugConfig {
        keyAlias 'debug'
        keyPassword '123456'
        storeFile file('/debug.keystore')
        storePassword '123456'
    }
    releaseConfig {
        keyAlias 'debug'
        keyPassword '123456'
        storeFile file('/debug.keystore')
        storePassword '123456'
    }
}

3.快速区分调试环境和生产环境

上面仅仅配置好了签名信息,运行起来实际上仍然是没效果的,这是因为我们还需要在运行类型配置上进行添加相关配置才能生效,同样的也是在主module的build.gradle文件中进行添加代码,添加区域在buildTypes里面

buildTypes {
    //调试环境
    debug {
        buildConfigField "boolean", "isDebug", "true"//debug标识,方便项目里面一些只在debug模式下生效代码做区分标识
        buildConfigField "String", "HOST", '"https://www.baidu.com/"'//项目里面,测试服务器地址
        resValue "string", "app_name", "**测试版"//配置了该属性,需要在values中strings.xml里面把app_name删掉,否则编译会报错,测试版本的APK名字,以区分正式测试不同版本

        //混淆
        minifyEnabled false

        //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        signingConfig signingConfigs.debugConfig//使用上面签名配置中的debugConfig配置

        applicationIdSuffix'.debug'//区分debug版本的包名,会自动在正式包名后面带上.debug,方便测试服务器版本和正式服务器版本APK同时安装
    }
    //发布环境
    release {
        buildConfigField "boolean", "isDebug", "true"
        buildConfigField "String", "HOST", '"http://www.jianshu.com/"'//项目里面,正式服务器地址
        resValue "string", "app_name", "*****"//配置了该属性,需要在values中strings.xml里面把app_name删掉,否则编译会报错,正式版本的APK名字,以区分正式测试不同版本

        //混淆
        minifyEnabled true

        //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆配置文件
        signingConfig signingConfigs.releaseConfig//使用上面签名配置中的releaseConfig配置
    }
}
app_name的特殊处理

当我们配置了app_name时,需要去values中找到strings.xml文件,把里面的app_name删除掉,否则编译项目会报如下错误,解决方案就是删除strings.xml里面的app_name后重新构建下就好了


有些配置我们该如何在项目代码中使用呢?<br />

比如测试正式服务器地址,debug标识状态,我们该如何使用呢。首先任何一个build.gradle修改了,都要重新构建下才能生效。构建完成后,我们就可以直接通过BuildConfig.配置的属性名,进行使用了,例如上述中的HOST:BuildConfig.HOST就可以取出我们上边配置的url勒。<br />

配置了两个,具体什么时候取哪个呢?

这个具体取决于你运行程序时AS里Build Variant设置了,点开该设置,找到我们的主module,根据下图我们可以看到默认是debug配置,此时我们如果需要使用release的配置时,只需要在此处进行切换就好了


4.自动按规范更改打包命名

在主module的build.gradle文件里,添加区域为android{}

  applicationVariants.all { variant ->

    variant.outputs.each { output ->

        output.outputFile = new File(

                output.outputFile.parent,

                "demo-${variant.buildType.name}-${defaultConfig.versionName}.apk")//打包的命名为:demo-debug-1.0.apk(debug配置下)
                                                                                    //        demo-release-1.0.apk(release配置下)

    }

}

三、settings.gradle文件

这个文件里面所配置的是我们项目module信息,如果新导入进来的module无法进行添加依赖,那么需要检查一下,在该文件中是否有添加该module,添加语法:

include ':app'//当前Demo因为只有一个app主module,所以就在打开该文件只能看到这一条配置,如果需要添加其他module,直接把app替换成module名即可
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,043评论 25 707
  • 转载注明出处:http://www.jianshu.com/p/5255b100930e 0. 前言 完全由个人翻...
    王三的猫阿德阅读 2,483评论 0 4
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,678评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,490评论 18 139
  • 这是第一次读哈耶克,但相信不会是最后一次。哈耶克著作等身,直接选择读《致命的自负》可能不是一个好的选择,没有...
    kelinda阅读 273评论 0 4