什么是GradleGradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的领域特定(DSL)语言。AndroidStudio中新建项目成功后自动下载Gradle。Gradle有几个基本组件:1.整个项目的gradle配置文件build.gradle// Top‐level build file where you can add configuration options common to all sub‐projects/modules.buildscript {repositories {mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:1.1.0'// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files}}allprojects {repositories {mavenCentral()}}内容主要包含了两个方面:一个是声明仓库的源,我这里用的是mavenCentral(),jcenter可以理解成是一个新的中央远程仓库,兼容maven中心仓库,而且性能更优。另一个是声明了androidgradleplugin的版本,androidstudio1.1正式版必须要求支持gradleplugin1.1的版本。2.app文件夹下这个Module的gradle配置文件,也可以算是整个项目最主要的gradle配置文件apply plugin: 'com.android.application'buildscript {repositories {mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:1.1.0'}}android {compileSdkVersion 17buildToolsVersion 21.1.2defaultConfig {applicationId com.lippi.recorderminSdkVersion 15targetSdkVersion 17versionCode 1versionName '1.4'// dex突破65535的限制multiDexEnabled true// AndroidManifest.xml 里面UMENG_CHANNEL的value为 ${UMENG_CHANNEL_VALUE}manifestPlaceholders = [UMENG_CHANNEL_VALUE: channel_name]}sourceSets {main {manifest.srcFile 'src/main/AndroidManifest.xml'java.srcDirs = ['src/main/java']resources.srcDirs = ['src/main/resources']aidl.srcDirs = ['src/main/aidl']renderscript.srcDirs = ['src/maom']res.srcDirs = ['src/main/res']assets.srcDirs = ['src/main/assets']jniLibs.srcDir 'src/main/jniLibs'}// Move the tests to tests/java, tests/res, etc...instrumentTest.setRoot('tests')// Move the build types to build‐types/type// For instance, build‐types/debug/java, build‐types/debug/AndroidManifest.xml, ...// This moves them out of them default location under src/type/... which would// conflict with src/ being used by the main source set.// Adding new build types or product flavors should be accompanied// by a similar customization.debug.setRoot('build‐types/debug')release.setRoot('build‐types/release')}//执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。lintOptions {abortOnError false}//签名signingConfigs {debug {storeFile file(/home/lippi/.android/debug.keystore)}relealse {//这样写就得把demo.jk文件放在项目目录storeFile file(recorder.jks)storePassword recorderkeyAlias recorderkeyPassword recorder}}buildTypes {debug {// 显示LogbuildConfigField boolean, LOG_DEBUG, trueversionNameSuffix ‐debugminifyEnabled falsezipAlignEnabled falseshrinkResources falsesigningConfig signingConfigs.debug}release {// 不显示LogbuildConfigField boolean, LOG_DEBUG, false//混淆minifyEnabled true//Zipalign优化zipAlignEnabled true// 移除无用的resource文件shrinkResources true//前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明proguardFiles getDefaultProguardFile('proguard‐android.txt'), 'proguard.cfg'//签名signingConfig signingConfigs.relealse}}//渠道Flavors,配置不同风格的appproductFlavors {GooglePlay {}xiaomi {}umeng {}_360 {}baidu {}wandoujia {}}//批量配置productFlavors.all { flavor ‐flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]}compileOptions {sourceCompatibility JavaVersion.VERSION_1_7targetCompatibility JavaVersion.VERSION_1_7}applicationVariants.all { variant ‐variant.outputs.each { output ‐def outputFile = output.outputFileif (outputFile != null && outputFile.name.endsWith('.apk')) {def fileName = outputFile.name.replace(.apk, ‐${defaultConfig.versionName}.apk)output.outputFile = new File(outputFile.parent, fileName)}}}dependencies {compile fileTree(include: ['*.jar'], dir: 'libs')compile 'org.apache.commons:commons‐math:2.1'compile 'org.slf4j:slf4j‐log4j12:1.7.5'}}文件开头applyplugin是最新gradle版本的写法,以前的写法是applyplugin:‘android’,如果还是以前的写法,请改正过来。buildToolsVersion这个需要你本地安装该版本才行,很多人导入新的第三方库,失败的原因之一是buildversion的版本不对,这个可以手动更改成你本地已有的版本或者打开SDKManager去下载对应版本。applicationId代表应用的包名,也是最新的写法,这里就不在多说了。android5.0开始默认安装jdk1.7才能编译minifyEnabled(混淆)也是最新的语法,很早之前是runProguard,这个也需要更新下。proguardFiles这部分有两段,前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,免去了我们很多事,这个文件的目录在 /tools/proguard/proguard‐android.txt ,后一部分是我们项目里的自定义的混淆文件,目录就在 app/proguard‐rules.txt ,如果你用Studio1.0创建的新项目默认生成的文件名是 proguard‐rules.pro ,这个名字没关系,在这个文件里你可以声明一些第三方依赖的一些混淆规则,后面会具体讲到。compileproject(‘:extras:ShimmerAndroid’)这一行是因为项目中存在其他Module,你可以理解成AndroidLibrary,由于Gradle的普及以及远程仓库的完善,这种依赖渐渐的会变得非常不常见,但是你需要知道有这种依赖的。3.gradle目录下有个wrapper文件夹,里面可以看到有两个文件,我们主要看下gradle‐wrapper.properties这个文件的内容:#Fri Dec 19 21:59:01 CST 2014distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle‐2.2.1‐all.zip可以看到里面声明了gradle的目录与下载路径以及当前项目使用的gradle版本,这些默认的路径我们一般不会更改的,这个文件里指明的gradle版本不对也是很多导包不成功的原因之一4.settings.gradle这个文件是全局的项目配置文件,里面主要声明一些需要加入gradle的moduleinclude ':recorder' 文件中recorder是项目的module,如果还有其他module按照相同的格式加上去。Gradle多渠道打包由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了。以友盟统计为例,在AndroidManifest.xml里面会有这么一段:meta‐dataandroid:name=UMENG_CHANNELandroid:value=Channel_ID /里面的Channel_ID就是渠道标示。我们的目标就是在编译的时候这个