1.下载
访问https://services.gradle.org/distributions/下载指定版本的Gradle,比如Gradle-2.14.1-all.zip
2.配置
解压下载的压缩包,将gradle的路径配置到环境变量中,以mac为例:
cd ~
vi .bash_profile
在.bash_profile文件中配置:
export JAVA_HOME_7=/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
export JAVA_HOME_8=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
export JAVA_HOME=$JAVA_HOME_8
export ANDROID_HOME=/Users/haibozheng/Library/Android/sdk
export GRADLE_HOME=/Users/haibozheng/Documents/gradle_241/gradle-2.14.1 # 配置Gradle
export PATH=$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools:$GRADLE_HOME/bin # 配置Gradle
然后使配置生效
source .bash_profile
在命令行中使用:
$ gradle -version
------------------------------------------------------------
Gradle 3.3
------------------------------------------------------------
Build time: 2017-01-03 15:31:04 UTC
Revision: 075893a3d0798c0c1f322899b41ceca82e4e134b
Groovy: 2.4.7
Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM: 1.8.0_131 (Oracle Corporation 25.131-b11)
OS: Mac OS X 10.12.4 x86_64
当然,你也可参见官方文档:https://gradle.org/install
(1) setting.gradle
指定当前项目下总共有多少个module,用逗号分隔,项目名称前面有冒号;,比如:
就表示有app和lib两个module
include ':app', ':lib'
(2) 外层build.gradle
比如一个简单的项目的配置为:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
}
}
allprojects {
repositories {
mavenLocal()
maven {
credentials {
username "admin"
password "**"
}
url "http://xxxx"
}
jcenter()
}
}
这里,首先看buildscript闭包,它配置的是打包插件的仓库以及项目要使用的打包插件的依赖。比如我们使用了com.android.tools.build:gradle:2.2.3
插件,它对应的仓库在jcenter中。其次看allprojects闭包,它是为每个子项目也就是module配置仓库。当子项目获取依赖时,会按照优先级,依次从mavenLocal,maven,jcenter中拉取依赖。
apply plugin: 'com.android.library'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
minSdkVersion 14
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
provided 'com.android.support:appcompat-v7:25.0.1'
provided 'com.android.support:recyclerview-v7:+'
testCompile 'junit:junit:4.12'
}
如果module需要单独配置仓库,也可以在module的build.gradle文件中配置仓库:
repositories {
mavenLocal()
maven {
credentials {
username "admin"
password "**"
}
url "http://xxxx"
}
jcenter()
}
gradle tasks
$ gradle tasks
Incremental java compilation is an incubating feature.
:tasks
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
Android tasks
-------------
androidDependencies - Displays the Android dependencies of the project.
signingReport - Displays the signing info for each variant.
sourceSets - Prints out all the source sets defined in this project.
Build tasks
-----------
assemble - Assembles all variants of all applications and secondary packages.
assembleAndroidTest - Assembles all the Test applications.
assembleDebug - Assembles all Debug builds.
assembleRelease - Assembles all Release builds.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
clean - Deletes the build directory.
compileDebugAndroidTestSources
compileDebugSources
compileDebugUnitTestSources
compileReleaseSources
compileReleaseUnitTestSources
extractDebugAnnotations - Extracts Android annotations for the debug variant into the archive file
extractReleaseAnnotations - Extracts Android annotations for the release variant into the archive file
mockableAndroidJar - Creates a version of android.jar that's suitable for unit tests.
Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'SuperSwipeRefreshLayout-Demo-AS'.
components - Displays the components produced by root project 'SuperSwipeRefreshLayout-Demo-AS'. [incubating]
dependencies - Displays all dependencies declared in root project 'SuperSwipeRefreshLayout-Demo-AS'.
dependencyInsight - Displays the insight into a specific dependency in root project 'SuperSwipeRefreshLayout-Demo-AS'.
help - Displays a help message.
model - Displays the configuration model of root project 'SuperSwipeRefreshLayout-Demo-AS'. [incubating]
projects - Displays the sub-projects of root project 'SuperSwipeRefreshLayout-Demo-AS'.
properties - Displays the properties of root project 'SuperSwipeRefreshLayout-Demo-AS'.
tasks - Displays the tasks runnable from root project 'SuperSwipeRefreshLayout-Demo-AS' (some of the displayed tasks may belong to subprojects).
Install tasks
-------------
installDebug - Installs the Debug build.
installDebugAndroidTest - Installs the android (on device) tests for the Debug build.
uninstallAll - Uninstall all applications.
uninstallDebug - Uninstalls the Debug build.
uninstallDebugAndroidTest - Uninstalls the android (on device) tests for the Debug build.
uninstallRelease - Uninstalls the Release build.
Publishing tasks
----------------
bintrayUpload - Publishes artifacts to bintray.com.
Verification tasks
------------------
check - Runs all checks.
connectedAndroidTest - Installs and runs instrumentation tests for all flavors on connected devices.
connectedCheck - Runs all device checks on currently connected devices.
connectedDebugAndroidTest - Installs and runs the tests for debug on connected devices.
deviceAndroidTest - Installs and runs instrumentation tests using all Device Providers.
deviceCheck - Runs all device checks using Device Providers and Test Servers.
lint - Runs lint on all variants.
lintDebug - Runs lint on the Debug build.
lintRelease - Runs lint on the Release build.
test - Run unit tests for all variants.
testDebugUnitTest - Run unit tests for the debug build.
testReleaseUnitTest - Run unit tests for the release build.
Other tasks
-----------
assembleDefault
extractProguardFiles
jarDebugClasses
jarReleaseClasses
transformResourcesWithMergeJavaResForDebugUnitTest
transformResourcesWithMergeJavaResForReleaseUnitTest
To see all tasks and more detail, run gradle tasks --all
To see more detail about a task, run gradle help --task
BUILD SUCCESSFUL
Total time: 6.589 secs
This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.14.1/userguide/gradle_daemon.html
如果要查看tasks之间的依赖,可以使用
gradle tasks --all
比如:assembleRelease的依赖
app:assembleRelease - Assembles all Release builds. [app:compileReleaseSources, lib:bundleRelease]
app:compileReleaseShaders
app:generateReleaseAssets
app:lintVitalRelease - Runs lint on just the fatal issues in the release build.
app:mergeReleaseAssets
app:mergeReleaseJniLibFolders
app:mergeReleaseShaders
app:packageRelease
app:processReleaseJavaRes
app:transformClassesWithDexForRelease
app:transformNative_libsWithMergeJniLibsForRelease
app:transformResourcesWithMergeJavaResForRelease
gradle taskNameXXX
gradlew :moduleName:taskName
如果当前机器安装的Gradle版本与编译项目所需要的Gradle版本不一致,我们可以使用gradle wrapper对项目进行编译。使用gradle wrapper之前,首先看一下gradle下的目录结构:
gradle
└── wrapper
├── gradle-wrapper.jar
└── gradle-wrapper.properties
其中,gradle-wrapper.properties的内容为:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-all.zip
使用Gradle Wrapper时,就会使用distributionUrl指定的Gradle版本。
注意:首次使用Gradlew时,会首先从distributionUrl中下载执行版本的Gradle,网络耗时较长。
与gradle类似,在mac下:
./gradlew xxxx
上传到jcenter仓库,我们可以使用android-maven-gradle-plugin和gradle-bintray-plugin插件,经过配置,将其上传。具体步骤如下:
为了安全起见,建议将用户名和API Key保存到本地的环境变量,比如:
export JCENTER_KEY=XXXXXX*****XXXXXXXX
export JCENTER_USER=nuptboyzhb
2) 在jcenter上创建repo
比如,创建一个名为maven的maven仓库,创建一个com.github.nuptboyzhb.uikit的包名,链接为https://bintray.com/nuptboyzhb/maven/com.github.nuptboyzhb.uikit
3) 配置插件
在最外层的build.gradle脚本中配置插件的依赖,比如:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
}
}
比如,我们针对lib
这个module的gradle配置如下:
apply plugin: 'com.android.library'
apply plugin: 'com.jfrog.bintray'
apply plugin: 'com.github.dcendents.android-maven'
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
minSdkVersion 14
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
lintOptions {
abortOnError false
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
provided 'com.android.support:appcompat-v7:25.0.1'
provided 'com.android.support:recyclerview-v7:+'
testCompile 'junit:junit:4.12'
}
def siteUrl = 'https://github.com/nuptboyzhb/SuperSwipeRefreshLayout'
def gitUrl = 'https://github.com/nuptboyzhb/SuperSwipeRefreshLayout.git'
group = "com.github.nuptboyzhb.lib.uikit"
version = "1.0.0"
project.archivesBaseName = 'superswiperefreshlayout'
def jCenterKey = System.getenv("JCENTER_KEY");
def jCenterUser = System.getenv("JCENTER_USER");
if (jCenterKey != null && jCenterUser != null) {
bintray {
user = jCenterUser
key = jCenterKey
configurations = ['archives']
pkg {
repo = "maven"
name = "com.github.nuptboyzhb.uikit"
websiteUrl = siteUrl
vcsUrl = gitUrl
licenses = ["MIT"]
publish = true
version {
name = '1.0.0'
vcsTag = '1.0.0'
gpg {
sign = false
//passphrase = '***'
}
}
}
}
}
其中,bintray闭包配置的是jcenter中,我们的仓库和账号信息。外层的
group = "com.github.nuptboyzhb.lib.uikit"
version = "1.0.0"
project.archivesBaseName = 'superswiperefreshlayout'
则分别是groupId,version,artifactId.
配置完成之后,我们可以通过执行bintrayUpload
任务,上次aar到我们的https://bintray.com/nuptboyzhb/maven/com.github.nuptboyzhb.uikit
仓库。
gradle bintrayUpload
上传完成之后,我们就可以在bintray.com的对应仓库中看到我们上次的aar包了。
上传成功之后,我们可以首先在自己的仓库下引用这个包,点击‘set me up’,我们可以看到,我们的仓库地址为:
repositories {
maven {
url "http://dl.bintray.com/nuptboyzhb/maven"
}
}
然后,在项目中就可以引用到我们的aar包了。
compile 'com.github.nuptboyzhb.lib.uikit:superswiperefreshlayout:1.0.0'
需要说明的是:我们当前是在http://dl.bintray.com/nuptboyzhb/maven
地址下maven仓库中获取的,如果需要同步到jcenter,需要点击Add to JCenter
提出申请。
比如,将aar发布到本地maven仓库。build.gradle配置如下:
apply plugin: 'maven'
group = 'com.github.nuptboyzhb.lib.uikit'
version = '1.0'
uploadArchives {
repositories {
mavenLocal()
}
}
然后执行uploadArchives命令:
gradle uploadArchives
其中,带有用户名和密码的maven仓库配置为:
uploadArchives {
repositories {
mavenLocal()
maven {
url "http://xxxxx"
credentials {
username = "xxxx"
password = "xxxx"
}
}
}
}
以如下dependencies配置为例:
dependencies {
compile 'com.android.support:appcompat-v7:25.0.1'
compile project(':lib')
compile fileTree(dir: 'libs', include: ['*.jar'])
provided 'com.android.support:appcompat-v7:25.0.1'
compile ('com.willowtreeapps.spruce:spruce-android:1.0.0',{
exclude group: 'com.android.support', module: 'appcompat-v7'
})
}
以上是5种写法:
1) 第一个是依赖appcompat-v7,并将其源码编译到module中
2) 第二个是依赖本项目下的名为lib的module
3) 第三个是依赖本module的libs目录下的jar包
4) 第四个:只是编译过程中依赖appcompat-v7,其源码并不编译到module中
5) 第五个:
比如,我们要依赖本地的cards.aar,并将card.aar放到当前module的libs目录。
allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}
dependencies {
compile(name:'cards', ext:'aar')
}
dependencies {
compile 'com.taobao.trip:xcore:1.0.0'
}
那个,经过gradle sync之后,这个aar包下载到哪个地方了呢?会不会每次都下载?带着这些疑问,我们可以看一下系统目录下的.gradle目录。以mac为例:
cd ~/.gradle/caches/modules-2/files-2.1
在这个目录下,就可以找到我们对应的aar包了。