config.gradle
文件ext {
android = [
compileSdkVersion: 23,
buildToolsVersion: "23.0.3",
applicationId: "com.example.lizejun.repogradle",
minSdkVersion: 14,
targetSdkVersion: 23,
versionCode: 1,
versionName: "1.0",
testInstrumentationRunner: "android.support.test.runner.AndroidJUnitRunner"
]
dependencies = [
"support-v4" : 'com.android.support:support-v4:23.2.0',
"support-v7" : 'com.android.support:appcompat-v7:23.2.0'
]
}
复制代码
android
用来管理SDK
版本、版本号等,dependencies
用来管理依赖库的版本,它们都是一个数组,用逗号来分割,数组的每一个元素都是key:value
的格式。java
build.gradle
,新增:apply from: "config.gradle"
复制代码
Module
或者Library
中的build.gradle
文件中,引用对应的key
:android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
applicationId rootProject.ext.android.applicationId
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
testInstrumentationRunner rootProject.ext.android.testInstrumentationRunner
}
}
dependencies {
compile rootProject.ext.dependencies["support-v7"]
}
复制代码
依赖树的查看能够经过Android Studio
的插件Gradle View
来查看: android
View -> Tool Windows -> Gradle View
,以后会在最下方生成一个窗口,咱们经过这个窗口就能够看到对应项目的依赖关系:
除此以外,咱们也可使用如下的命令:windows
./gradlew -q app:dependencies
复制代码
一样能够得到相似的结果: api
(*)
,那么表示这个依赖被忽略了,这是由于其余顶级依赖中也依赖了这个传递的依赖,
Gradle
会自动分析下载最合适的依赖。
因为多个顶级依赖当中,可能包含了相同的子依赖,可是它们的版本不一样,这时候为了选择合适的版本,那么就须要使用一些必要的操做符来管理子依赖。数组
Transitive
默认为true
,表示gradle
自动添加子依赖项,造成一个多层树形结构;设置为false
,则须要手动添加每一个依赖项。bash
Transitive
configurations.all {
transitive = false
}
dependencies {
compile rootProject.ext.dependencies["support-v7"]
}
复制代码
最终获得的结果是,能够看到前面的子依赖项都没有了: app
Transitive
dependencies {
compile ('com.android.support:appcompat-v7:23.2.0') {
transitive = false
}
}
复制代码
Force
用来表示强制设置某个模块的版本:maven
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:23.1.0'
}
}
复制代码
以后打印,发现其依赖的包版本变成了23.1.0
: ide
exclude
该标识符用来设置不编译指定的模块工具
configurations {
all *.exclude group : 'com.android.support', module: 'support-v4'
}
复制代码
此时的依赖关系为:
exclude
后的参数有
group
和
module
,能够分别单独使用,会排除全部匹配项。
exclude
compile ('com.android.support:appcompat-v7:23.2.0') {
exclude group : 'com.android.support', module: 'support-v4'
}
复制代码
也会和上面得到相同的结果
同一配置下,某个模块的不一样版本同时被依赖时,默认使用最新版,Gradle
同步时不会报错。
Gradle
详解基本配置:AS
中的Android
项目一般至少包含两个build.gradle
,一个是Project
范围的,另外一个是Module
范围的,因为一个Project
能够有多个Module
,因此每一个Module
下都会对应一个build.gradle
。
Project
下的build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: "config.gradle"
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.1'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
复制代码
buildscript
下的repositories
是gradle
脚本自身须要的资源,allprojects
下的repositories
是项目全部模块须要的资源。build.gradle
//声明插件,代表这是一个Android程序;若是是库,那么应当是com.android.library
apply plugin: 'com.android.application'
//Android构建过程须要配置的参数
android {
//编译版本
compileSdkVersion rootProject.ext.android.compileSdkVersion
//buildTool版本
buildToolsVersion rootProject.ext.android.buildToolsVersion
//默认配置,同时应用到debug和release版本上
defaultConfig {
applicationId rootProject.ext.android.applicationId
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
testInstrumentationRunner rootProject.ext.android.testInstrumentationRunner
}
//配置debug和release版本的一些参数,例如混淆,签名配置等
buildTypes {
//release版本
release {
minifyEnabled false //是否开启混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //混淆文件位置
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile rootProject.ext.dependencies["support-v7"]
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
}
复制代码
下面对Android
构建过程当中须要配置的参数作一些解释:
compileSdkVersion
:告诉gradle
用那个Android SDK
的版本编译你的应用,修改它不会改变运行时的行为,由于它不会被包含进入最终的APK
中;所以,推荐使用最新的SDK
编译;若是使用Suppport Library
,那么compileSdkVersion
必需要大于等于它的大版本号。minSdkVersion
:应用最低可运行的要求;它必需要大于等于你所依赖的库的minSdkVersion
;targetSdkVersion
:Android
提供向前兼容的重要依据。(targetSdkVersion is the main way Android provides forward compatibility
) 由于随着Android
系统的升级,某个api
或者模块的行为有可能发生改变,可是为了保证老APK
的行为和之前兼容,只要APK
的targetSdkVersion
不变,那么即便这个APK
安装在新的Android
系统上,那么行为仍是保持老的系统上的行为。 系统在调用某个api
或者模块的时候,会先检查调用的APK
的targetSdkVersion
,来决定执行什么行为。minSdkVersion
和targetSdkVersion
最终会被包含进入最终的APK
文件中,若是你查看生成的AndroidManifest.xml
,那么会发现:
<uses-sdk android:targetSdkVersion="23" android:minSdkVersion="7" />
复制代码
因此,咱们通常遵循的规则是:
minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
复制代码
gradle
相关文件gradle.properties
配置文件,能够定义一些常量供build.gradle
使用,好比能够配置签名相关信息,例如keystore
位置、密码、keyalias
等。settings.gradle
用来配置多模块的,若是你的项目有两个模块Browser
和ScannerSDK
,那么就须要:include ':Browser'
include ':ScannerSDK'
project(':ScannerSDK').projectDir = new File(settingsDir, './ScannerSDK/')
复制代码
gradle
文件夹 里面有两个文件,gradle-wrapper.jar
和gradle-wrapper.properties
,后者当中指定了gradle
的版本。distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
复制代码
gradlew
和gradlew.bat
分别是Linux
和windows
下的批处理文件,它们的做用是根据gradle-wrapper.properties
文件中的distributionUrl
下载对应的gradle
版本,这样即便环境没有安装gradle
也能够编译。gradle
仓库gradle
有三种仓库:maven/ivy/flat本地
。
maven{
url "..."
}
ivy{
url "..."
}
flatDir{
dirs 'xxx'
}
复制代码
有些仓库取了别名:
repositories{
mavenCentral()
jcenter()
mavenLocal()
}
复制代码
gradle
任务经过如下指令,能够看到支持的任务:
./gradlew tasks
复制代码
Jar
包导入单个jar
文件:
compile files('libs/xxx.jar')
复制代码
导入libs
的多个jar
文件:
compile fileTree(dir: 'libs', include: ['*.jar'])
复制代码
maven
库compile 'groupId:artifactId:version'
复制代码
Project
在导入以前,须要在settings.gradle
中把模块包含进来,例如前面的ScannerSDK
模块:
compile project(':ScannerSDK')
复制代码
maven
库若是项目中须要的一些库文件再也不中央仓库中,而是在某个特定地址里,那么就须要在Project
中的build.gradle
中的allprojects
结点下或者直接配到某个模块中:
allprojects {
repositories {
maven {
url '地址'
}
}
}
复制代码
aar
compile 'com.aaa.xxx:core:1.0.1@aar'
复制代码
aar
首先,你的项目必须是一个库项目,以后在build.gradle
中进行配置:
apply plugin : 'com.android.library'
复制代码
以后,进入到该项目中,执行gradle
命令:
./gradlew assembleRelease
复制代码
生成的aar
放在/build/output/aar
文件当中
aar
首先,将aar
文件拷贝到对应目录下,而后在该模块的build.gradle
中声明flat
仓库:
repositories{
flatDir{
dirs '以build.gradle为根目录的相对路径'
}
}
复制代码
以后,在dependencies
结点下依赖该aar
模块:
dependencies{
compile (name:'xxx',ext:'aar')
}
复制代码
在此以前,咱们先了解几个基本的概念:
buildTypes
:构建类型,Android Studio
的Gradle
组件默认提供了debug
和release
两个默认配置,这里主要用因而否须要混淆,是否调试。productFlavors
:产品渠道,在实际发布中,根据不一样渠道,可能须要使用不一样的包名,甚至是不一样的代码。buildVaiants
:每一个buildTypes
和productFlavors
组成一个buildvariant
。以上咱们讨论的buildTypes
和productFlavors
能够经过每一个Module
中的build.gradle
的android
标签来配置。
下面,咱们先看一下不一样的productFlavors
,分别用来支持读取不一样的文件和替换不一样的字符串。
咱们首先在app/src
目录下新建两个目录,分别对应两个Flavor
,再在其中创建相同名字的文件Constant.java
,对里面的某个常量赋予不一样的值。
constantFlavor1
:package com.example.lizejun.repogradle;
public class Constant {
public static final String NAME = "flavor1";
}
复制代码
constantFlavor2
:package com.example.lizejun.repogradle;
public class Constant {
public static final String NAME = "flavor2";
}
复制代码
咱们的app
下的build.gradle
中的android
标签下添加以下几行代码,让两个Flavor
分别引用不一样的Constant
文件:
sourceSets {
constantFlavor1 {
java.srcDirs = ['src/constantFlavor1', 'src/constantFlavor1/java', 'src/constantFlavor1/java/']
}
constantFlavor2 {
java.srcDirs = ['src/constantFlavor2', 'src/constantFlavor2/java', 'src/constantFlavor2/java/']
}
}
productFlavors {
constantFlavor1 {}
constantFlavor2 {}
}
复制代码
以后咱们进行打包,能够获得如下不一样安装包,这两个apk
若是在其中引用的了NAME
,那么它会获得不一样的值:
buildConfig
类若是咱们只须要定义一些简单的值,那么咱们能够用buildConfig
类:
productFlavors {
constantFlavor1 {
buildConfigField "boolean", "BOOLEAN_VALUE", "true"
}
constantFlavor2 {
buildConfigField "boolean", "BOOLEAN_VALUE", "false"
}
}
复制代码
productFlavors {
constantFlavor1 {
buildConfigField "boolean", "BOOLEAN_VALUE", "true"
manifestPlaceholders = [label:"constantFlavor1"]
}
constantFlavor2 {
buildConfigField "boolean", "BOOLEAN_VALUE", "false"
manifestPlaceholders = [label:"constantFlavor2"]
}
}
复制代码
以后,咱们再在AndroidManifest.xml
中引用它:
android:label="${label}"
复制代码
首先是在android
标签下,咱们使用signingConfigs
来配置不一样的签名类型
signingConfigs {
eng {
keyAlias 'androiddebugkey'
keyPassword 'android'
storeFile file('debug.keystore')
storePassword 'android'
}
prd {
keyAlias 'androiddebugkey'
keyPassword 'android'
storeFile file('debug.keystore')
storePassword 'android'
}
}
复制代码
以后,再在buildTypes
的各个分支中引用对应的签名配置:
buildTypes {
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.eng
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.prd
}
}
复制代码
有时候,咱们须要在不一样的buildTypes
下,引用不一样的依赖,例如内存泄露的检测工具,咱们但愿在debug
版本时检查内存泄露,并在发生时在桌面上生成图标,可是在release
版本上咱们并不但愿这么作,这时候咱们能够这么写:
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
复制代码
这样,release
版本就不会在桌面生成内存泄露的图标。