一、app下的 build.gradle
1、头部的一些配置:
1)说明module的类型。'com.android.application'为程序,'com.android.library'为库
apply plugin: 'com.android.application'
2)引用一些插件:
a、引入二进制插件,二进制插件一般都是被打包在一个jar里独立发布的。
apply plugin: 'com.jakewharton.butterknife'//引入butterknife插件
b、引入应用脚本插件,其实这不能算是一个插件,而是一个脚本。
apply from: 'chappie.gradle'
3) 用关键字def定义变量或函数,可以在其他地方引用
def static releaseTime() {
return new Date().format("yyyyMMdd_HHmmss")
}
def versionCode="1.0.1"
2、build文件中的一些常用配置:
模块 | 介绍 |
android闭包 | 配置项目构建的各种属性。 |
defaultConfig闭包 | 默认配置:应用程序包名、最小sdk版本、目标sdk版本、版本号、版本名称、配置编译时java的一些参数等。 |
buildTypes闭包 | 指定生成不同环境下安装文件的配置 |
signingConfigs闭包 | 签名信息配置 |
sourceSets闭包 | 源文件路径配置 |
lintOptions闭包 | lint配置 |
dependencies闭包 | 指定当前项目的所有依赖关系 |
1)版本信息
compileSdkVersion 23 //编译SDK版本
buildToolsVersion "23" //构建工具(tool)版本
或者
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
这种方式是采用了开发版本的统一规范。Android开发存在着众多版本的不同,比如compileSdkVersion、minSdkVersion、targetSdkVersion以及项目中依赖第三方库的版本,不同的module及不同的开发人员都有不同的版本,所以需要一个统一版本规范的文件,即创建一个gradle级别的文件来统一管理这些版本信息,然后在需要填写版本信息的地方调用这个文件中对应的版本信息。
具体可以参考另一篇文章:https://blog.csdn.net/qiutiandepaomo/article/details/103728423
2)默认配置defaultConfig
defaultConfig {
applicationId 'com.xstore.wms' //应用包名
minSdkVersion 22 //应用支持的最小sdk版本
targetSdkVersion 27 //目标sdk
versionCode 1 //版本号
versionName "1.0" //版本名称
multiDexEnabled true //dex突破65535的限制
archivesBaseName="test" //指定打包成Jar文件时候的文件名称
ndk{
abiFilters "armeabi","x86","armeabi-v7a" //设置支持的so库架构
}
javaCompileOptions {//配置编译时java的一些参数
annotationProcessorOptions {
includeCompileClasspath false
}
}
}
3)默认的一些文件路径配置sourceSets
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml' //指定清单文件(可不做配置)
res.srcDirs=['res'] //指定res资源目录
assets.srcDirs=['assets'] //assets资源目录
jni.srcDirs 'src/main/jni' //jni代码目录
jniLibs.srcDirs 'libs' //jni库目录
java.srcDirs =['src'] //java代码目录
resources.srcDirs=['src'] //指定source目录
aidl.srcDirs=['src'] //指定aidl目录
}
debug.setRoot('buildTypes/debug') //指定debug模式的路径
release.setRoot("buildTypes/release") //指定release模式的路径
}
4)dexOptions的一些相关配置,这样配置可以让你的编译速度更快
dexOptions {
jumboMode = true//是否支持大工程模式
javaMaxHeapSize "4g"//最大堆内存
preDexLibraries = false//是否预编译
incremental true//是否使用增量模式构建
threadCount=8//线程数
}
5)signingConfigs签名配置
signingConfigs {
//发布版本签名配置
release {
storeFile file("./ruxing_ppt") //密钥文件路径
storePassword "ruxing" //密钥文件密码
keyAlias "ruxing" //key别名
keyPassword "ruxing" //key密码
}
//debug版本签名配置
debug {
//同上
}
}
6)buildTypes构建类型
buildTypes {
//发布
release {
//添加BuildConfig文件配置字段,可以设置不同环境下打包时不同的配置
buildConfigField("boolean", "LOG_DEBUG", "false")
buildConfigField("String", "API_HOST", "\"http://.../\"")
versionNameSuffix "release"//在生成的release版本APK后缀中添加"release"字段
minifyEnabled true//混淆开启
zipAlignEnabled true//是否支持Zip
shrinkResources true//是否清除无用资源
debuggable true //是否支持调试
//指定混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rule.txt'
signingConfig signingConfigs.release//指定签名
applicationVariants.all { variant ->//设置apk的名称
variant.outputs.each { output ->
def fileName = "ph_android_release.apk"
outputFileName = fileName
}
}
}
//测试
debug {
...
signingConfig signingConfigs.debug
applicationVariants.all { variant ->
variant.outputs.each { output ->
def fileName = "ph_android_debug.apk"
outputFileName = fileName
}
}
}
}
其中设置apk的名称可以在不同的构建环境中单独设置,也可以单独的拿出来设置,在不同的构建环境中单独设置同上,单独拿出来设置如下:
applicationVariants.all { variant ->
variant.outputs.all {
def fileName = "..."
if (variant.buildType.name == "release") {
fileName += "_${defaultConfig.versionName}"
} else if (variant.buildType.name == "debug") {
fileName += "_${releaseTime()}"
}
fileName += "_${variant.buildType.name}.apk"
variant.getPackageApplicationProvider().get().outputDirectory = new File(project.rootDir.absolutePath + "/apk") //指定apk输出路径
variant.getPackageApplicationProvider().get().outputScope.apkDatas.forEach { apkData -> //指定apk名称
apkData.outputFileName = fileName
}
}
7)packingOptions设置不想添加到apk中的文件
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/DEPENDENCIES'
exclude 'project.properties'
exclude 'proguard.cfg'
exclude 'META-INF/maven/com.google.protobuf/protobuf-java/pom.xml'
exclude 'META-INF/maven/com.google.protobuf/protobuf-java/pom.properties'
}
8)compileOptions指定java版本
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
9)productFlavors
多渠道打包相关的配置:
通常在适配多个渠道的时候,需要为特定的渠道做部分特殊的处理,比如设置不同的包名、应用名等。所以我们发版本的时候,经常需要切换项目分支或者修改代码,然后逐个编译apk。productFlavors就可以简化这一步操作,不用切换分支、修改代码,就可以一次性的编译符合不同要求的apk。
可以在不同的渠道设置不同的BuildConfig变量;不同的包名、应用名;配合AndroidManifest.xml设置不同渠道不同变量值。
productFlavors {
channel1 {
buildConfigField("String", "API_HOST", "......")
applicationId "com.test.testData1"
manifestPlaceholders = [
PUSH_APPID: "1001",
CHANNEL_ID: "001"
]
}
channel2 {
buildConfigField("String", "API_HOST", "......")
applicationId "com.test.testData2"
manifestPlaceholders = [
PUSH_APPID: "1002",
CHANNEL_ID: "002"
]
}
channel3 {
buildConfigField("String", "API_HOST", "......")
applicationId "com.test.testData3"
manifestPlaceholders = [
PUSH_APPID: "1003",
CHANNEL_ID: "003"
]
}
}
AndroidManifest.xml
<meta-data
android:name="JPUSH_APPID"
android:value="${PUSH_APPID}" />
<meta-data
android:name="UMENG_CHANNEL_ID"
android:value="${CHANNEL_ID}" />
productFlavors配合上边的buildTypes,可以选择debugChannel1、debugChannel2、debugChannel3、releaseChannel1、releaseChannel2、releaseChannel3 六种编译方式。
默认情况下,只指定一个维度时,配置的所有渠道都属于这个维度,如果指定了多个维度,需要手动为每个渠道分配一个维度。
如有两个厂商需要适配三种模型:
productFlavors {
flavorDimensions "model","factory"
factory1 {
dimension 'factory'
}
factory2 {
dimension 'factory'
}
model1 {
dimension 'model'
}
model2 {
dimension 'model'
}
model3 {
dimension 'model'
}
}
这种情况下productFlavors配合上边的buildTypes,会有model1Factory1Debug、model1Factory1Release、model1Factory2Debug、model1Factory2Release、model1Factory3Debug、model1Factory3Release、model2Factory1Debug、model2Factory1Release、model2Factory2Debug、model2Factory2Release、model2Factory3Debug、model3Factory3Release十二种编译方式。
10)lintOptions:这个设置编译的lint开关。程序在build的时候,会执行lint检查,有任何错误或者警告提示,都会终止构建,我们可以将其关掉。
lintOptions {
quiet true//是否关闭lint报告的分析进度
abortOnError false//错误发生后是否停止gradle的构建
ignoreWarnings true//是否忽略警告
checkAllWarnings true//是否检查所有的问题点,包含其他默认关闭项
warningsAsErrors true//是否将warning当成error
disable 'InvalidPackage'//关闭指定问题检查
enable 'OldTargetApi'//打开指定问题检查
check 'IconDensities'//仅检查指定问题
noLines true//error输出文件是否包含源码行数
showAll true//是否显示错误的所有发生位置
}
11)设置依赖信息:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar']) //本地依赖文件树
compile files('libs/xutils3.3.4.jar') //本地依赖文件
compile(project(':pullToRefreshLibrary')) //本地依赖工程
compile 'com.android.support:support-v4:+' //远程依赖
}