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'
}