Android项目中的build.gradle文件

文 | 莫若吻


一、gradle简介

gradle是基于groovy语言的。

Android Studio是采用Gradle来构建项目的。Gradle是一个非常先进的项目构建工具,使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置,摒弃了XML(如Ant和Maven)的各种烦琐配置。

Note:若只是用它构建普通的工程,可以不去学groovy语言;若想深入的做一下自定义的构建插件,可以考虑学groovy,因为groovy语言是基于java语言的,所以有java基础的同学学习groovy语言不会很难。

二、build.gradle文件

1.Android项目中的gradle文件位置:

在一个android项目中一般会出现至少2个build.gradle文件,一个是project的gradle文件,一个是module的gradle文件。
Note:如果项目目录结构切换到Android模式下则全部gradle在Gradle Scripts下。

2.gradle文件内的常用代码释义:

1)jcenter():
代码托管库,设置后可以在项目中引用jcenter上的开源项目。声明在repositories闭包中。
很多的Android开源项目都会选择将代码托管到jcenter上,声明了此行配置后,就可以在项目中轻松使用jcenter上的任何开源项目。
2)声明gradle插件及版本号

classpath 'com.android.tools.build:gradle:2.3.3'

3)apply plugin:
代表着应用一个插件。
eg:

//表示一个应用程序模块。
apply plugin: 'com.android.application'
// 表示是一个库模块
apply plugin: 'com.android.library'

Note:
com.android.application 是代表可以直接运行的应用程序;
com.android.library 是只能作为代码依附在别的应用程序模块来运行。所以在引入一些Model为自己的应用程序所用时,build.gradle文件的第一行就是apply plugin:'com.android.library'。

4)android闭包:
compileSdkVersion: 用于指定项目的编译版本。
buildToolsVersion: 用于指定项目的构建工具的版本。

applicationId: 用于指定项目的包名,在创建项目的时候已经指定了包名,当要修改整个项目的包名时可以在此更改。
minSdkVersion: 项目最低的兼容版本。后面的数字(eg:15)表示兼容到API 15
targetSdkVersion:
表示你在该目标版本上已经做过了充分的测试,系统将为你的应用开启一些最新的功能和特性。
假如targetSdkVersion 为23或者更高,那么在Android6.0中运行这个应用时会开启新的功能和特性;若设置成了22,只能说明你的应用程序在Android5.1系统上做过了充分的测试,Android6.0的新功能就不会启用。
versionCode: 项目的版本号。
versionName: 项目版本号的版本名。

Note:
在以前eclipse开发中设置上述代码都是在AndroidManifest.xml文件中设置的。

<uses-sdk
    android:minSdkVersion="15"
    android:targetSdkVersion="23" />

而在使用Android Studio开发时,即使在AndroidManifest.xml设置也无作用,运行时只对build.gradle下的设置有效。

5)android闭包中的buildTypes闭包:
一般其中会有两个闭包,一个是debug,一个release;当然也可以有其他闭包。用于安装文件的环境变量的配置。
debug闭包用于生成测试版安装文件的配置,release闭包用于生成正式版安装文件的配置。可以只设置一个release闭包。

minifyEnabled:用于设置是否对项目的代码进行混淆。true代表开启,false代表关闭。
proguardFiles:指定混淆时使用的文件。
proguard-android.txt:在Android SDK 目录下的,里面是所有项目通用的混淆规则。
proguard-rules.pro:是在当前项目根目录下的,里面编写当前项目特有的混淆规则。

6)dependencies闭包:
可以在其中指定当前项目所有的依赖关系。
一般Android Studio 项目中一共有三种依赖方式:本地依赖、库依赖和远程依赖。
本地依赖可以对本地的Jar包或目录添加依赖关系
库依赖可以对项目中的库模块添加依赖关系。
远程依赖则可以对jcenter库上的开源项目添加依赖关系。

库依赖的基本格式为 compile project,后面加上依赖库的库名称。
远程依赖的基本格式为 compile ,后面加上远程依赖库的库名称;Gradle在构建项目的时候会检查一下本地仓库是否已经缓存了指定内容,若没有会自动联网下载,然后再添加到项目的构建路径中去。
远程依赖时每次都要检查是否有这个缓存,所以使编译变的很慢。可以设置成离线的Gradle模式。

