Gradle相关

来源:互联网 发布:cnc编程学徒工资待遇 编辑:程序博客网 时间:2024/05/09 03:03

Gradle笔记

一、Gradle是什么

Gradle在AndroidStudio中用来替代原来的Ant构建,是一个高级构建系统,允许通过插件创建自定义构建罗逻辑
- 基于Groovy的域特定语言(DSL),用于描述和操作构建逻辑
- 构建文件基于Groovy,并允许通过DSL混合声明元素,并使用代码来操纵DSL元素以提供自定义逻辑。
- 通过Maven和/或Ivy内置依赖管理。
- 非常灵活。允许使用最佳做法,但不强制自己的做事方式。
- 插件可以暴露自己的DSL和自己的API,以供构建文件使用。
- 良好的工具API允许IDE集成

二、Gradle在项目中的配置

AndroidStudio中一个Android项目中至少有两个build.gradle文件,一个是project级别的,用来配置整个project.一个是module级别的,用来配置对应的module而一个poject可能有多个module,所有每个module下都有有响应的一个build.gradle

  • project级别的build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript {    //构建过程依赖的仓库    repositories {    jcenter()}//构建过程需要依赖的库dependencies {     //下面声明的是gradle插件的版本     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}}//这里面配置整个项目依赖的仓库,这样每个module就不用配置仓库了allprojects {     repositories {          jcenter()     }}

这里我们看到仓库repositorie声明了2次,这是因为两次声明的作用不同,上面buildscript中的仓库是gradle脚标自身需要的资源,下面allprojects中的repositories仓库是项目中所有模块需要的资源

  • module级别的build.gradle
//声明插件,这是一个android程序,如果是android库,应该是com.android.libraryapply plugin: 'com.android.application'android {     //安卓构建过程需要配置的参数     compileSdkVersion 21//编译版本     buildToolsVersion "21.1.2"//buildtool版本     defaultConfig {//默认配置,会同时应用到debug和release版本上     applicationId "com.taobao.startupanim"//包名     minSdkVersion 15     targetSdkVersion 21     versionCode 1     versionName "1.0"}//构建类型,默认release和dubug两个构建版本 buildTypes {     //这里面可以配置debug和release版本的一些参数,比如混淆、签名配置等     release {         //release版本         minifyEnabled false//是否开启混淆         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆文件位置     }}}dependencies {     //模块依赖     compile fileTree(dir: 'libs', include: ['*.jar'])//依赖libs目录下所有jar包     compile 'com.android.support:appcompat-v7:21.0.3'//依赖appcompat库}

gradle相关文件

  • gradle.properties这是一个配置文件,里面可以用来定义常量给build.gradle使用,例如配置前面相关信息:keystore路径、keyalias和密码

  • setting.gradle 这是用来配置多模块的文件,如果project中有多个module,响应配置格式如下:

include ':molude_a',':module_b'
  • gradle文件夹 其中包含gradle-wrapper.jar和gradle-wrapper.properties

  • gradlew和gradlew.bat 这分别是linux下的shell脚本和windows下的批处理文件,它们的作用是根据gradle-wrapper.properties文件中的distributionUrl下载对应的gradle版本。这样就可以保证在不同的环境下构建时都是使用的统一版本的gradle,即使该环境没有安装gradle也可以,因为gradlewrapper会自动下载对应的gradle版本。
    gradlew的用法跟gradle一模一样,比如执行构建gradle build命令,你可以用gradlew build。gradlew即gradle wrapper的缩写。

-gradle任务 gradle的Android插件提供了4个顶级任务

assemble 构建项目输出check 运行检测和测试任务build 运行assemble和checkclean 清理输出任务

执行任务可以通过gradle/gradlew+任务名称的方式执,执行一个顶级任务会同时执行与其依赖的任务,比如你执行,它通常会执行:

gradlew assembleDebuggradlew assembleRelease

这时会在你项目的build/outputs/apk或者build/outputs/aar目录生成输出文件。
linux下执行构建任务需要首先更改gradlew脚本的权限,然后才能执行该脚本:

chmod +x gradlew./gradlew assemble

通过

gradlew tasks

列出所有可用的任务。在Android Studio中可以打开右侧gradle视图查看所有任务。

三.常见问题

1 导入本地jar包:

跟eclipse不太一样,android studio导入本地jar除了将jar包放到模块的libs目录中以外,还得在该模块的build.gradle中进行配置,配置方式是在dependencies结点下进行如下声明:

compile files('libs/xxx.jar')

如果libs下有多个jar文件,可以这样声明:

compile fileTree(dir: 'libs', include: ['*.jar'])

2.导入maven库:

compile 'com.android.support:appcompat-v7:21.0.3'

可见,格式为

compile 'groupId:artifactId:version'

3.导入某个project:

你的app是多模块的,假设有两个模块app和module-A,并且app模块是依赖module-A的,这时候我们就需要在app模块的build.gradle中的dependencies结点下配置依赖:

compile project(':module-A')

并且你需要在settings.gradle中把module-A模块包含进来:

include ':module-A',':app'

此外,这种情况下module-A模块是作为库存在的,因而它的build.gradle中的插件声明通常应该是这样的:

apply plugin: 'com.android.library'

而且,作为library的模块module-A的build.gradle文件的defaultConfig中是不允许声明applicationId的,这点需要注意。

4.声明三方maven仓库:

可能你项目需要的一些库文件是在你们公司的私服上,这时候repositories中仅有jcenter就不行了,你还需要把私服地址配到里面来,注意,应该配到project的build.gradle中的allprojects结点下或者直接配到某个模块中如果仅有这个模块用到。

配置方式:

repositories{     maven{          url="http://mvnrepo.xxx.com"     }}

5.依赖三方aar文件:

compile 'com.aaa.xxx:core:1.0.1@aar'

6.将库项目导出为aar:

首先你的项目必须是一个库项目,build.gradle中进行配置:

apply plugin : 'com.android.library'

然后你可以在命令行中进到项目目录,执行如下gradle任务:

gradlew assembleRelease//确保该目录下有gradlew文件

生成的aar在/build/output/aar文件夹中

7.引用本地aar:

首先将aar文件放到模块的libs目录下,然后在该模块的build.gradle中声明flat仓库:

repositories{    flatDir{          dirs 'libs'    }}

最后在dependencies结点下依赖该aar模块:

dependencies{      compile (name:'xxx',ext:'aar')}

8.排除依赖:

当出现依赖冲突的时候可以通过排除依赖解决,具体方式如下:

compile (group:'xxx',name:'xxx',version:'xxx'){      exclude group:'xxx',module:'xxx'//module对应的就是artifactId}

9.多dex支持(打包65k方法数限制)

首先在build.gradle的buildConfig中增加如下配置:

multiDexEnabled true

接着,在dependencies结点下增加如下依赖:

dependencies{compile 'com.android.support:multidex:1.0.0'}

最后,让你的Application继承MultiDexApplication,如果你的应用没有声明Application,可以在manifest文件的application结点下增加name属性,值为android.support.multidex.MultiDexApplication。

10.自动移除不用资源

可以在buildTypes结点中增加如下配置:

buildTypes{

 release{       minifyEnabled true       shrinkResources true }

}

11.忽略lint错误:

可以在build.gradle文件中的android结点下增加如下配置:

android{     lintOptions{           abortOnError false     }}

12.声明编译的java版本

可以在build.gradle文件中的android结点下增加如下配置:

compileOptions {     sourceCompatibility JavaVersion.VERSION_1_7     targetCompatibility JavaVersion.VERSION_1_7}

13.应用签名配置

首先在module的build.gradle中增加这些字段:

storeFiles:keystore文件存储位置,通常是.jks文件storePassword 密码keyAlias keystore别名keyPassword 密码

具体配置方式为:

首先在build.gradle的android结点下增加如下配置:

signingConfigs {     //debug版本的签名配置,通常不用配,因为有默认的debug签名     debug {     }     release {          storeFile file("key.jks")          storePassword "123456"          keyAlias "mykey"          keyPassword "123456"     }}

注:debug的默认签名为:

signingConfig android.signingCongfigs.debug

位置为

${home}\.android\debug.keystore

然后在buildTypes结点下的对应版本中添加上面的配置:

buildTypes{     release{          signingConfig signingConfigs.release     }}

当然,release不是固定的名称,你可以随便取,比如这样:

android {     signingConfigs {          debug {                storeFile file("debug.keystore")          }          myConfig {                storeFile file("other.keystore")                storePassword "android"                keyAlias "androiddebugkey"                keyPassword "android"          }     }     buildTypes {          foo {               debuggable true               jniDebuggable true               signingConfig signingConfigs.myConfig         }    }}

真实开发中,把密码配置到build.gradle中不是很好的做法,最好的做法是放在gradle.properties中:

RELEASE_STOREFILE=xxx.jksRELEASE_STORE_PASSWORD=123456RELEASE_KEY_ALIAS=mykeyRELEASE_KEY_PASSWORD=123456

然后直接引用即可:

storeFile file(RELEASE_STOREFILE)storePassword RELEASE_STORE_PASSWORDkeyAlias RELEASE_KEY_ALIASkeyPassword RELEASE_KEY_PASSWORD

14.定制buildConfig:

在build.gradle中配置:

buildTypes{      release{            buildConfigField "string","type","\"release\""      }      debug{            buildConfigField "string","type","\"debug\""      }}

这样就会在BuildConfig类中生成type字段:

//build/generate/source/buildConfig/release/包名/   路径下的BuildConfig.javapublic static final String type = "release"//build/generate/source/buildConfig/debug/包名/    路径下的BuildConfig.javapublic static final String type = "debug"

持续更新。。。

0 0
原创粉丝点击