您的位置:首页 > 移动开发 > Android开发

Android Gradle全局配置

2017-06-23 14:06 134 查看
Gradle是一个优秀的构建系统和构建工具,它允许通过插件创建自定义的构建逻辑。 基于Gradle以下的一些特点而选择了它:

1、采用了Domain Specific Language(DSL语言)来描述和控制构建逻辑。

2、构建文件基于Groovy,并且允许通过混合声明DSL元素和使用代码来控制DSL元素以控制自定义的构建逻辑。

3、支持Maven或者Ivy的依赖管理。

4、非常灵活。允许使用最好的实现,但是不会强制实现的方式。

5、插件可以提供自己的DSL和API以供构建文件使用。
6、良好的API工具供IDE集成。

Gradle全局配置:

一般我们各个module的build.gradle中都有这一段配置:

android {
compileSdkVersion 25
buildToolsVersion '25.0.0'
defaultConfig {
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
}

假如我们项目中有多个module,如果升级targetSdk、buildTool等,那么每个module都需要改值,不仅麻烦,还有可能导致module之间的版本不统一而出现问题,解决方法是Gradle配置全局变量供各个module使用,在你的Project的根目录下的build.gradle定义ext全局变量:

ext {
compileSdkVersion = 25
buildToolsVersion = '25.0.0'
minSdkVersion = 15
targetSdkVersion = 25
versionCode = 1
versionName = "1.0"
}

然后在各module中的build.gradle中引用如下:

android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
}
}


这样每次修改Project的build.gradle配置就可以实现全局配置了。

在release版本中关闭Log
我们在调试代码的时候希望显示Log日志信息,但是当我们发布到应用市场的时候我们又不希望我们的应用显示Log信息,因为这样会拖慢应用的运行速度甚至是暴露关键信息,那么该怎么办呢?可以通过配置buildTypes来达到在release版本中自动关闭Log的效果:

buildTypes {
release {
minifyEnabled false
buildConfigField "boolean", "IS_SHOW_LOG", NOT_SHOW_LOG
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
buildConfigField "boolean", "IS_SHOW_LOG", SHOW_LOG
}
}

配置的buildConfigField参数,编译后会在..\app\build\generated\source\buildConfig文件夹下会自动生成对应版本对应module的BuildConfig.java文件,该文件可以在代码中直接使用,上面配置信息中的NOT_SHOW_LOG和SHOW_LOG是在Project的gradle.properties中定义的值:

org.gradle.jvmargs=-Xmx1536m
SHOW_LOG true
NOT_SHOW_LOG false

先来解释下buildConfigField的用法, buildConfigField 使用示例:

buildConfigField "boolean", "IS_SHOW_LOG", NOT_SHO
cd85
W_LOG

buildConfigField 各参数含义:

buildConfigField备注
String type要创建的字段类型,如上面的boolean
String name要创建的字段名,如上面的IS_SHOW_LOG
String value创建此字段的值,如上面的NOT_SHOW_LOG(false)
配置好上面的信息后,在项目中编写一个LogUtil.java类如下:

public class LogUtil {
public static int v(String tag, String msg) {
if (BuildConfig.IS_SHOW_LOG) {
return Log.v(tag, msg);
} else {
return -1;
}
}
---------其他方法----------
}

上面对Log类做了一层封装,根据BuildConfig.IS_SHOW_LOG的值来决定是否打印Log,我们在buildTypes 的release 里面配置的IS_SHOW_LOG是false,在debug 里面配置的IS_SHOW_LOG是true,这样当我们调试的时候会显示log日志,而当我们打的是release 包的时候就会自动屏蔽了Log。
Build Variant 管理,多渠道打包

BuildTypes:定义了编译类型,针对每个类型可以有不同的编译配置(通常在混淆代码、可调试、资源压缩上做一些区分)。默认的有debug、release 类型,除了这两种外还可以手动添加编译类型(如preview)。
ProductFlavors:如果针对同一个BuildType还想编译出多个版本(如友盟多渠道打包,根据不同的meta-data中的值来区分不同的渠道),这时候就需要ProductFlavors了。

所以最后可以编出的APK的个数 = BuildTypes x ProductFlavors,即:

Build Variant = BuildTypes x ProductFlavors

友盟多渠道打包示例:

1、首先在AndroidManifest.xml中定义meta-data:

<meta-data
android:name="UMENG_CHANNEL"
//占位符,在build.gradle中赋值
android:value="${UMENG_CHANNEL_VALUE}" />

2、配置buildTypes

可以手写,也可以让Gradle自动生成,步骤:在app上点右键->Open Module Settings->点击Build Types 按钮,即可配置不同的buildType了,如下所示又加了一个preview :

buildTypes {
release {
minifyEnabled false
buildConfigField "boolean", "IS_SHOW_LOG", NOT_SHOW_LOG
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
buildConfigField "boolean", "IS_SHOW_LOG", SHOW_LOG
}
preview {
minifyEnabled false
buildConfigField "boolean", "IS_SHOW_LOG", SHOW_LOG
}
}

3、配置 productFlavors,可以手写,也可以让Gradle自动生成,步骤:在app上点右键->Open Module Settings->点击Flavors按钮,即可配置不同的Flavors了:
最后在生成的productFlavors中给UMENG_CHANNEL_VALUE赋值:

//给AndroidManifest.xml中的UMENG_CHANNEL_VALUE赋值
productFlavors {
market_meizu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "meizu"]
}
market_xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "meizu"]
}
market_huawei {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei"]
}
market_wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
market_yingyongbao {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
}
market_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
}
}

4、修改生成的APK名称

//获取时间戳
def getDate() {
def date = new Date()
def formattedDate = date.format('yyyyMMddHHmm')
return formattedDate
}

//修改APK生成名字  通过android.applicationVariants索引来遍历所有的 build variant
applicationVariants.all { variant ->
variant.outputs.each { output ->

def timeNow = getDate()
def newName
if (variant.buildType.name.equals('debug')) {
newName = "android-" + timeNow + "_v${variant.versionName}-debug.apk"
} else {
newName = "android_${variant.flavorName}_" + timeNow + "_v${variant.versionName}.apk"
}
output.outputFile = new File(output.outputFile.parent, newName)
}
}

如现在想生成 preview版本,在buildtypes中选择preview,选择我们要打的渠道包,点击finish

最后生成的渠道包,名字即是按我们想要的命名的

完整的build.gradle

apply plugin: 'com.android.application'

//获取时间戳 def getDate() { def date = new Date() def formattedDate = date.format('yyyyMMddHHmm') return formattedDate }

android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "org.ninetripods.mq.study"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
vectorDrawables.useSupportLibrary = true
buildConfigField "boolean", "IS_SHOW_LOG", "false"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
// ndk {
// abiFilters 'armeabi-v7a', 'armeabi'
// }

}
sourceSets {
main {
java.srcDirs = ['src/main/java', 'src/main/aidl']
}
}
buildTypes { release { minifyEnabled false buildConfigField "boolean", "IS_SHOW_LOG", NOT_SHOW_LOG proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { minifyEnabled false buildConfigField "boolean", "IS_SHOW_LOG", SHOW_LOG } preview { minifyEnabled false buildConfigField "boolean", "IS_SHOW_LOG", SHOW_LOG } }
productFlavors {
market_meizu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "meizu"]
}
market_xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "meizu"]
}
market_huawei {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei"]
}
market_wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
market_yingyongbao {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
}
market_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
// ndk {
// abiFilters 'armeabi'
// }
}
}

//修改APK生成名字 通过android.applicationVariants索引来遍历所有的 build variant
applicationVariants.all { variant ->
variant.outputs.each { output ->

def timeNow = getDate()
def newName
if (variant.buildType.name.equals('debug')) {
newName = "android-" + timeNow + "_v${variant.versionName}-debug.apk"
} else {
newName = "android_${variant.flavorName}_" + timeNow + "_v${variant.versionName}_${variant.buildType.name}.apk"
}
output.outputFile = new File(output.outputFile.parent, newName)
}
}
// externalNativeBuild {
// cmake {
// path 'CMakeLists.txt'
// }
// }
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
//汉字转拼音,通讯录 https://github.com/promeG/TinyPinyin // TinyPinyin核心包,约80KB
// 可选,适用于Android的中国地区词典
compile 'com.android.support:design:25.2.0'
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'com.android.support:recyclerview-v7:25.2.0'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.android.support:support-v4:25.3.1'
compile 'com.github.promeg:tinypinyin:2.0.3'
compile 'com.github.promeg:tinypinyin-lexicons-android-cncity:2.0.3'
testCompile 'junit:junit:4.12'
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: