gradle 常用知识点总结

一、全局设置

如果有很多项目,可以设置全局来统一管理版本号或依赖库,【项目的根目录】下build.gradle下:

ext {
    compileSdkVersion = 23
    buildToolsVersion = "23.0.2"
    minSdkVersion = 14
    targetSdkVersion = 23
}

app/build.gradle

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        applicationId "com.example.android"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
    }

}

 

二、添加新的module或者library

在setting.gradle中include 

include ':app', ':myfirstlib'  #如果是一行,使用逗号分割
include ':mysecondlib'

 

三、默认buildType扩展

android项目中,默认提供了三种类型,all、debug和release

  buildTypes {
        all{
            buildConfigField "String", "AppType", "\"Test\""  //自定义字段,在BuildConfig中生成
        }
        debug{
            buildConfigField "boolean", "IS_DEBUG", "true"
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        release {
            buildConfigField "boolean", "IS_DEBUG", "false"
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

如果想扩展buildType,需要使用initWith(默认的类型),注意,一般情况下initWith的参数不推荐all

buildTypes {
        all{
            buildConfigField "String", "AppType", "\"Test\""
        }
        debug{
            buildConfigField "boolean", "IS_DEBUG", "true"
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        release {
            buildConfigField "boolean", "IS_DEBUG", "false"
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        myprojectDebug.initWith(debug)
        myprojectDebug{
            buildConfigField "String", "name", "myproject"
        }
         myprojectRelease.initWith(release)
         myprojectRelease{
            buildConfigField "String", "name", "myproject"
        }
    }

注意:主项目扩展buildType类型,意味着库项目也需要配置,对于存在多个库项目的情况下,我们推荐使用productFlavors来处理,可以达到同样的效果。

注意:buildType配置的渠道权重高于productFlavors,一切在productFlavors中配置的项都能被buildType中的配置项覆盖,比如buildConfigField,只要在all\debug\release中出现,那么productFlavors重的buildConfigField会被覆盖

四、manifestPlaceholders动态修改和覆盖

manifestPlaceholders +=  [key:value,...]

 buildTypes {
        all{
            buildConfigField "String", "AppType", "\"Test\""
            manifestPlaceholders = [
                    "APP_NAME":"\"测试\"",
                    "APP_VERSION":"210"

            ]
        }
        debug{
            manifestPlaceholders += ["APP_NAME":"\"测试1\""];
            buildConfigField "boolean", "IS_DEBUG", "true"
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        release {
            manifestPlaceholders += ["APP_NAME":"\"正式版\""];
            buildConfigField "boolean", "IS_DEBUG", "false"
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }


    }

 

五、自定义字段

buildConfigField FIELD_TYPE,FIELD_NAME, VALUE 

buildConfigField "String", "AppType", "\"Test\""  //自定义字段,在BuildConfig中生成

 

六、渠道定义

渠道定义存在维度,一个项目可以有多个维度,每个维度可以存在多个渠道

flavorDimensions "channel"  //维度

productFlavors {

        xiaomi {
            dimension "channel"  //告诉gradle,该渠道所属的维度
            buildConfigField "String", "channel", "\"xiaomi\""
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
        qihoo360 {
            dimension "channel"
            buildConfigField "String", "channel", "\"qihoo360\""
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qihoo360"]
        }
        baidu {
            dimension "channel"
            buildConfigField "String", "channel", "\"baidu\""
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
        }

    }

七、apk签名定义和使用

android {
    signingConfigs {
        config {
            keyAlias 'yiba'
            keyPassword '123456'
            storeFile file('C:/work/Key.jks')
            storePassword '1234567'
        }
    }
 
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
    }
}

签名的定义还可以根据buildType和flavor自行分类,具体参考gradle官网。

八、通过gradle.properties实现常量定义

我们通过ext可以定义常量,此外gradle.properties也是一种可行的办法

# Project-wide Gradle settings.
#添加ndk支持(按需添加)
android.useDeprecatedNdk=true
# 应用版本名称
VERSION_NAME=1.0.0
# 应用版本号
VERSION_CODE=100
# 支持库版本
SUPPORT_LIBRARY=24.2.1
# MIN_SDK_VERSION
ANDROID_BUILD_MIN_SDK_VERSION=14
# TARGET_SDK_VERSION
ANDROID_BUILD_TARGET_SDK_VERSION=24
# BUILD_SDK_VERSION
ANDROID_BUILD_SDK_VERSION=24
# BUILD_TOOLS_VERSION
ANDROID_BUILD_TOOLS_VERSION=24.0.3

这时候配置app和lib的build.gradle可以这样写:

android {
    compileSdkVersion project.ANDROID_BUILD_SDK_VERSION as int
    buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
 
    defaultConfig {
        applicationId project.APPLICATION_ID // lib项目不需要配置这一项
        versionCode project.VERSION_CODE as int
        versionName project.VERSION_NAME
        minSdkVersion project.ANDROID_BUILD_MIN_SDK_VERSION as int
        targetSdkVersion project.ANDROID_BUILD_TARGET_SDK_VERSION as int
    }
}
 
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    //这里注意是双引号
    compile "com.android.support:appcompat-v7:${SUPPORT_LIBRARY}"
    compile "com.android.support:design:${SUPPORT_LIBRARY}"
    compile "com.android.support:recyclerview-v7:${SUPPORT_LIBRARY}"
    compile "com.android.support:support-annotations:${SUPPORT_LIBRARY}"
    compile "com.android.support:cardview-v7:${SUPPORT_LIBRARY}"
    compile "com.android.support:support-v4:${SUPPORT_LIBRARY}"
}

九、忽略lint检测导致编译终止

android {

  lintOptions {
      abortOnError false
  }

}

十、resConfigs过滤语言

android {

    defaultConfig {
        applicationId "com.yiba.sharewe.lite.activity"
        minSdkVersion 14
        targetSdkVersion 24
        versionCode 46
        versionName "1.74"
        resConfigs 'en', 'zh-rCN' ,'es'  //本次打包,只把 en(英文)、zh-rCN(中文简体)、es(西班牙语)打进保内,其他语言忽略
    }
}

十一、差异化依赖

dependencies {

 //打 debug 包
 debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1'

 //打 release 包
 releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'

}

十二、定义多个源码目录

android {

    sourceSets {
        main {
            java {
                srcDir 'src/test1' //指定 test1 为源码目录
                srcDir 'src/test2' //指定 test2 为源码目录
                srcDir 'src/test3' //指定 test3 为源码目录
            }
        }
    }
}

 

十二、定义 APK 包的名字

android {

    defaultConfig {
        applicationId "android.plugin"
        minSdkVersion 14
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    //定义渠道
    productFlavors {
        xiaomi {
            //小米
        }
        wandoujia {
            // 豌豆荚
        }
    }

    //打包命名
    applicationVariants.all {
        variant ->
            variant.outputs.each {
                output ->

                    //定义一个新的apk 名字。
                    // 新名字 = app 名字+ 渠道号 + 构建类型 + 版本号 + 当前构建时间
                    def apkName = "appName_${variant.flavorName}_${buildType.name}_v${variant.versionName}_${getTime()}.apk";
                    output.outputFile = new File(output.outputFile.parent, apkName);
            }
    }

}

//获取当前时间
def getTime() {
    String today = new Date().format('YY年MM月dd日HH时mm分')  //gradle支持java语法
    return today
}

十三、buildTypes常用属性

name:build type的名字

applicationIdSuffix:应用id后缀

versionNameSuffix:版本名称后缀

debuggable:是否生成一个debug的apk

minifyEnabled:是否混淆

proguardFiles:混淆文件

signingConfig:签名配置

manifestPlaceholders:清单占位符

shrinkResources:是否去除未利用的资源,默认false,表示不去除。

zipAlignEnable:是否使用zipalign工具压缩。

multiDexEnabled:是否拆成多个Dex

multiDexKeepFile:指定文本文件编译进主Dex文件中

multiDexKeepProguard:指定混淆文件编译进主Dex文件中

十四、jni和aidl支持

android {

    sourceSets {
        main {
            jniLibs.srcDirs  //定义 jni 目录
            aidl.srcDirs  //定义 aidl 目录
        }
    }
}

十五、定义变量

def map=['key1':1,'key2':2]
def isDEBUG = true

 

十六、依赖排除

//排除哪个jar的依赖
compile('org.spring-core:3.6.3.Final'){
    //指定要排除的依赖的group和module=name,不指定版本,默认排除最低版本
    exclude group:'org.slf4j',module:'slf4j-api'
    //transitive=false//排除所有传递性依赖,比较少用
}

 

十七、策略

gradle提供了configurations,可以对各种渠道(包括自定义渠道)和各种类型(包括最定义buildType)设置策略

configurations.all{  
    resolutionStrategy{
        failOnVersionConflict()
    }
}

//all表示所有构建类型,当然,如果你自定义了如baiduDebug,那么你可以单独为此类型做策略设置
configurations.baiduDebug{  
    resolutionStrategy{
        failOnVersionConflict()
    }
}

 

十八、构建过程生命周期监听



//自定义的log输出
class CustomEventLogger implements BuildListener, TaskExecutionListener {
    @Override
    void buildStarted(Gradle gradle) {
        println "buildStarted"
    }

    @Override
    void settingsEvaluated(Settings settings) {
        println "settingsEvaluated"
    }

    @Override
    void projectsLoaded(Gradle gradle) {
        println "projectsLoaded"
    }

    @Override
    void projectsEvaluated(Gradle gradle) {
        println "projectsEvaluated"
    }

    public void beforeExecute(Task task) {
        println "beforeExecute:[$task.name]"
    }

    public void afterExecute(Task task, TaskState state) {
        println "afterExecute:[$task.name]"
    }

    public void buildFinished(BuildResult result) {
        println 'buildFinished'
        if (result.failure != null) {
            result.failure.printStackTrace()
        }
    }
}

使用方法

方法1
gradle.useLogger(new CustomEventLogger()) 
方法2
gradle.addBuildListener(new CustomEventLogger())

 

此外,还有一种监听配置方式

/**
 * 同上BuildListener和ProjectEvaluationListener
 */
gradle.buildStarted {
    gradle.println "=========buildStarted========="
}
gradle.settingsEvaluated {
    gradle.println "=========settingsEvaluated========="
}
gradle.projectsLoaded {
    gradle.println "=========projectsLoaded========="
}
gradle.projectsEvaluated {
    gradle.println "=========projectsEvaluated========="
}
gradle.buildFinished {
    gradle.println "=========buildFinished========="
}
gradle.beforeProject {
    gradle.println "=========beforeProject========="
}
gradle.afterProject {
    gradle.println "=========afterProject========="
}

参考:https://www.cnblogs.com/duex/p/9205155.html

十九、task及task生命周期

task定义

//定义任务1
task task1{
    println 'task1'
}

//定义任务2
task task2{
    println 'task2'
}

//通过create创建任务3
tasks.create(name: 'hello4') {
   println 'hello4'
}

//通过注解和参数注入实现复杂功能,任务4

//局部自定义Task
//直接在build.gradle中自定义Task
//但是也只能在当前module中引用
class TestCustomTask extends DefaultTask {
    //@Optional,表示在配置该Task时,message是可选的。
    @Optional
    String message = 'I am jjx'
    //@TaskAction表示该Task要执行的动作,即在调用该Task时,hello()方法将被执行
    @TaskAction
    def hello() {
        println "hello world $message"
    }
}

//hello使用了默认的message值
task hello(type: TestCustomTask)

//重新设置了message的值
task helloOne(type: TestCustomTask) {
    message = "I am a android developer"
}

task依赖

方法1
task2.dependsOn task1
方法2
task hello5(dependsOn:hello4) {
    println 'hello5'
}

task生命周期

task testTask {

    println 'testTask << print'

    // 表示在task最前面来执行的过程
    doFirst {
        println 'testTask do first'
    }
    // << 和 doLast表示对当前task追加执行过程,效果是一样的
    doLast{
        println 'testTask do last!'
    }

    afterEvaluate {  //在配置读取阶段执行,总在doFirst之前
        println  '---->afterEvaluate'
    }
}

参考:https://www.jianshu.com/p/ed4ef3b96a29

 

转载于:https://my.oschina.net/ososchina/blog/2993815

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值