AndroidStudio之Gradle配置详解

2019-11-04  本文已影响0人  Hank802

        Android Studio 是采用 Gradle 来构建项目的,Gradle 是一个非常先进强大基于Apache Ant和Apache Maven概念的项目自动化建构工具,它使用了一种基于 Groovy 领域的特定语言(DSL)来声明项目设置,语法简介、配置灵活。


一、AndroidStudio中的Gradle文件

如上图所示,创建一个AndroidStudio项目,会默认生成以下几个gradle文件:

1、build.gradle(Project:GradleApplication):主工程配置,详见第二部分;

2、build.gradle(Module:GradleApplication):Module配置,详见第三部分;

3、gradle-wrapper.properties:用于在构建项目时决定使用哪个 Gradle 版本,内容如下图:

distributionBase:Gradle压缩包解压后存储的主目录(可点击“File-Settings-Build,Execution,Deployment-Gradle”查看);

distributionPath:Gradle压缩包解压后具体路径目录;

zipStoreBase:Gradle压缩包存储的主目录;

zipStorePath:Gradle压缩包具体存储的路径目录;

distributionUrl: Gradle发行版压缩包的下载地址,AndroidStudio在线更新比较慢,所以建议通过该地址(Gradle官方下载地址:https://services.gradle.org/distributions/)下载后直接放到路径目录下重启AS即可;

4、gradle.properties:用来配置全局键值对数据的,可用于存放敏感数据,比如签名密钥信息,如下图:

5、setting.gradle:用于初始化以及工程树的配置的,放在根工程目录下;


二、Project 下的build.gradle常用配置

//这里是gradle脚本执行所需依赖,分别是对应的maven库和插件

buildscript {

repositories {

//从Android Studio3.0后新增了google()配置,可以引用google上的开源项目

google()

//jcenter是由 bintray.com维护的Maven仓库,Android Studio早期版本使用的是mavenCentral(),后来切换到jcenter()了,因为jcenter在性能和占存储大小方面比mavenCentral更优;

 jcenter()

    }

dependencies {

//此处是android的插件gradle的版本配置

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

// NOTE: Do not place your application dependencies here; they belong

// in the individual module build.gradle files

    }

}

//这里是项目本身需要的依赖,比如项目所需的maven库

allprojects {

repositories {

google()

jcenter()

}

}

// 运行gradle clean时,执行此处定义的task任务,该任务继承自Delete,删除根目录中的build目录,相当于执行Delete.delete(rootProject.buildDir)。

task clean(type: Delete) {

deleterootProject.buildDir

}


三、Module下的build.gradle常用配置

// 声明是Android程序,区别:前者可以直接运行,后着是依附别的应用程序运行,isBuildModule可定义在gradle.properties中

if (isBuildModule.toBoolean()) {

//com.android.application 表示这是一个应用程序模块,打包可得到APK

    applyplugin:'com.android.application'

}else {

//com.android.library 标识这是一个库模块,打包可得到AAR

    applyplugin:'com.android.library'

}

//android 闭包主要为了配置项目构建的各种属性

android {

    //设置编译时用的Android版本

    compileSdkVersionrootProject.ext.android['compileSdkVersion']

   //设置编译时使用的构建工具的版本,Android Studio3.0后去除此项配置

    buildToolsVersionrootProject.ext.android['buildToolsVersion']

defaultConfig {

 //项目最低兼容的版本

        minSdkVersionrootProject.ext.android['minSdkVersion']

//项目的目标版本:被设置为大于或等于该系统平台的API版本时,才会生效。例如,若指定targetSdkVersion值为22,则表示该程序最高只在Android5.1版本上做过充分测试,在Android6.0系统上(对应targetSdkVersion为23)拥有的新特性如系统运行时权限等功能就不会被启用。

        targetSdkVersionrootProject.ext.android['targetSdkVersion']

        //版本号

        versionCoderootProject.ext.android['versionCode']

        //版本名称

        versionNamerootProject.ext.android['versionName']

       //版本名后面添加一句话,意思就是flavor dimension 它的维度就是该版本号,这样维度就是都是统一的了

        flavorDimensions"versionCode"

       //表明要使用AndroidJUnitRunner进行单元测试

        testInstrumentationRunner"androidx.test.runner.AndroidJUnitRunner"

    }

//buildTypes 闭包主要指定生成安装文件的主要配置,一般包含两个子闭包:

//1、debug闭包,用于指定生成测试版安装文件的配置;

//2、release闭包,用于指定生成正式版安装文件的配置;

// 两者能配置的参数相同,最大的区别默认属性配置不一样

    buildTypes {

release {//生产环境

//BuildConfig是android studio在打包时自动生成的一个java类

//在项目工程的build/generated/source/buildConfig/androidTest或debug或release中

//三个参数:1.要定义的常量的类型 2.该常量的命名 3.该常量的值

//定义完成后,rebuild项目,然后通过BuildConfig.常量名调用

            buildConfigField("boolean","LOG_DEBUG","false")//配置Log日志

            buildConfigField("String","URL_PERFIX","\"https://release.cn/\"")// 配置URL前缀

            minifyEnabledtrue//是否对代码进行混淆

            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'//指定混淆的规则文件

            signingConfig signingConfigs.release//设置签名信息

            zipAlignEnabledtrue//是否对APK包执行ZIP对齐优化,减小zip体积,增加运行效率

            pseudoLocalesEnabledfalse//是否在APK中生成伪语言环境

            applicationIdSuffix'release'//给applicationId添加了后缀,根据需要选择是否添加

            versionNameSuffix'release'//给versionName添加后缀,根据需要选择是否添加

        }

debug {//测试环境

            buildConfigField("boolean","LOG_DEBUG","true")//配置Log日志

            buildConfigField("String","URL_PERFIX","\"https://test.com/\"")// 配置URL前缀

            minifyEnabledfalse//是否对代码进行混淆

            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'//指定混淆的规则文件

            signingConfig signingConfigs.debug//设置签名信息

            debuggablefalse//是否支持断点调试

            jniDebuggablefalse//是否可以调试NDK代码

            renderscriptDebuggablefalse//是否开启渲染脚本就是一些c写的渲染方法

            zipAlignEnabledtrue//是否对APK包执行ZIP对齐优化,减小zip体积,增加运行效率

            pseudoLocalesEnabledfalse//是否在APK中生成伪语言环境

            applicationIdSuffix'test'//给applicationId添加了后缀

            versionNameSuffix'test'//给versionName添加后缀

        }

}

//sourceSets 闭包用于配置目录指向:

    sourceSets {

main {

           jniLibs.srcDirs = ['libs']//指定lib库目录

            if (isBuildModule.toBoolean()) {//组件化开发为Module指定不同的manifest

                manifest.srcFile'src/main/debug/AndroidManifest.xml'

            }else {

                manifest.srcFile'src/main/release/AndroidManifest.xml'

            }

}

}

//signingConfigs 闭包用于签名配置,可把KEY信息定义在gradle.properties中

    signingConfigs {

    release {// 线上环境

            keyAlias'test'

            keyPassword'123456'

            storeFile file('test.keystore')

            storePassword'123456'

        }

debug {// 开发环境

            keyAlias'test'

            keyPassword'123456'

            storeFile file('test.keystore')

            storePassword'123456'

        }

}

//packagingOptions闭包用于打包时的相关配置:

//当项目中依赖的第三方库越来越多时,有可能会出现两个依赖库中存在同一个(名称)文件。

//Gradle在打包时就会提示错误(警告),使用以下方法将重复的文件剔除,比较常用的是通过exclude去除重复的文件

    packagingOptions{

// pickFirsts做用是当有重复文件时打包会报错,这样配置会使用第一个匹配的文件打包进入apk

// 表示当apk中有重复的META-INF目录下有重复的LICENSE文件时,只用第一个,这样打包就不会报错

        pickFirsts = ['META-INF/LICENSE']

// merges当出现重复文件时,合并重复的文件然后打包入apk

// 这个是有默认值得 merges = [] 这样会把默默认值去掉 ,所以我们用下面这种方式在默认值后添加

        merge'META-INF/LICENSE'

//这个是在同时使用butterknife、dagger2做的一个处理。遇到类似的问题,只要根据gradle的提示,做类似处理即可。

        exclude'META-INF/services/javax.annotation.processing.Processor'

    }

//productFlavors 闭包用于多渠道配置:通常在适配多个渠道的时候,需要为特定的渠道做部分特殊的处理,比如设置不同的包名、应用名等。

//场景:当我们使用友盟统计时,通常需要设置一个渠道ID,那么我们就可以利用productFlavors来生成对应渠道信息的包

//第一种配置方式

//    productFlavors {

//        wandoujia {}

//        xiaomi {}

//        _360 {}

//        //...

//    }

//    productFlavors.all {

//            //批量修改,类似一个循序遍历

//        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]

//    }

//第二种配置方式

    productFlavors {

//豌豆荚渠道包配置

        wandoujia {

manifestPlaceholders = [UMENG_CHANNEL_VALUE:"wandoujia"]

}

//小米渠道包配置

        xiaomi {

manifestPlaceholders = [UMENG_CHANNEL_VALUE:"xiaomi"]

}

//360渠道包配置

        _360 {

manifestPlaceholders = [UMENG_CHANNEL_VALUE:"_360"]

}

//等等

    }

//lintOptions 闭包用于代码扫描分析配置

//Lint 是Android Studio 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量问题,

// 同时提供一些解决方案,而且这个过程不需要我们手写测试用例。

//Lint 发现的每个问题都有描述信息和等级(和测试发现 bug 很相似),我们可以很方便地定位问题,同时按照严重程度进行解决。程序在编译的时候会检查lint,有任何错误提示会停止build,我们可以关闭这个开关

    lintOptions {

        abortOnErrorfalse //即使报错也不会停止打包

        checkReleaseBuildsfalse  //打包release版本的时候进行检测

    }

}

//dependencies 闭包用于定义项目的依赖关系,一般项目都有三种依赖方式:本地依赖、库依赖和远程依赖。

// 本地依赖可以对本地的jar包或目录添加依赖关系

// 库依赖可以对项目中的库模块添加依赖关系

// 远程依赖可以对jcener库上的开源项目添加依赖关系

// 从Android Studio3.0后compile引入库不在使用,而是通过api和implementation,

// api完全等同于以前的compile,用api引入的库整个项目都可以使用,

// 用implementation引入的库只有对应的Module能使用,其他Module不能使用,由于之前的项目统一用compile依赖,导致的情况就是模块耦合性太高,不利于项目拆解,使用implementation之后虽然使用起来复杂了但是做到降低偶合兴提高安全性。

dependencies {

//本地jar包依赖,表示将libs目录下所有.jar后缀的文件都添加到项目的构建路径当中

implementation fileTree(dir:'libs',include: ['*.jar'])

//远程依赖格式,域名:组件:版本

implementation'androidx.appcompat:appcompat:1.1.0'

implementation'androidx.constraintlayout:constraintlayout:1.1.3'

//声明测试用例库

testImplementation'junit:junit:4.12'

//声明测试用例库,AndroidJUnitRunner单元测试

//详见:https://developer.android.google.cn/reference/android/test/AndroidTestRunner.html

androidTestImplementation'androidx.test:runner:1.2.0'

//声明测试用例库,Android官方提供的一个UI测试框架,适合应用中的功能性 UI 测试

//详见:https://developer.android.google.cn/reference/android/support/test/espresso/Espresso

androidTestImplementation'androidx.test.espresso:espresso-core:3.2.0'

}

上一篇下一篇

猜你喜欢

热点阅读