对于Android开发者来说Gradle是个绕不过去的技术点,只有能理解并熟练的使用Gradle才可以高效有序的开发。
简单来说Gradle就是一个新兴的项目构建工具,他有着很高的灵活度,可以满足我们很多的项目需求。关于Gradle的介绍可以看这篇博文:
Gradle for Android 系列:为什么 Gradle 这么火
Android中的一个project主要有四个Gradle文件:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
在这里边指定了使用的代码仓库,声明了使用的Android Gradle插件版本,在这里边主要是可以对整个项目进行配置,这些配置适用于该项目下的所有Module
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.wei.rxjavademo"
minSdkVersion 21
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
}
在这里边主要是对于指定的Module进行具体的配置。主要分为三大块:apply plugin(声明了Gradle引入的插件),android(描述了该Android Module在构建过程中的配置参数等信息),dependencies(描述了构建过程中所有依赖的库)。我们绝大部分的配置都是在这里完成。
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Mon Jun 06 16:24:18 CST 2016
ndk.dir=E\:\\Android\\Android_SDK\\ndk-bundle
sdk.dir=E\:\\Android\\Android_SDK
这个文件主要是指定使用的SDK和NDK的路径,一般情况不需要改动。
include ':app'
这个里边主要是声明了整个项目所引用的Module,每当新建一个Module时就会自动的添加进来。
Gradle的配置项有很多,我们只需要知道一些常见的即可,更多更详细的Gradle配置项可以查看Android提供的Gradle参考文档:
Android Plugin DSL Reference
可以在Module的build.gradle文件的android领域内进行项目结构的自定义:
sourceSets{
main{
java.srcDirs=['src']
res.srcDirs=['src']
jniLibs.srcDirs=['libs']
jni.srcDirs=['jni']
}
}
可以根据需要配置相应的目录,达到修改文件目录的结果。
sourceSets{
main{
res.srcDirs=[
'src/main/src',
'src/main/res/layout/activity',
'src/main/res/lauout/fragment']
}
}
通过这样可以很好的对代码进行分类管理。
在project的gradle文件中可以通过ext来配置一些全局的属性,然后在Module文件中直接引用使用,这样可以保证版本的一致性和后期的可维护性。
在project的build.gradle中配置这些全局需要的变量
ext{
compileSdkVersion=23
}
在需要用到的Module的build.gradle文件中引用:
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.wei.rxjavademo"
minSdkVersion 21
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
}
这些操作都是在Module的build.gradle文件中配置的。
配置默认的一些属性:
一些常见的参数都可以在这里配置,最小版本号,目标版本号等。
defaultConfig {
applicationId "com.wei.rxjavademo"
minSdkVersion 21
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
配置buildTypes:
在这里可以针对不同的编译类型进行不同的配置,常见的有debug版本和release版本,也可以自定义编译类型,同时声明一些编译时的参数。
buildTypes {
debug{}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
wqc{
applicationIdSuffix ".wqc"
minifyEnabled false
}
}
同时buildType也支持通过继承的方式来进行拓展,而不必须每次都重新写一个:
wqc.initWith(buildTypes.debug)
wqc{
applicationIdSuffix ".wqc"
}
配置signingConfigs:
在这里可以配置签名信息,当然也可以每次打包时通过AS提供的窗口进行打包。
使用配置好的signingConfigs来进行签名:
//在我们之前自定义的编译版本中使用签名
wqc{
applicationIdSuffix ".wqc"
signingConfig signingConfigs.release
}
配置ProGuard:
可以通过配置ProGuard来进行代码混淆,但是不仅仅只是用于代码混淆,它可以对apk文件进行一定的优化和精简。
buildTypes {
debug{}
release {
//通过将minifyEnable 设置为true来开启代码混淆
//下边的文件一个是SDK提供的默认混淆文件,另一个是项目中的混淆规则文件,我们可以在里边进行混淆规则的定制。
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
System.properties方式:
在项目的gradle.properties文件中定义需要设置的参数名和具体的值
systemProp.keyAlias=myusingkey
在需要使用该参数的地方通过System.properties[]来获取相对应的值
keyAlias System.properties['keyAlias']
通过key/value的方式:
在gradle.properties文件中定义需要的变量参数:
wqc.keyAlias=myusingkey
使用时可以通过project.property来获取
keyAlias project.property('wqc.keyAlias')
关于Gradle的多渠道打包可以看慕课网的这个讲解视频,很详细完善:
Android apk多渠道打包
gradlew task : 查看项目中的所有Task
gradlew task –all:查看所有task的作用和相互之间的调用关系
gradlew assemble :可以编译出release包和debug包,可以使用gradlew assembleRelease或者gradlew assembleDebug来单独编译一种包
gradlew check:用于检测任务
gradlew clean:清理项目的中间数据
gradlew build:构建项目,相当于同时执行了check任务和assemble任务
以上就是一些Gradle的基础的使用方式,对于入门的初学者已经足够的,更高级和详细的配置可以查看Android给出的文档:Android Plugin DSL Reference 或者是查看Gradle的官网: Gradle官网