gradle构建工具让工程有了无限可能和组合。
gradle核心是基于groovy脚本语言,groovy脚本基于java且扩展了java。因此gradle需要依赖JDK和Groovy库。
和ant、maven构建有区别,gradle是一种编程思想。
打印第一句:
println('hello gradle')
println 'hello gradle'
在Sync后会看到打印出来hello gradle.
配置整个项目用
在根目录下,建立一个config.gradle文件。
//同时添加多个自定义属性,可以通过ext代码块
ext{
username = "hujun"
}
然后在项目的build.gradle里引入该配置文件:
//根目录下的build.gradle最上面,加入自定义的gradle文件
//相当于layout布局中加入include语法
apply from:'config.gradle'
在所有的gradle里就可以调用config.gradle里的自定义属性了。
//groovy是弱类型语言,可以将变量赋值其他类型
rootProject.ext.username = 123
//可以直接写属性名,也可以用rootProject来获取属性名
println "${username}"
println "${rootProject.ext.username}"
除了定义属性,还可以定义map。
appId = [
app : "com.hujun.androidmodulize",
module: "com.hujun.androidmodulize.module"
]
//建立Map存储,对象名、key都可以自定义
androidId = [
compileSdkVersion: 29,
buildToolsVersion: "29.0.2",
minSdkVersion : 21,
targetSdkVersion : 29,
versionCode : 1,
versionName : "1.0"
]
//生成环境、开发环境需要不同属性
url = [
"debug" : "https://www.baidu.com",
"release": "https://www.google.com"
]
//统一依赖库
supportLibrary = '1.1.0'
//第三方库
support = [
"appcompat" : "androidx.appcompat:appcompat:${supportLibrary}",
"constraintlayout": "androidx.constraintlayout:constraintlayout:1.1.3"
]
map的使用
//赋值与引用
def androidId=rootProject.ext.androidId
def appId=rootProject.ext.appId
def support=rootProject.ext.support
dependencies {
//依赖的简写
implementation 'androidx.appcompat:appcompat:1.1.0'
//依赖的完整写法
// implementation group:'androidx.appcompat',name:'appcompat',version:'1.1.0'
implementation support.appcompat
implementation support.constraintlayout
}
最简化的一次性引用整个map的方法:
dependencies {
//遍历整个map,引入依赖
support.each{k,v -> implementation v}
}
完整的build.gradle:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
//赋值与引用
def androidId = rootProject.ext.androidId
def appId = rootProject.ext.appId
def support = rootProject.ext.support
def testSupport = rootProject.ext.testSupport
def androidTestSupport = rootProject.ext.androidTestSupport
android {
compileSdkVersion androidId.compileSdkVersion
buildToolsVersion androidId.buildToolsVersion
defaultConfig {
applicationId appId.app
minSdkVersion androidId.minSdkVersion
targetSdkVersion androidId.targetSdkVersion
versionCode androidId.versionCode
versionName androidId.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
support.each { k, v -> implementation v }
testSupport.each { k, v -> testImplementation v }
androidTestSupport.each { k, v -> androidTestImplementation v }
}
BuildConfig的使用
在项目build之后,会自动生成一个BuildConfig类,其中放了一些静态全局变量。
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.hujun.androidmodulize";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}
如何在其中添加我们自定义的变量呢?
在build.gradle中添加即可:
buildTypes {
debug{
buildConfigField("String","url","\"${rootProject.ext.url.debug}\"")
}
release {
buildConfigField("String","url","\"${rootProject.ext.url.release}\"")
}
}
其中url是我们在config.gradle中定义的map。
由此,当我们可以在项目中引用BuildConfig.url,这个变量会根据是debug还是release工程来自动取值。
gradle常见配置
在defaultConfig中的配置
//开启分包
multiDexEnabled true
//设置分包配置,在热修复中使用过
multiDexKeepFile file('multidex-config.txt')
//将svg图片生成指定维度的png图片
vectorDrawables.generatedDensities('xhdpi','xxhdpi')
//使用support-v7兼容(5.0版本以上)
vectorDrawables.useSupportLibrary = true
//只保留指定和默认资源
resConfig('zh-rCN')
//配置so库的CPU架构
ndk{
abiFilters('armeabi-v7a')
}
//源集,设置源集的属性,更改源集的各种目录位置
sourceSets{
main{
if (!isRelease){
//如果是组件化模式,需要单独运行时
manifest.srcFile 'src/main/AndroidManifest.xml'
}else{
//集成模式,整个项目打包
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
//构建签名信息
signingConfigs{
release{
//签名证书文件位置
storeFile file("/Users/junhu/git/AndroidModulize/key")
//签名证书的类型
storeType "hujun"
//签名证书的密码
storePassword "123123"
//签名证书中密钥别名
keyAlias "key0"
//签名证书中该密钥的密码
keyPassword "123123"
//是否开启V2打包
v2SigningEnabled true
}
}
配置偶估计参数buildTypes
buildTypes {
debug{
buildConfigField("String","url","\"${rootProject.ext.url.debug}\"")
}
release {
signingConfig signingConfigs.release
buildConfigField("String","url","\"${rootProject.ext.url.release}\"")
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
完整的build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
println("$username")
//赋值与引用
def androidId = rootProject.ext.androidId
def appId = rootProject.ext.appId
def support = rootProject.ext.support
//def url = rootProject.ext.url
def testSupport = rootProject.ext.testSupport
def androidTestSupport = rootProject.ext.androidTestSupport
def isRelease = rootProject.ext.isRelease
android {
compileSdkVersion androidId.compileSdkVersion
buildToolsVersion androidId.buildToolsVersion
defaultConfig {
applicationId appId.app
minSdkVersion androidId.minSdkVersion
targetSdkVersion androidId.targetSdkVersion
versionCode androidId.versionCode
versionName androidId.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//开启分包
multiDexEnabled true
//设置分包配置,在热修复中使用过
multiDexKeepFile file('multidex-config.txt')
//将svg图片生成指定维度的png图片
vectorDrawables.generatedDensities('xhdpi','xxhdpi')
//使用support-v7兼容(5.0版本以上)
vectorDrawables.useSupportLibrary = true
//只保留指定和默认资源
resConfig('zh-rCN')
//配置so库的CPU架构
ndk{
abiFilters('armeabi-v7a')
}
//源集,设置源集的属性,更改源集的各种目录位置
sourceSets{
main{
if (!isRelease){
//如果是组件化模式,需要单独运行时
manifest.srcFile 'src/main/AndroidManifest.xml'
}else{
//集成模式,整个项目打包
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
//构建签名信息
signingConfigs{
release{
//签名证书文件位置
storeFile file("/Users/junhu/git/AndroidModulize/key")
//签名证书的类型
storeType "hujun"
//签名证书的密码
storePassword "123123"
//签名证书中密钥别名
keyAlias "key0"
//签名证书中该密钥的密码
keyPassword "123123"
//是否开启V2打包
v2SigningEnabled true
}
}
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
buildTypes {
debug{
buildConfigField("String","url","\"${rootProject.ext.url.debug}\"")
}
release {
signingConfig signingConfigs.release
buildConfigField("String","url","\"${rootProject.ext.url.release}\"")
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.10.2"
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
support.each { k, v -> implementation v }
testSupport.each { k, v -> testImplementation v }
androidTestSupport.each { k, v -> androidTestImplementation v }
}
其他配置
在android{}里面有一些其他不常用的配置。
//adbOptions可以对adb操作添加配置
adbOptions{
//配置操作超时时间
timeOutInMs = 5 * 1000
//adb install 命令的选项配置
installOptions '-r','-s'
}
//对dx操作的配置,接受一个DexOptions类型的闭包,配置由DexOptions提供
dexOptions{
//配置执行dx命令时为其分配的最大堆内存
javaMaxHeapSize "4g"
//配置是否预执行dex Libraries工程,开启后悔提高增量构建速度,不过会影响clean构建速度,默认true
preDexLibraries = false
//配置是否开启jumbo模式,代码方法数超过65535时,需要强制开启才能构建成功
jumboMode true
//配置gradle 运行dx命令时使用的线程数量
threadCount 8
//配置multidex参数
additionalParameters=[
'--multi-dex',//多dex分包
'--set-max-idx-number=50000',//每个包内方法数上限
'--minimal-main-dex'
]
}
//执行gradle lint命令即可运行lint检查,默认生成的报告在outputs/lint-results.html中
lintOptions{
//遇到lint检查错误会终止构建,默认为false
abortOnError false
//将警告当做错误来处理
warningsAsErrors false
//检查新API
check 'NewApi'
}