eg:

   //本地依赖声明
    compile fileTree(include: ['*.jar'], dir: 'libs')
   //库依赖声明
    compile project(':library_pulltorefresh')
    //远程依赖声明
    compile 'com.android.support:appcompat-v7:25.3.1'

Note:
Android Studio 3.0以上的开发工具版本,api 替代了 compile
eg:

   //本地依赖声明
    api fileTree(include: ['*.jar'], dir: 'libs')
   //库依赖声明
    api project(':library_pulltorefresh')
    //远程依赖声明
    api 'com.android.support:appcompat-v7:25.3.1'

3.示例代码:

(注:下面的代码只是部分的示例代码,要根据项目开发实际情况选择性地使用代码)
project的build.gradle文件:
eg:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {//闭包
        jcenter()//代码托管库,设置后可以在项目中引用jcenter上的开源项目
    }
    dependencies {
        //声明gradle插件及版本号
        classpath 'com.android.tools.build:gradle:2.3.3'

        //butterknife的新版插件必须在此处作配置
        classpath 'com.jakewharton:butterknife-gradle-plugin:8.8.1'

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

module的build.gradle文件:
eg:

apply plugin: 'com.android.application'//默认的应用程序模块(插件)
apply plugin: 'com.jakewharton.butterknife'//butterkinfe插件

android {
    compileSdkVersion cfg.compileVersion   //编译版本
    buildToolsVersion cfg.buildToolsVersion  //构建工具版本
    aaptOptions.cruncherEnabled = false
    aaptOptions.useNewCruncher = false


    defaultConfig {
        applicationId "com.zrmx.athenaapp"  //包名
        minSdkVersion cfg.minSdk   //最低兼容版本
        targetSdkVersion cfg.targetSdk  //(目标版本:充分测试过版本(建议版本))大于22需要考虑存储权限问题,由于默认权限是关闭的,启动时下载广告图片缓存不了
        versionCode project.VERSION_CODE as int    //版本号
        versionName project.VERSION_NAME   //版本名称

        jackOptions {
            enabled true
        }
    }
    lintOptions {//设置编译的lint开关,程序在buid的时候,会执行lint检查,有任何的错误或者警告提示,都会终止构建
        abortOnError false
    }
    
    buildTypes {
       
        release {
            minifyEnabled false   //是否混淆(true为混淆)
            
            //Android SDK通用的混淆规则; 后面的为开发者编写的项目混淆规则
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            buildConfigField("int", "SERVICE_TYPE", "4")//线上环境
            signingConfig signingConfigs.release
        }
    }
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk') && !outputFile.name.contains("debug")) {
                output.outputFile = new File(APK_OUT_PATH + "/${variant.buildType.name}", "${releaseTime()}_v${defaultConfig.versionName}_c${defaultConfig.versionCode}.apk")
            }
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    //本地依赖声明
    compile fileTree(include: ['*.jar'], dir: 'libs')

   //库依赖声明
    compile project(':library_pulltorefresh')

    //远程依赖声明
    compile 'com.android.support:appcompat-v7:25.3.1'
    testCompile 'junit:junit:4.12'
    compile 'com.squareup.okhttp3:okhttp:3.3.1'
    compile 'com.google.code.gson:gson:2.5'
    compile files('libs/universal-image-loader-1.9.2-SNAPSHOT-with-sources.jar')
    compile 'org.greenrobot:eventbus:3.0.0'

    compile 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'

    //android 6.0 新增加了运行时的动态添加权限
    compile 'com.lovedise:permissiongen:0.0.6'
}

三、Gradle 解析大全

具体Gradle 原理及相关语法详解请参考文章:
《Android:Gradle 解析》


版权声明:本文为博主原创文章,转载请注明出处,谢谢!

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,568评论 25 707
  • https://www.jianshu.com/p/7c288a17cda8 总的来说,Android的系统体系结...
    燕京博士阅读 1,148评论 0 6
  • 前言 为什么需要学Gradle? Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之...
    真笨笨鱼阅读 1,459评论 0 0
  • 似百灵轻歌, 溶入我崭新的生活。 象优美乐章, 唤起我神迷的思索。 嚓嚓嚓,嚓嚓嚓, 是沙轮迸发的火花在周身闪烁。...
    黄晓红阅读 450评论 3 1
  • 如果公司开发核心代码的开发人员开发一个功能代码库,不可能保证写的过程中一点问题都没有, 都需要做测试 那么我们怎么...
    coder_hong阅读 1,737评论 0 0