Gradle是Android Studio中默认的构建系统。Gradle 采用了 Groovy 语言作为主要的脚本语言。我们app项目的 build.gradle 和APP Moudle里的build.gradle文件,就是一个 Groovy 类。接下来让我就介绍下Gradle的基本功能。
apply plugin: 'com.android.application'android {    compileSdkVersion 26    buildToolsVersion "26.0.0"    defaultConfig {        applicationId "com.renny.gradletest"        minSdkVersion 17        targetSdkVersion 26        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'    })    compile 'com.android.support:appcompat-v7:26.+'    compile 'com.android.support.constraint:constraint-layout:1.0.2'    testCompile 'junit:junit:4.12'}

上面的代码就是刚建好的Android工程时,studio为我们创建的默认Module里的build.gradle ,采用的Gradle版本是2.3.3。而Gradle大部分功能配置也是在个文件里实现的。
apply plugin::用来指定用的是哪个插件,开发中常见的值有

'com.android.application':Android APP插件(打包得到的是.apk文件)
'com.android.library':Android库插件(打包得到的是.aar文件)
'java':普通的java插件(打包得到的是.jar文件)

android{}用来指定Android打包插件的相关属性,其包含如下节点

compileSdkVersion(apiLevel):设置编译时用的Android版本
buildToolsVersion(buildToolsVersionName):设置编译时使用的构建工具的版本
defaultConfig:设置一些默认属性,其可用属性是buildTypes和productFlavors之和。(productFlavors默认文件里没有,会在后面介绍)

buildTypes:配置构建类型,可打出不同类型的包,常见的有debug和release两种,当然你还可以再增加N种

productFlavors:配置不同风格的APP,在buildTypes的基础上还可以让每一个类型的APP拥有不同的风格,所以最终可以打出的APK的数量就是buildTypes乘以productFlavors。构建的变量名称是productFlavors+buildTypes。

QQ截图20170824154702.png


dependencies:配置依赖,这项可定是从eclipse换到studio后感觉最方便的一处了。各种外部依赖直接一行代码搞定,不用手动下依赖包了。
其中 compile fileTree(dir: 'libs', include: ['*.jar'])的意思是依赖libs目录下全部的jar文件。

进阶用法

好了,上面的基本配置只是Gradle简单的用法,其实我们可以用Gradle玩出很多花样来。

manifest动态配置

很多第三方SDK需要在AndroidManifest.xml中配置你的一些key信息,以友盟推送为例:

但是你不同测试包和正式包的key是不同的,那么就可以这么修改:

然后在productFlavors中的各个版本中加上不同的信息,这样你打出的不同包采用的appkey也会不一样。

 manifestPlaceholders = [UMENG_CHANNEL: "0",                UMENG_APPKEY : "123456789"]

不仅这些自定义元数据可以动态配置,android:iconandroid:label这些标签也可以修改,这样打出的不同包就有不同的图标了,方便做区分

Moudle动态依赖

在组件化app里面,我们可能在测试包和正式包需要依赖不同组件。比如测试环境需要调试模块,但正式环境不需要。假如productFlavors如下,调试模块名字为module-test

productFlavors {    ceshi{    }    publish{    }}

那么在dependencies里面就可以这么依赖test模块:

 ceshiCompile project(':module-test')

同样buildTypes也是适用的,两者可以一起或单独使用:

 debugCompile project(':module-test')
 ceshidebugCompile project(':module-test')

代码中读取变量

上面的这些功能都是gradle单独配置的,但我们往往针对不同的构建包有不同的需要在代码中体现的需求:日志打印,Toast等等。
虽然BuildConfig.DEBUG字段就可以判断,但我们可以用buildConfigField向代码中传递自定义的值,比如不同构建包需要不同Host开头的api地址,不同的https证书路径等,用法为:

buildConfigField 'type', 'name', '"vaule"'

比如:

 defaultConfig {   buildConfigField 'String', 'author', '"renny"'}
QQ截图20170824164629.png
QQ截图20170824164629.png

上面的是加在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 来获取更多的技术细节(例如:build optimization,log level 等等),但是app的内容不会改变,相反的,使用productFlavor 配置可以改变app的内容(ps:内容可以设想成 package 理解,buildType 没法改 applicationId)。

Gradle task

Gradle task适合用来完成一些既繁琐又容易出错的重复性手工作,比如批量修改,复制,重命名文件。
比如applicationVariants.all这个task可以针对每个构建版本设置各种属性,比如修改每个构建版本生成的apk名字:

   applicationVariants.all { variant ->        variant.outputs.each { output ->            output.outputFile = new File(                    output.outputFile.parent,                    ("app-${variant.buildType.name}"+"-" + new Date().format('yyyyMMdd') + ".apk").toLowerCase())        }    }
QQ截图20170825120317.png
QQ截图20170825120317.png

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'));    }}





更多相关文章

  1. 使用android上传文件
  2. Android:Resources资源文件
  3. Android Studio 之 AndroidManifest.xml文件中的android:label属
  4. android 创建文件夹失败
  5. Android从文件目录中写入和读取图片
  6. 布局文件中的笔记

随机推荐

  1. 【Android】一种提高Android应用进程存活
  2. SystemUI源码分析
  3. android AndroidManifest.xml 权限示例
  4. Android实现TextView动画缩放
  5. android 资料收集大全
  6. Android有进度条的下载图片并且显示图片
  7. Android 系统 图标的使用
  8. Android相关sdk使用
  9. android logger 简要分析 (kernel 3.0.0)
  10. Android(安卓)画图之抗锯齿