Gradle是AndroidStudio默认的构建系统。Gradle使用Groovy语言作为主要的脚本语言。我们app项目的build.gradle和APPMoudle中的build.gradle文件是一个Groovy类。下面我来介绍一下Gradle的基本功能和进阶技巧。基本用法applyplugin:'com.android.application'android{compileSdkVersion26buildToolsVersion"26.0.0"defaultConfig{applicationId"com.renny.gradletest"minSdkVersion17targetSdkVersion26versionCode1versionName"1.0"testInstrumentationRunner"android.reiledJUnittest.runner"{buildIdRunlesupport.android.runner"{buildIdRunlesupport.android.runner".minifyEnabledfalseproguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}}}dependencies{compilefileTree(dir:'libs',include:['*.jar'])androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',{excludegroup:'com.android.support',module:'support-annotations'})compile'c??om.android.support:appcompat-v7:26.+'compile'com.android.support.constraint:constraint-layout:1.0.2'testCompile'junit:junit:4.12'}上面的代码是studio在刚刚构建Android项目时创建的默认Module中的build.gradle,使用的Gradle版本是2.3.3,Gradle的大部分功能配置也是在一个文件中实现的。applyplugin::用于指定使用哪个插件,开发中常用的值为'com.android.application':AndroidAPP插件(package为.apk文件)'com.android.library':Android库插件(package为.apk文件).aar文件)'java':普通java插件(打包为.jar文件)android{}用于指定Android打包插件的相关属性,其中包含如下节点compileSdkVersion(apiLevel):设置编译的AndroidversionusedattimebuildToolsVersion(buildToolsVersionName):设置编译时使用的构建工具的版本。defaultConfig:设置一些默认属性。可用属性是buildTypes和productFlavors的总和。(productFlavors不包含在默认文件中,后面会介绍)buildTypes:配置构建类型,可以产生不同类型的包。常见的是debug和release。当然你也可以添加N种productFlavors:配置不同风格的APP,在buildTypes的基础上,每种APP也可以有不同的风格,所以最后能玩的APK数量就是buildTypes乘以productFlavors.构建变量名称是productFlavors+buildTypes。dependencies:配置依赖,这可能是从eclipse切换到studio后最方便的地方。各种外部依赖,一行代码直接搞定,无需手动下载依赖包。其中compilefileTree(dir:'libs',include:['*.jar'])表示依赖libs目录下的所有jar文件。高级用法就好,上面的基本配置只是Gradle的简单用法,其实我们可以利用Gradle玩出很多花样。Manifest动态配置很多第三方SDK需要在AndroidManifest.xml中配置你的一些关键信息,以友盟推送为例:但是你做未测试包的key和官方包不一样,可以这样修改:然后在productFlavors中添加不同的版本信息,这样你打的不同包使用的appkey会不一样。manifestPlaceholders=[UMENG_CHANNEL:"0",UMENG_APPKEY:"123456789"]不仅可以动态配置这些自定义元数据,还可以修改android:icon,android:label标签,这样不同的包会有不同的图标。方便区分Moudle的动态依赖。在一个组件化的应用中,我们可能需要依赖测试包和官方包中不同的组件。比如测试环境需要调试模块,而正式环境则不需要。如果productFlavors如下,则调试模块名称为module-test。productFlavors{ceshi{}publish{}}然后就可以依赖dependencies中的test模块了:ceshiCompileproject(':module-test')和buildTypes也适用,两者可以一起使用也可以单独使用:debugCompileproject(':module-test'')ceshidebugCompileproject(':module-test')读取代码中的变量。以上功能是通过gradle单独配置的,但是对于不同的构建包,我们往往会有不同的需求需要体现在代码中:日志打印,Toast等。虽然BuildConfig.DEBUG字段是可以判断的,但是我们可以使用buildConfigField来给代码传递自定义值。比如不同的构建包需要不同的Host开头的API地址,不同的https证书路径等。用法是:buildConfigField'type','name','"vaule"'例如:defaultConfig{buildConfigField'String','author','"renny"'}以上添加到defaultConfig中,添加到buildTypes或productFlavors中会在不同的构建版本中出现不同的值。如果配置不同的applicationId,则可以在同一部手机上同时安装不同构建版本的应用。productFlavors{ceshi{applicationId"com.renny.test"buildConfigField"String","API_TEST","http://test.renny.com/android"}publish{applicationId"com.example.publish"buildConfigField"String","API_PUBLISH","http://publish.renny.com/android"}}经过上面的介绍,你可能会发现buildTypes和productFlavors的定义很相似,不同的是改变buildType不会改变应用程序的代码。他们只是处理不同的事情。你可以通过buildType获取更多技术细节(例如:构建优化、日志级别等),但应用的内容不会改变。相反,使用productFlavor配置可以改变app的内容(ps:内容可以想象成包理解,buildType不能改成applicationId)。Gradle任务Gradle任务适合做一些繁琐且容易出错的重复性手工工作,比如批量修改、复制、重命名文件等。例如applicationVariants.all任务可以为每个构建版本设置各种属性,比如修改每个构建版本生成的apk的名称:applicationVariants.all{variant->variant.outputs.each{output->output.outputFile=newFile(output.outputFile.parent,("app-${variant.buildType.name}"+"-"+newDate().format('yyyyMMdd')+".apk").toLowerCase())}}gradle会默认匹配生成每个productFlavors*buildTypes的构建版本,如果你想跳过其中的一些,你可以这样做:variantFilter{variant->if(variant.buildType.name.equals('release')){variant.setIgnore(!variant.getFlavors().get(1).name.equals('ceshi'));}if(variant.buildType.name.equals('debug')){variant.setIgnore(variant.getFlavors().get(1).name.equals('ceshi'));}}