Gradle是一个开源的构建自动化工具,专注于灵活性和性能。
Gradle构建脚本使用Groovy或Kotlin DSL编写。
Gradle支持多种IDE,包括Android Studio,Eclipse,IntelliJ IDEA,Visual Studio和XCode。
Gradle可应用于Android、C++、Groovy、Java、JavaScript、Kotlin、Scala
Gradle构建语言参考:https://docs.gradle.org/current/dsl/
~\gradle-4.6\bin
新建项目文件夹,在该文件夹下执行命令:
gradle init //使用 Groovy
gradle init --dsl kotlin //使用kotlin
命令执行成功后,项目文件夹中会生成如下内容
build.gradle.kts:用于配置当前项目的Gradle构建脚本
gradle-wrapper.jar:Gradle Wrapper可执行JAR
gradle-wrapper.properties:Gradle Wrapper配置属性
gradlew:基于Unix的系统的Gradle Wrapper脚本
gradlew.bat:适用于Windows的Gradle Wrapper脚本
settings.gradle.kts:用于配置Gradle构建的Gradle设置脚本
在build.gradle.kts
文件中编写代码
plugins {
id("base")
}
tasks.create<Zip>("zip"){
from("app")
archiveName = "GradleDemo.apk"
}
tasks.create<Copy>("copy"){
from("build/distributions/GradleDemo.apk")
into("Release")
}
执行命令,然后查看项目文件,可发现已经进行了压缩与复制
./gradlew zip
./gradlew copy
执行命令
gradlew task
相关命令
通过Android Studio生成的项目,比gradle init
生成的内容多出了以下文件
local.properties
gradle.properties
build.gradle(Module:app)
local.properties:为构建系统配置本地环境属性,例如SDK安装路径。 该文件的内容由 Android Studio 自动生成并且专用于本地开发者环境,不应手动修改该文件,或将其纳入的版本控制系统
gradle.properties:可以在其中配置项目范围 Gradle 设置,例如 Gradle 后台进程的最大堆大小。
参考:https://docs.gradle.org/current/userguide/build_environment.html
在多模块开发中需要共享通用的属性时,可在Project层级下.gradle文件中自定义属性。
buildscript
allprojects
...
ext {
compileSdkVersion = 28
buildToolsVersion = "28.0.0"
supportVersion = "28.0.0"
applicationId = "com.xhuww.gradledemo"
minSdkVersion = 15
targetSdkVersion = 28
versionCode = 1
versionName = "1.0"
}
使用属性
android {
compileSdkVersion rootProject.ext.compileSdkVersion
defaultConfig {
applicationId rootProject.ext.applicationId
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
}
}
配置插件
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
依赖类型
dependencies { //配置此项目的依赖项 。
//依赖本地 library module
implementation project(":mylibrary")
//依赖本地jar 包
implementation fileTree(dir: 'libs', include: ['*.jar'])
//远程依赖
implementation "com.android.support:appcompat-v7:${rootProject.ext.supportVersion}"
}
依赖方式
compile // Gradle Plugin 3.0.0 后已弃用
api //依赖性运行时和编译时都可用于其他模块。
implementation // 依赖性仅在运行时可用于其他模块。
...
其他参考:https://developer.android.google.cn/studio/build/dependencies.html
远程仓库
allprojects { //配置此项目及其每个子项目。
repositories { //配置此项目的存储库。
google()
jcenter()
mavenCentral()
mavenLocal()
}
}
共享配置
android {
signingConfigs {
debug {
keyAlias 'gradle_jks'
keyPassword '123456'
storeFile file('../jks/gradle.jks')
storePassword '123456'
}
}
}
私密配置
新建keystore.properties
文件,并定义
keyAlias = gradle_jks
keyPassword = 123456
storeFile = file('../jks/gradle.jks')
storePassword = 123456
build.gradle(Module)
中
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
signingConfigs {
debug {
...
}
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
}
}
}
buildTypes {
debug {
minifyEnabled true
shrinkResources true
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true // 启用代码混淆
shrinkResources true // 移除未使用的资源
signingConfig signingConfigs.release //配置签名
// 混淆规则文件
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
封装此项目的所有构建类型配置。
flavorDimensions "company" //风格纬度
productFlavors {
customer {
dimension = "company"
applicationIdSuffix ".customer"
}
fenrir {
dimension = "company"
applicationIdSuffix ".fenrir"
}
}
variantFilter { variant ->
def names = variant.flavors*.name
if (names.contains("fenrir") && variant.buildType.name == "release") {
setIgnore(true)
}
}
此时可查看Build Variants
筛选前
筛选后
Project -> Module -> src -> 右键 -> New -> Folder -> Java Folder(或其它)
配置完成后
根据手机 屏幕密度 或 应用程序二进制接口(ABI)的文件的不同,打包多个APK
splits {
density { // 根据屏幕密度配置
enable true
exclude "ldpi", "xxhdpi", "xxxhdpi" //屏幕密度
compatibleScreens 'small', 'normal', 'large', 'xlarge' //屏幕尺寸
}
abi { // 手机架构
enable true
reset()
include "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
universalApk false
}
}
此时生成的apk
遍历,批量修改输出的 APK 名称
applicationVariants.all { variant ->
variant.outputs.all { output ->
outputFileName = "${variant.flavorName}_${variant.buildType.name}_${variant.versionName}.apk"
}
}
此时生成的apk
./gradlew assemble + Build Variants 名称,例如:
./gradlew assembleFenrirDebug
Gradle
https://gradle.org/releases/ https://docs.gradle.org/current/userguide/userguide.html
Gradle For Android
https://developer.android.google.cn/studio/build http://google.github.io/android-gradle-dsl/current/ https://developer.android.google.cn/studio/releases/gradle-plugin