使用Gradle编译Android App的常见配置方式:
1、统一配置工程中的compileSdkVersion、buildToolVersion等
为什么要做统一的配置呢?如果我们每个module都分别配置, 当我们工程中引入的module越来越多的时候,如果想再次修改或升级版本,这个时候就需要一个个module修改,实在是麻烦了,使用统一配置,就如同一个全局变量,修改定义的地方,所有使用的地方都生效了,何乐而不为?方法如下:
1)在工程的根目录下的build.gradle配置全局参数,如:
ext {
compileSdkVersion = 23
buildToolsVersion = '23.0.1'
minSdkVersion = '14'
targetSdkVersion = '22'
supportLibraryVersion = '24.0.0'
gradleVersion = '2.0.0-beta7'
}
2)在app或者其它module中使用全局参数,如:
compileSdkVersion rootProject.compileSdkVersion
buildToolsVersion rootProject.buildToolsVersion
minSdkVersion rootProject.minSdkVersion
targetSdkVersion rootProject.targetSdkVersion
2、gradle.properties配置数据
这个配置文件也非常有用,我们可以用来配置工程的版本代码、版本名称、不同环境下的服务器地址等等,使用方法也很简单,方法如下:
1)在配置文件中定义各种参数,如工程版本代码、名称、测试地址、正式地址等,如下
VERSION_CODE=1
VERSION_NAME=1.0.001
signing_keyAlias=123
signing_certificate = 123
signging_certificatePassword = 123
signging_storePassword= 123
DEBUG_SERVER = "http://www.baidu.com";
RELEASE_SERVER = "http://www.baidu.com";
2)在需要用的地方使用,如build.gradle使用,如下
// 版本号、版本名称
versionCode project.properties['VERSION_CODE'].toInteger()
versionName project.properties['VERSION_NAME']
// 签名配置
signingConfigs {
debugConfig {
keyAlias "${signing_keyAlias}"
keyPassword "${signging_certificatePassword}"
// 当前表示build.gradle所在文件夹上三层文件夹下的BuildCfg文件夹下的配置文件(路径可以自定义)
storeFile file("../../../BuildCfg/${signing_certificate}")
storePassword "${signging_storePassword}"
}
}
// 测试环境、正式环境服务器url
buildTypes {
debug {
minifyEnabled false
buildConfigField('String', 'SERVER_URL', project.properties['DEBUG_SERVER'])
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
signingConfig signingConfigs.releaseConfig
buildConfigField('String', 'SERVER_URL', project.properties['RELEASE_SERVER'])
}
}
3)在源码中使用build.gradle配置的参数,debug包及release包自动使用各自配置的值,如2)中的SERVER_URL:
// 直接使用BuildConfig类获取配置的变量
String SERVER_URL = BuildConfig.SERVER_URL;
3、修改输出安装包的名称
默认输出的安装包名称常常为app-debug.apk、app-release.apk,如果我们想自定义下输入安装包的名称,比如,添加当前版本号,添加打包的时候等,如app名称_v1.0.0_2017-01-08_release.apk
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
//
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
def fileName
if (outputFile != null && outputFile.name.endsWith('.apk')) {
if (variant.buildType.name.equals('release')) {
fileName = "app_v${defaultConfig.versionName}_${releaseTime()}_release.apk"
} else if (variant.buildType.name.equals('debug')) {
fileName = "app_v${defaultConfig.versionName}_${releaseTime()}_debug.apk"
}
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
4、引入libs文件夹下的本地第三方库,如下图中引入libammsdk.jar
// 映射libs文件夹
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
// 引入第三方库文件
dependencies {
compile files('libsbammsdk.jar')
}
// 引入armeabli、x86下的.so文件
ndk {
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "mips", "mips64", "x86", "x86_64"
}
5、忽略lint错误
lintOptions {
abortOnError false
}
6、突然Dex超出方法数限制
multiDexEnabled true
7、打包时一些配置
minifyEnabled true // 混淆
zipAlignEnabled true // zip align(对齐,排列)优化。
shrinkResources true // 去掉没有用的资源文件
8、 常见的完整的buid.gradle
apply plugin: 'com.android.application'
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android {
compileSdkVersion rootProject.compileSdkVersion
buildToolsVersion rootProject.buildToolsVersion
defaultConfig {
applicationId "com.android.test"
minSdkVersion rootProject.minSdkVersion
targetSdkVersion rootProject.targetSdkVersion
versionCode project.properties['VERSION_CODE'].toInteger()
versionName project.properties['VERSION_NAME']
multiDexEnabled true
resConfigs "zh" //只保留英语和中文语言,可以减小APK大小
ndk {
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "mips", "mips64", "x86", "x86_64"
}
}
// 导入so文件
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
signingConfigs {
release {
storeFile file("app.jks")
storePassword "123"
keyAlias "app"
keyPassword "123"
}
}
lintOptions {
abortOnError false
}
buildTypes {
debug {
minifyEnabled false
buildConfigField('String', 'SERVER_ADDRESS', project.properties['IP_DEBUG'])
buildConfigField('int', 'SOCKET_PORT', project.properties['PORT_DEBUG']);
signingConfig signingConfigs.debug
}
release {
buildConfigField "boolean", "LOG_DEBUG", "false"
minifyEnabled true // 混淆
zipAlignEnabled true // zip align(对齐,排列)优化。
shrinkResources true // 去掉没有用的资源文件
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField('String', 'SERVER_ADDRESS', project.properties['IP_RELEASE'])
buildConfigField('int', 'SOCKET_PORT', project.properties['PORT_RELEASE']);
// 更改输出release版的名称
// app_v[版本号]_[编译日期]_[release/debug].apk,例如:app_v1.0.0_2017-01-09_release.apk
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
def fileName
if (outputFile != null && outputFile.name.endsWith('.apk')) {
if (variant.buildType.name.equals('release')) {
fileName = "app_v${defaultConfig.versionName}_${releaseTime()}_release.apk"
} else if (variant.buildType.name.equals('debug')) {
fileName = "app_v${defaultConfig.versionName}_${releaseTime()}_debug.apk"
}
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
}
// productFlavors {
// app{}
// }
//
// productFlavors.all {
// flavor -> flavor.manifestPlaceholders = [FLAVOR_CHANNEL_VALUE : name]
// }
signingConfigs {
debug {
storeFile file("weixin.keystore")
storePassword "123"
keyAlias "spay"
keyPassword "123"
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.0'
compile files('libs/libammsdk.jar')
}