最近整理了关于Gradle一些配置和介绍,总结如下:
/**
* 声明是Android程序(以插件的形式引入)
* 表示该module是一个app module,应用了com.android.application插件,如果是一个android library,那么这里写apply plugin: ‘com.android.library’
*/
apply plugin: 'com.android.application'
/**
* android配置插件等属性
*/
android {
//编译SDK的版本(基于哪个SDK编译,这里是API LEVEL)
compileSdkVersion 25
// build tools的版本(基于哪个构建工具版本进行构建的)
buildToolsVersion "25.0.1"
//默认配置,如果没有其他的配置覆盖,就会使用这里的
defaultConfig {
//应用的包名
applicationId "com.xzw.gradledemo"
//最小支持的SDK版本
minSdkVersion 10
//目标SDK版本
targetSdkVersion 25
//版本号
versionCode 1
//版本名称
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//${UMENG_CHANNEL_VALUE}占位符会被dev替换(下面可以使用多渠道)
manifestPlaceholders = [UMENG_CHANNEL_VALUE: 'dev']
//移除未使用的备用资源(下面表示将语言资源限定为仅支持英语和法语)
resConfigs "en", "fr"
//开启multidex支持(用于解决64K方法的问题)
multiDexEnabled true
//指定ndk需要类型的SO库
ndk {
abiFilters "armeabi-v7a"
abiFilters "x86"
abiFilters "armeabi"
abiFilters "arm64-v8a"
abiFilters "x86_64"
}
}
//java版本
compileOptions{
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
/**
* 忽略Lint检查
*/
lintOptions {
abortOnError false
}
/**
* 在Gradle 进行dex的可能会遇到内存不够用的情况,
* 错误信息大概是java.lang.OutOfMemoryError: GC overhead limit exceeded。
* 这个时候只需要配置dexOptions的javaMaxHeapSize大小即可,这里配置4g
*/
dexOptions {
javaMaxHeapSize "4g"
}
//打包的时候忽略一些文件可以在这配置
packagingOptions{
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
/**
* 签名配置
*/
signingConfigs {
release {
//签名证书文件
storeFile file("debug.keystore")
//证书的密码
storePassword"secretpassword"
//别名
keyAlias "gradleforandroid"
//key的密码
keyPassword "secretpassword"
}
debug {
//签名证书文件
storeFile file("release.keystore")
//证书的密码
storePassword"secretpassword"
//别名
keyAlias "gradleforandroid"
//key的密码
keyPassword "secretpassword"
}
}
/**
* 分割apk
*/
splits {
density {
//启用或者禁用密度分割
enable true
// 除了这些密度之外
exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi"
//兼容以下屏幕
compatibleScreens 'normal', 'large', 'xlarge'
}
}
/**
* 构建类型
* 构建不同类型提供团队内部使用
* 常用的有release和debug两种,可以在这里面启用混淆,启用zipAlign以及配置签名信息等。
*/
buildTypes {
debug{
//版本名字上加上后缀,如1.0.debug,这样方便调试的时候识别
applicationIdSuffix ".debug"
buildConfigField "String","API_URL","http://www.baidu.com"
buildConfigField "boolean", "LOG_HTTP_CALLS", "true"
resValue "string", "app_name", "Example DEBUG"
//设置默认的签名文件
//signingConfig signingConfig.release
}
jnidebug {
// 'initWith'属性允许您从其他构建类型中复制配置,如有不同配置只需要设置不同的属性即可
initWith debug
//版本名字上加上后缀,如1.0.jnidebug,这样方便调试的时候识别
applicationIdSuffix ".jnidebug"
jniDebuggable true
}
release {
//版本名字上加上后缀,如1.0.release,这样方便调试的时候识别
applicationIdSuffix ".release"
buildConfigField "String","API_URL","http://www.baidu.com"
buildConfigField "boolean", "LOG_HTTP_CALLS", "true"
resValue "string", "app_name", "Example DEBUG"
//是否开启混淆
minifyEnabled true
//是否ZIP优化
shrinkResources true
/**
* 删除一些无用的资源(资源压缩)
* 资源压缩目前不会移除 values/ 文件夹中定义的资源(例如字符串、尺寸、样式和颜色)。
* 这是因为 Android 资源打包工具 (AAPT) 不允许 Gradle 插件为资源指定预定义版本。
*/
shrinkResources true
/**
* 使用ProGuard 缩减apk文件大小(混淆所用的文件)
* getDefaultProguardFile(‘proguard-android.txt') 方法可从 Android SDK tools/proguard/ 文件夹获取默认 ProGuard 设置
* 要想做进一步的代码压缩,可尝试使用位于同一位置的 proguard-android-optimize.txt 文件。它包括相同的 ProGuard 规则,
* 但还包括其他在字节码一级(方法内和方法间)执行分析的优化,以进一步减小 APK 大小和帮助提高其运行速度。
*/
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//signingConfig signingConfig.release
/**
* 定制生成的apk文件名
* 输出apk名字:gradledemo_v1.0_2016-03-23_xiaomi.apk
*/
applicationVariants.all { variant ->
if (variant.buildType.name.equals('release')) {
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = "gradledemo${defaultConfig.versionName}_${releaseTime()}_${variant.flavorName}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
//针对很多渠道(多渠道打包,还会遇到一个问题,比如友盟统计的渠道号,Gradle处理办法:manifestPlaceholders,它允许我们动态替换我们在AndroidManifest文件里定义的占位符。)
productFlavors.all { flavor ->
manifestPlaceholders.put("UMENG_CHANNEL_VALUE",name)
}
}
}
/**
* 用于多渠道打包.定制不同版本
*/
productFlavors{
xiaomi{
//设置applicationId为: com.xzw.casedemo1
applicationId 'com.xzw.casedemo1'
//设置为设置applicationId为:com.xzw.gradledemo.xiaomi
applicationIdSuffix ".xiaomi"
//设置mainfest里面的多渠道的值
manifestPlaceholders.put("UMENG_CHANNEL_VALUE", 'xiaomi')
//设置版本号
versionName "1.0-xiaomo"
}
googleplay{
//设置applicationId为: com.xzw.casedemo2
applicationId 'com.xzw.casedemo2'
//设置为设置applicationId为:com.xzw.gradledemo.googleplay
applicationIdSuffix ".googleplay"
//设置mainfest里面的多渠道的值
manifestPlaceholders.put("UMENG_CHANNEL_VALUE", 'googlepaly')
//设置版本号
versionName "1.0-googleplay"
}
}
}
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
/**
* dependencies:不属于Android专有的配置了,它定义了该module需要依赖的jar,aar,jcenter库信息。
* dependencies有三种不同类型的依赖关系
*/
dependencies {
//1.添加所有在libs文件夹中的jar
compile fileTree(include: ['*.jar'], dir: 'libs')
//仅为测试的APK添加远程依赖。
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
//这种方式其实是正确的语法
compile group: 'com.android.support', name: 'appcompat-v7', version: '25.0.1'
//2.远程依赖库(这个是上面的简写一般我们都这么写)
compile 'com.android.support:appcompat-v7:25.0.1'
//使用JUnit单元测试
testCompile 'junit:junit:4.12'
//动态版本
compile 'com.android.support:recyclerview-v7:+'
//3.library库输出文件是.aar文件,包含了Android 资源文件,在library工程build/output/aar/下
// app内引用本地library项目
compile project(':mylibrary')
//多个library,libraries是文件夹名字
//compile project(':libraries:library名字')
//64k依赖库
compile 'com.android.support:multidex:1.0.0'
}