Gradle for android-配置文件
2018-09-29 本文已影响57人
crossroads
前言
在Android Studio下直接创建一个新的项目就可以使用啦!
一、Gradle设置文件
settings.gradle用于指示 Gradle 在构建应用时应将哪些模块包括在内。这里只包含了app模块
include ':app'
二、顶级构建文件
看项目下project的build.gradle,位于项目根目录
//buildscript为gradle本身配置仓库(repositories)和依赖(dependencies
buildscript{
//ext 添加自定义属性
ext.kotlin_version = '1.2.50'
//gradle用这个仓库搜索或下载依赖
repositories {
google()
jcenter()
mavenCentral()
}
//gradle构建项目需要使用的依赖
dependencies {
classpath 'com.android.tools.build:gradle:3.1.4'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
//项目中所有模块会用到的依赖,例如第三方的插件或库,
// 不是所有模块都会用到的依赖,应该放在模块的build.gradle中。
//这里只将都用到的仓库放在这里,而不配置任何一个依赖。
allprojects {
repositories {
google()
jcenter()
}
}
三、模块级构建文件
用于配置所在模块的构建设置
//应用插件
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
//配置构建项
android {
//编译版本,填写Android的版本号
compileSdkVersion 27
//build工具的版本号,Android系统每次添加新特性,就需要使用新的工具来build
// buildToolsVersion的版本需要>=CompileSdkVersion.
buildToolsVersion "28.0.3"
//默认配置,也可以重写AndroidManifest.xml的一些属性
//在需要多个版本时,可以被重写
defaultConfig {
//applicationId唯一识别发布的包名,当然源代码仍然使用AndroidManifest.xml中定义的包名
applicationId "com.example.crossroads.aa"
//最小sdk版本,即APP最低支持的手机版本
minSdkVersion 21
//指定API目标版本,要 <= compileSdkVersion。
// 如果来不及配置新的特性和系统,将其设置小一点。例如,如果不想动态申请权限,就将targetSdkVersion写成23以下,
//如果是>=23,就需要申请动态权限了。
targetSdkVersion 26
//APP的版本号
versionCode 1
//APP的版本名
versionName "1.0"
//允许方法数目超过64K,minsdk小于21的,需要添加multidex依赖,这里不展开讲解
multiDexEnabled true
//使用AndroidJUnitRunner进行测试
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
// 配置多种构建类型,默认有release和debug这两个类型
//debug在我们生成的默认配置中没有明确显示,但它已经包含了debug相关工具并用debug key进行签名
//release运用proguard的设置,默认没有签名。
buildTypes {
release {
//是否进行资源压缩
shrinkResources true
//是否进行混淆
minifyEnabled false
//混淆文件的位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
//flavor维度,可以有多个
flavorDimensions ('money','package')
//productFlavors对一套代码进行生成多个不同版本的apk,
// 当要求一套代码生成多个APP的时候,就可以用这个哦
//这里的配置可以覆盖defaultConfig
productFlavors {
//A APP
productA {
//配置A产品的applicationId
applicationIdSuffix ".A"
dimension 'package'
}
//B APP
productB {
//配置B产品的applicationId,这样就相当于是两个APP了。
applicationIdSuffix ".B"
dimension 'package'
}
free{
dimension 'money'
}
vip{
dimension 'money'
}
}
//APK拆分,只支持按照屏幕密度和ABI拆分,
// 使用这个需要让每一个APK拥有不同的versionCode
//这个开发期间没用过,不做详解,感兴趣的可以自行搜索APK拆分。
// splits {
// //按屏幕密度拆分
// density {
// enable false //启用屏幕密度拆分机制
// }
// abi {
// enable false //启用ABI拆分机制
// }
// }
}
//模块级别的依赖,后续详解
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:design:27.1.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
这里有一个dimension,是维度的意思,维度相同的包是互斥的,不同的包可以相互结合,见下图
四、新增构建类型
buildTypes {
......
beta {
// 复制调试属性和debug签名
initWith debug
versionNameSuffix 'b'
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//指定替代匹配,beta构建类型在库依赖项中没有响应配置,将会使用matchingFallbacks中第一个可用的配置。
matchingFallbacks = ['release', 'debug']
}
}
对每个构建类型重命名
buildTypes {
applicationVariants.all { variant ->
variant.outputs.all { output ->
outputFileName = "aa-${variant.flavorName}-${variant.buildType.name}-${variant.versionName}-${variant.versionCode}.apk"
}
}
}
这里我们输入命令./gradlew clean installfreeProductBDebug
,可以看到在outputs中会有aa-freeProductB-debug-1.0-1.apk文件,这就是我们重命名后的包。
五、过滤变体
将freeProductADebug和freeProductARelease过滤掉
variantFilter{variant->
def names =variant.flavors*.name
if(names.contains("freeProductA")){
setIgnore(true)
}
}
六、重写AndroidManifest.xml一些属性
AndroidManifest.xml中重写ACCESS_ID
<meta-data
android:name="ACCESS_ID"
android:value="${ACCESS_ID}"/>
build.gradle中这样写:
android {
defaultConfig {
manifestPlaceholders = [
ACCESS_ID:123456
]
}
...
}
如果对于不同的构建类型,这样写
buildTypes {
release {
......
manifestPlaceholders=[
ACCESS_ID:123456
]
}
}
七、配置项目范围的属性
在项目级别定义的属性,可以在所有模块中使用
project的build.gradle
ext {
compileSdkVersion = 27
}
模块的build.gradle
compileSdkVersion rootProject.ext.compileSdkVersion
这样子感觉有点长,那还有一个方式,放在gradle.properties中,也可以被所有模块使用
gradle.properties
BUILD_TOOLS_VERSION=28.0.3
模块的build.gradle
buildToolsVersion BUILD_TOOLS_VERSION