Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。
1. 根目录下的build.gradle
apply from: 'config.gradle' //应用全局公共配置
buildscript {
// ext 用于定义动态属性
ext {
// 定义阿里云镜像配置
repositories = [
'https://maven.aliyun.com/repository/central',
'https://maven.aliyun.com/repository/jcenter',
'https://maven.aliyun.com/repository/public',
'https://maven.aliyun.com/repository/google',
'https://maven.aliyun.com/repository/gradle-plugin',
'http://repo.springsource.org/libs-milestone-local'
]
}
// repositories闭包 配置远程仓库
repositories {
// 应用阿里云镜像配置
rootProject.ext.repositories.each { repourl ->
maven { url repourl }
}
google() // 代码托管库:声明后可引用google上的开源项目
jcenter() // 代码托管库:声明后可引用jcenter上的开源项目
}
// dependencies闭包 配置构建工具
dependencies {
classpath 'com.android.tools.build:gradle:3.1.4' // 声明gradle插件,插件版本号为3.1.4
//classpath "com.mob.sdk:MobSDK:2018.0319.1724"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
classpath 'com.cpdroid:fat-aar:1.1.0'
}
// 增加一些编译选项
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
}
}
}
allprojects {
repositories {
rootProject.ext.repositories.each { repourl ->
maven { url repourl }
}
google() // 代码托管库:声明后可引用google上的开源项目
jcenter() // 代码托管库:声明后可引用jcenter上的开源项目
}
}
// 运行gradle clean时,执行此处定义的task任务
// 该任务继承自Delete,删除根目录中的build目录
// 相当于执行Delete.delete(rootProject.buildDir)
task clean(type: Delete) {
delete rootProject.buildDir
}
// 打印引用的仓库地址
task printRepos {
doLast {
repositories.each { repourl ->
println "repository: ${repourl.name} ('${repourl.url}')"
}
}
}
2. module目录下的build.gradle
// 声明是Android程序
// com.android.application 表示这是一个应用程序模块, 可直接运行
// com.android.library 标识这是一个库模块, 作为代码库依附别的库运行
apply plugin: 'com.android.library'
def getProductName() { return "QuickUniSDK.Core" }
def config = rootProject.ext.android
// android闭包, 配置android构建参数
android {
// 关闭Android Studio的PNG合法性检查
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
buildToolsVersion config.buildToolsVersion // build tools的版本, 其中包括了打包工具aapt、dx等等。
compileSdkVersion config.compileSdkVersion // 编译sdk的版本, 也就是API Level, 例如API-19、API-20、API-21等等。
// 默认配置
defaultConfig {
minSdkVersion config.minSdkVersion // 最小sdk版本, 如果设备小于这个版本或者大于maxSdkVersion将无法安装这个应用
targetSdkVersion config.targetSdkVersion // 目标sdk版本
versionCode config.versionCode // 版本号
versionName config.versionName // 版本名称
archivesBaseName = "test-$versionName" // 指定打包成Jar文件时候的文件名称
// 当方法数超过65535(方法的索引使用的是一个short值,而short最大值是65535)的时候允许打包成多个dex文件,动态加载dex
multiDexEnabled true
ndk {
moduleName "tttt" // 设置库(so)文件名称
ldLibs "log", "z", "m", "jnigraphics", "android"
//设置支持的SO库架构
//'armeabi-v7a', 'x86','armeabi'','x86_64','arm64-v8a'''
// 注:放开'arm64-v8a'会找不到腾讯人脸识别的类库包,>=android7.0 手机会崩溃
abiFilters 'armeabi-v7a', 'x86', 'arm64-v8a'
cFlags "-std=c++11 -fexceptions" // C++11
stl "gnustl_static"
}
// ARouter配置
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
buildTypes {
// debug闭包指定生成测试版安装文件的配置
debug {
buildConfigField('String', 'SERVER_ADDRESS', "xxxx") // 配置同字段不同开发环境取不同的值
// manifest占位符
manifestPlaceholders = [
APP_NAME: "@string/app_name_xxxx",
]
zipAlignEnabled true // 是否对APK包执行ZIP对齐优化,减小zip体积,增加运行效率
shrinkResources true // 移除无用的resource文件
debuggable false // 是否支持调试
jniDebuggable false // 关闭jni调试
multiDexEnabled true // 是否启动自动拆分多个dex的功能
multiDexKeepProguard file('multidex-config.pro')
minifyEnabled false // 是否开启混淆(上线)
// proguardFiles 指定混淆的规则文件
// proguard-android.txt 通用混淆规则
// proguard-rules.pro 自定义混淆规则
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release // 设置签名信息
}
release.initWith(buildTypes.debug)
// release闭包指定生成正式版安装文件的配置
release {
minifyEnabled false // 是否开启混淆(上线)
//shrinkResources true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 // source使用的jdk版本
targetCompatibility JavaVersion.VERSION_1_8 // 编译时使用的jdk版本或者更新的java虚拟机兼容
}
// DEX工具配置, multiDex的一些相关配置, 提升编译速度
dexOptions {
preDexLibraries = false // 让它不要对Lib做preDexing
incremental true // 开启incremental dexing,优化编译效率,这个功能android studio默认是关闭的。
javaMaxHeapSize "4g" // 增加java堆内存大小
jumboMode = true
}
// 程序在编译的时候会检查lint, 有任何的错误或者警告提示, 都会终止构建, 我们可以将其关掉
lintOptions {
disable 'InvalidPackage'
abortOnError false // 即使报错也不会停止打包
checkReleaseBuilds false // 打包release版本的时候是否进行检测
quiet true // true 关闭lint报告的分析进度
abortOnError false // true 错误发生后停止gradle构建
ignoreWarnings true // true 只报告error
//absolutePaths true // true 忽略有错误的文件的全/绝对路径(默认是true)
checkAllWarnings true // true 检查所有问题点,包含其他默认关闭项
warningsAsErrors true // true 所有warning当做error
disable 'TypographyFractions', 'TypographyQuotes' // 关闭指定问题检查
enable 'RtlHardcoded', 'RtlCompat', 'RtlEnabled' // 打开指定问题检查
check 'NewApi', 'InlinedApi' // 仅检查指定问题
noLines true // true error输出文件不包含源码行号
showAll true // true 显示错误的所有发生位置,不截取
lintConfig file("default-lint.xml") // 回退lint设置(默认规则)
textReport true // true 生成txt格式报告(默认false)
textOutput 'stdout' // 重定向输出, 可以是文件或'stdout'
xmlReport false // true 生成XML格式报告
xmlOutput file("lint-report.xml") // 指定xml报告文档(默认lint-results.xml)
htmlReport true // true 生成HTML报告(带问题解释,源码位置,等)
htmlOutput file("lint-report.html") // html报告可选路径(构建器默认是lint-results.html )
checkReleaseBuilds true // true 所有正式版构建执行规则生成崩溃的lint检查,如果有崩溃问题将停止构建
fatal 'NewApi', 'InlineApi' // 在发布版本编译时检查(即使不包含**重点内容**lint目标),指定问题的规则生成崩溃
error 'Wakelock', 'TextViewEdits' // 指定问题的规则生成错误
warning 'ResourceAsColor' // 指定问题的规则生成警告
ignore 'TypographyQuotes' // 忽略指定问题的规则(同关闭检查)
}
// 打包配置
packagingOptions {
// pickFirsts作用是 当有重复文件时 打包会报错 这样配置会使用第一个匹配的文件打包进入apk
// 表示当apk中有重复的META-INF目录下有重复的LICENSE文件时 只用第一个 这样打包就不会报错
// pickFirsts = ['META-INF/LICENSE']
// merges作用 当出现重复文件时 合并重复的文件 然后打包入apk
// 这个是有默认值得 merges = [] 这样会把默默认值去掉 所以我们用下面这种方式 在默认值后添加
// merge 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'org/bouncycastle/x509/CertPathReviewerMessages_de.properties'
exclude 'org/bouncycastle/x509/CertPathReviewerMessages.properties'
}
// 签名配置
signingConfigs {
release { // release签名配置
storeFile file("xxxx.keystore") // 密钥文件路径
storePassword "123456" // 密钥文件密码
keyAlias "xxxx" // key别名
keyPassword "123456" // key密码
}
debug { // debug签名配置
storeFile file("xxxx.keystore")
storePassword "123456"
keyAlias "xxxx"
keyPassword "123456"
}
}
// 配置目录指向,默认的一些文件路径的配置
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml' // 指定AndroidManifest文件
java.srcDirs = ['src'] // 指定source目录
resources.srcDirs = ['src'] // 指定source目录
aidl.srcDirs = ['src'] // 指定source目录
renderscript.srcDirs = ['src'] // 指定source目录
res.srcDirs = ['res'] // 指定资源目录
assets.srcDirs = ['assets'] // 指定assets目录
jniLibs.srcDirs = ['libs'] // 指定lib库目录
}
debug.setRoot('build-types/debug') // 指定debug模式的路径
release.setRoot('build-types/release') // 指定release模式的路径
}
// 自动追加版本号和版本名称
android.libraryVariants.all { variant ->
variant.outputs.all { output ->
if (output.outputFile != null
&& output.outputFile.name.endsWith('.aar')
&& output.outputFile.size() != 0) {
def fileName = String.format("%s_v%s_%s_%s.aar", getProductName(), defaultConfig.versionName, rootProject.ext.common.packageTime, variant.buildType.name)
outputFileName = fileName
}
}
variant.assemble.doLast {
if (variant.buildType.name.contains('release')) {
def path = null
variant.outputs.each { output ->
path = output.outputFile
if (output.outputFile != null
&& output.outputFile.name.endsWith('.aar')
&& output.outputFile.size() != 0) {
copy { // 每次导出aar后 拷贝一份到指定目录 作为备份 防止项目clean后找不到对应版本的aar
from output.outputFile
into rootProject.ext.common.AARBackupDir
}
}
}
if (path != null) {
if (System.properties['os.name'].toLowerCase().contains('mac os x')) {
['open', '-R', path].execute()
} else if (System.properties['os.name'].toLowerCase().contains('windows')) {
['explorer', '/select,', path].execute()
}
}
}
}
}
}
tasks.withType(JavaCompile) {
// 在 Gradle 4.10 版本之后便默认使用了增量编译
// 如果在更老的版本需要启动增量编译,可以使用如下配置:
options.incremental = true
// 解决java控制台输出中文乱码
options.encoding = "UTF-8"
}
// 指定当前项目的所有依赖关系 一共又三种依赖方式:本地依赖, 库依赖, 远程依赖
// 本地依赖:可以对本地 Jar 包或目录添加依赖关系
// 库依赖:可以对项目中的库模块添加依赖关系
// 远程依赖:可以对 jcenter 库上的开源项目添加依赖
// 标准的远程依赖格式是 域名:组织名:版本号
// implementation implementation依赖的库只能自己库本身访问
// api 使用该方式依赖的库将会参与编译和打包, 依赖传递
// compileOnly 只在编译的时候有效, 不参与打包
// runtimeOnly 只在打包的时候有效, 编译不参与
dependencies {
compileOnly files('libs/lib_unity/classes.jar')
//implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0' // 远程依赖声明
compileOnly fileTree(exclude: ['android-support*.jar'], include: ['*.jar'], dir: 'libs')
// 本地依赖声明, 表示将libs目录下所有.jar后缀的文件都添加到项目构建路径中
//implementation files('libs/soeasysdk_20181025.jar')
//implementation files('libs/libPluginProtocolForUnity_fat.jar')
}