gradle(1)-基础

gradle 编程框架的组成:groovy核心语法 ,build script block,gradle api.

gradle的生命周期:

->1.Initialization初始化阶段(解析真个工程中所有project,构建所有的project对应的project对象)
->2.Configuration配置阶段(解析所有的projects对象中的task,构建好所有task的拓扑图)
->3.Execution执行阶段(执行具体的task及其依赖task)

gradle执行流程监听:

/**

  • 配置阶段开始前的监听回调
    /
    this.beforeEvaluate {}
    /
    *
  • 配置阶段完成以后的回调
    /
    this.afterEvaluate {}
    /
    *
  • gradle 执行完毕以后的监听
    /
    this.gradle.buildFinished {}
    //第二组监听
    /
    *
    等同于beforeEvaluate
    /
    this.gradle.beforeProject {}
    /

    *等同于afterEvaluate.完毕的监听也是通过buildFinised
    */
    this.gradle.afterProject {}

gradle Project详解:

project是gradle构建程序的入口.对于gradle 来说项目和module和lib库等都是一个project,每个project都有一个build.gradle 文件.
只有有build.gradle文件的文件夹才是project.
根project的project作用是管理子project,rootProject中的dependencies引入的是项目build的依赖(是groovy代码)以插件的形式,引入后可以在子project中
调用,子project的dependencies引入的自己项目代码中使用的第三方库(是java代码)
子project的作用是一个子project对应一个输出.Android中module的对应的是输出一个app,lib对应输出的是aar的生成.
java项目中每个project对应是每个jar包的生成.网站项目中一个project对应输出一个war.

project api的组成包括:gadlew生命周期api,project相关api,task相关api,属性相关api,file相关api和其他api.

1.>project相关api:是让当前project拥有操作父project和管理子project的能力.
2.>task相关api:为当前project新增task及使用使用当前project中已有task的能力.
3.>属性相关api:project本身的gradle提供了一些属性,属性api拥有让我们为project添加额外属性的能力.
4.>project下file相关api:project下file相关api提供用来操作当前project下文件的作用.
5.>gradle声明周期的api:提供回调来进行监听等操作.
6.>其他api:例如为project添加依赖,添加配置以及如何引入一些外部文件等等.
每个project中都包含一个build.gradle文件,build.gradle 文件都会被编译为一个project字节码.所以在build.gradle文件,就相当于在一个project类,在build.gradle中写代码就相当于在project类中写代码.

project方法介绍:

//获取子project

this.getSubprojects().eachWithIndex { Project entry, int i ->

println("----getSubprojects:project----- ': ${entry.name}'")

}

//获取所有的project

this.getAllprojects()

//获取父project

this.getParent().name//name属性获取project的name

//获取rootproject

this.getRootProject()
/**

  • 配置当前节点工程和所有子工程.
    /
    allprojects {
    group 'com.hexindai.com'//配置公共方法
    version '1.0.0-release'//配置公共方法
    repositories {
    google()
    jcenter()
    }
    }
    /
    *

  • 不包括当前节点工程,只包含子工程.

  • 如果不是所有的字工程都需要,可以建一个单独的gradle,谁使用谁apply 调用.
    /
    subprojects{
    //上传到maven仓库,apk不需要上传到maven
    //判断是否是库工程
    if(project.plugins.hasPlugin('com.android.library')){
    apply from:'../publishToMaven.gradle'
    }
    }
    /
    *

  • project api,在rootproject中配置制定子project,但是没必要,模块化各自干各自的活.
    /
    /

    project('app'){Project project->
    apply plugin: 'com.android.application'
    group 'com.hexindai.hxd'
    version '1.0.0.0'

    android {
    compileSdkVersion 26
    compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
    }
    defaultConfig {
    applicationId "com.oahcil.lichao.duyaxing"
    minSdkVersion 15
    targetSdkVersion 26
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    multiDexEnabled true
    }
    buildTypes {
    release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    }

    }
    dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.android.support:design:26.0.0'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    testCompile 'junit:junit:4.12'
    compile 'com.jakewharton:butterknife:8.4.0'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
    compile 'com.apkfuns.logutils:library:1.4.2'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
    compile 'com.squareup.okhttp3:logging-interceptor:3.0.0-RC1'
    compile 'io.reactivex.rxjava2:rxjava:2.0.7'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
    compile 'com.trello.rxlifecycle2:rxlifecycle:2.0.1'
    compile 'com.trello.rxlifecycle2:rxlifecycle-components:2.0.1'
    compile 'com.jiongbull:jlog:1.0.5'
    compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.3@aar'

    }
    }*/

project属性:

1:DEFAULT_BUILD_FILE='build.gradle'//默认每个project的生成文件是build.gradle
2:PATH_SEPARATOR=":"//路径分隔符是":",区别于一般路径分隔符是""
3:DEFAULT_BUILD_DIR_NAME="build"//默认所有输出文件的文件夹是build
4:GRADLE_PROPERTIES="gradle.properties"//默认gradle的配置文件是gradle.properties

project扩展属性:

1.->

/**

  • build.gradle中存在许多模糊的int,string版本和引用相同的库的路径和版本,造成可读性不好,管理不好.
  • 所以我们就可以在根project中为所有子project进行配置.当然如果是某个子project单独使用的,
  • 就在子project中单独定义变量,或者配置扩展属性的方式.
  • 在根project中配置扩展属性.
  • 此种方式缺点是:在此配置,最终还是会在每个子project中配置一边.
    */
    subprojects{
    ext{
    complieSdkVersion=26
    libAndroidDesign='com.android.support:design:26.0.0'
    }
    }

2.>

/**

  • 进阶的方式,在根project中直接配置ext扩展属性
  • 调用时即可以指定rootProject(this.rootProject.complieSdkVersion)
  • 也可以直接调用this.complieSdkVersion(因为继承)
    */
    ext{
    complieSdkVersion=26
    libAndroidDesign='com.android.support:design:26.0.0'
    }

3.>

/**

  • 终极方式.在根目录下创建一个通用的common.gradle,通过apply引入
    */
    ext{
    android=[
    compileSdkVersion :26,
    buildToolsVersion :'26.0.0',
    applicationId :'com.hexinda.hxd',
    targetSdkVersion:26,
    versionCode :1,
    versionName:'1.0.0',
    multiDexEnabled:true,
    manifestPlaceholders:[UMENG_CHANNEL_VALUE:'unknown']
    ]
    signConfigs=[
    'storeFile':'hexindai.keystore',
    'storePassword':'liwswswws',
    'keyAlias':'lich',
    'keyPassword' :'hexindaiwswswws'
    ]
    }
    然后在根project中引入:apply from:this.file('common.gradle'),然后在所有的子project中使用
    android {
    compileSdkVersion rootProject.ext.android.complieSdkVersion
    defaultConfig {
    applicationId rootProject.ext.android.applicationId
    minSdkVersion rootProject.ext.android.compileSdkVersion
    targetSdkVersion rootProject.ext.android.targetSdkVersion
    versionCode rootProject.ext.android.versionCode
    versionName rootProject.ext.android.versionName
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    multiDexEnabled rootProject.ext.android.multiDexEnabled
    }
    signingConfigs {
    release {
    storeFile file(rootProject.ext.android.signConfigs.storeFile)
    storePassword rootProject.ext.android.signConfigs.storePassword
    keyAlias rootProject.ext.android.signConfigs.keyAlias
    keyPassword rootProject.ext.android.signConfigs.keyPassword
    }
    }
    buildTypes {
    release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容