Android Gradle配置分析

前言

Android 开发目前大家使用的IDE是Android Studio,所以和Gradle打交道就是必不可少的了。
大部分时间可能我们关注的都是业务代码的开发,然而了解gradle可以帮助我们更好的构建我们的项目

关于Gradle

Gradle是一个基于Apache AntApache Maven概念的项目自动化建构工具。它使用一种基于Groovy特定领域语言来声明项目设置,而不是传统的XML

这是维基百科上对Gradle的描述,可以了解到:

  • gradle 是个构建工具,不是一种语音。

gradle 构建使用到是 Groovy 语言。

Android项目中gradle配置

Android 工程中gradle配置文件有build.gradlesettings.gradlegradle-wrapper等如下图:

  • settings.gradle: 工程配置,多projrct项目中配置项目结构。 settings.gradle 配置文件在主工程中,文件中可以查看其他的配置project
  • build.gradle:project工程配置文件,配置工程依赖编译等信息

tip:

  1. 单project项目,只要一个build.gradle文件就OK了。 多projec项目需要由settings.gradle来配置多个build.gradle
  2. 查找 settings.gradle 的顺序是:当前目录 -> 兄弟目录 master -> ⽗目录
// `settings.gradle` 配置文件
include ':app'    
rootProject.name='Demo'

根目录下到gradle配置(Project: Demo)如下(配置的用途见注释):

//  主项目中build.gradle 配置文件
buildscript {
    ext.kotlin_version = '1.3.61'
   
    repositories {
        // 这里配置的是  下面 dependencies中配置的依赖的仓库地址 
        google()
        jcenter()
        
    }
    dependencies {
        // 这里的引入的依赖, 是为了使用  gradle 和 kotlin 的  plugin。 
        //  例如: apply plugin: 'com.android.application'  , apply plugin: 'kotlin-android'
        classpath 'com.android.tools.build:gradle:3.5.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        // 针对项目的仓库配置 , 每一个model 都使用这个仓库
        google()
        jcenter()
        
    }
}

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

app model 中build.gradle配置如下(用途见注释)

// 这里使用的 plugin ,需要在根目录下的gradle中配置引用 
apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.tencent.demo"
        minSdkVersion 17
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        // buildType 默认有 debug 和 release 两个, 也可以进行自定义扩充
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {

    // compile : 已经被废弃 
   // api:  是 compile 的替代用法, 会传递依赖
   // implementation : 不传递依赖。 
   //   传递依赖时,二级项目的改动会导致0级项目的重新编译; 不传递依赖时二级项目的改动不会导致0级项目的重新编译

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

tips:
buildTypesFlavor 的用法可以参考 Android 构建多APK

gradle 执行阶段分析

  • 初始化阶段:执⾏ settings.gradle,确定主 project 和子 project
  • 定义阶段: 执行每个 project 的 bulid.gradle,确定出所有 task 所组成的有向无环图
  • 执⾏阶段:按照上一阶段所确定出的有向⽆环图来执⾏指定的 task

gradle task 介绍

task 的写法如下:

task test() {
    print('初始化代码')
    doFirst {
        print('doFirst')
    }
    doLast {
        print('doLast')
    }
}

/*
* 1. doFirst() 和 doLast() 在 task 执行过程中被执⾏,在执行阶段(第三阶段)执行,如果用户没有直接或者间接执行task,那这部分的代码块就不会执行
* 2. 初始化代码,在task创建的时候就会被执行,是在定义阶段(第二阶段)执行
* 3. doFirst()  是插入在队列的前面,doLast()是插入到队列的后面
*/
 

task clean(type: Delete) {
    delete rootProject.buildDir
   // tasks["nameA"].dependsOn nameB
}

/*
*  1.  task 可以使用 task taskA(dependsOn: b) 的形式来指定依赖。
*  2.  tasks["nameA"].dependsOn nameB 也可以使用这种方式指定依赖关系
*  3. 指定依赖后,task 会在⾃己执⾏前先执⾏⾃己依赖的 task
*/


android 中可以使用如下命令执行task

 $ ./gradlew assembleDebug

BUILD SUCCESSFUL in 5s
25 actionable tasks: 3 executed, 22 up-to-date
  • 在第一二之间插入相关修改
// 修改写入settings.gradle 最后。 
  • 在第二三之间插入相关修改
 afterEvaluate { 
      // 插⼊入代码
}
例如修改apk名称:

app build.gradle 种写法:
android.applicationVariants.all {
    variant ->
        variant.outputs.all {
            //在这里修改apk文件名
            outputFileName = "${variant.name}-v${variant.versionName}.apk"
        }
}

// 自定义文件种实现方法 
project.afterEvaluate {
    android.applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def buildNoSuffix = System.env.BuildNo ? ".${System.env.BuildNo}" : ".0"
            //重命名为
            def releaseApkName = "${variant.name.capitalize()}_${variant.mergedFlavor.versionName}${buildNoSuffix}.apk"
            println "releaseApkName: " + releaseApkName + ", buildNoSuffix:" + buildNoSuffix
            outputFileName = releaseApkName
        }
    }
}


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

推荐阅读更多精彩内容