android stduio gradle参数配置说明

主要用于小白扫盲和个人巩固学习使用

以下就是一个项目中build.gradle常用的配置参数
当中基本都已经注释包含的意义,现在我们来对他们一个个进行分解

//当前项目类型为library类型
apply plugin: 'com.android.library'

// 加载配置文件
final Properties properties = new Properties()
InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream()
properties.load(inputStream)

android {

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

    defaultConfig {
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode rootProject.ext.appVersionCode
        versionName rootProject.ext.appVersionName
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        buildConfigField 'String', 'LOGIN_URL', 'API_BASE_URL + "/page/toLogin"'
        buildConfigField 'String', 'API_BASE_URL', '"http://127.0.0.1:12206/"' 
        buildConfigField 'String', 'UMENT_CHANNEL', '"DEV"'

                //从配置文件中加载key=chennelList的值
                buildConfigField 'String', 'CHENNEL_LIST_JSON_STRING', '"' + properties.getProperty('chennelList', '') + '"'


                //可支持的内核版本
        ndk {
            abiFilters "armeabi"
            abiFilters "armeabi-v7a"
            abiFilters "x86"
        }
    }

    //渠道列表
    buildTypes {
        //生产渠道
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField 'String', 'API_BASE_URL', '"https://xxxx.com"' 
            buildConfigField 'String', 'UMENT_CHANNEL', '"release"'
        }
          //其他渠道
        mem555 {
            initWith debug
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField 'String', 'API_BASE_URL', '"https://xxxx.com"' 
            buildConfigField 'String', 'UMENT_CHANNEL', '"MEM"'
        }
        //更多渠道参考上方已有的渠道
                <.....>
    }
    //不检查警告错误
    lintOptions {
        abortOnError false
    }
}
//引用库
dependencies {
    //资源文件的引用
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    //引用测试支持,但是这个jar库的com.android.support例外
    androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support'
    })
    //注解代理
    annotationProcessor rootProject.ext.lombokProcess 
        //仅在当前项目中能使用aspectjrt:1.8.9这个类库的API
        compile 'org.aspectj:aspectjrt:1.8.9'
    //所有引用了当前项目的项目都能使用model项目中的类
    api project(':model')
    //所有引用了当前项目的项目都能使用fastjson:1.2.46的类
    api 'com.alibaba:fastjson:1.2.46'
}
//加入一个task读写文件任务,用于把当前所有的环境配置到配置文件中
task initChennel() {
    println '开始初始化环境'
    StringBuffer sb = new StringBuffer()
    def chennellist = android.buildTypes
    chennellist.each { chennel ->
        def paramMap = chennel.buildConfigFields
        paramMap.each {
            sb.append("${it.key},${it.value.value.replace("\"","")}|")
        }
    }
    sb = new StringBuffer(sb.substring(0,sb.length() - 1))
    File file = project.rootProject.file('local.properties')
    Writer w = new FileWriter(file)
    properties.put("chennelList", sb.toString())
    println sb.toString()
    properties.store(w, "conments")
    println '环境初始化完成'
}
//包含UnitTest的task不要启动
tasks.whenTaskAdded { task ->
    if (task.name.contains('UnitTest')) {
        task.enabled = false
    }
}

一切对一般来说,配置项都是在下面的闭包中进行配置,但是我们的例子里,可以见到有及部分并不是写在android{}内的,,为什么呢?有什么区别呢,,一般来说,写在Android闭包外的东西可以是grovvy中的一些task,或者其他代码片段。

例如,在这个配置文件里,我们就加载了一个参数文件,文件是以key-value方式进行存储的,那么在后面的android{}中我们就可以使用这个文件内的一些东西了,使用方式properties.getProperty('chennelList', ''),第一个参数表示key,第二个表示默认值。
另外我们还可以写一些grovvy代码来执行一些编译时任务如:task initChennel() {}
在这里让gradle编译的时候加入一个我的task,从而获得当前所有的渠道,最后写入配置文件中,使我在对android{properties.getProperty('chennelList', '')}配置的时候随能给到一个理想的值我。

//当前项目类型为library类型
apply plugin: 'com.android.library'

// 加载配置文件
final Properties properties = new Properties()
InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream()
properties.load(inputStream)
android{
...
}
//加入一个task读写文件任务,用于把当前所有的环境配置到配置文件中
task initChennel() {

}
//包含UnitTest的task不要启动
tasks.whenTaskAdded { task ->

}

buildConfigField

buildConfigField 'String', 'UMENT_CHANNEL', '"DEV"'

这个主要作用就是当项目在编译的时候是会默认生成一个BuildConfig文件,如果加入了这段代码,那么意味着,当BuildConfig生成的时候,他会在类内创建一个静态常量值,这里需要3个参数
1.数据类型
2.属性名称
3.属性值

public static final String UMENT_CHANNEL = "DEV";

在我们的项目比较大的时候,往往会分成多个模块进行工作,但是每一个模块工程都会有私有的build.gradle配置信息,这个时候想要统一构建版本的时候就显得很麻烦了,要一个接一个的改,十分不方便,那怎么办呢?其实你们可以见到,在这个build.gradle中我是这样写的

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

我这里的这些版本信息放在了一个公共的地方,所有子项目都可以访问他来统一管理,那么,怎么使用呢?
在项目的根路径下,会有一个build.gradle文件,其次子项目再有私有的build.gradle文件,只要在根目录的build.gradle中进行编写即可。看下面的,大家稍微想想就能理解了,这种方式还有更多的妙用,大家可以自己发掘

ext {
    defaultPublishConfig = project.hasProperty('buildType') ? project.property('buildType') : 'debug'
    buildToolsVersion = '27.0.1'
    compileSdkVersion = 27
    targetSdkVersion = 27 
    appVersionCode = 13
    appVersionName = '1.0.13'
}

你可能感兴趣的:(android,gradle)