MyException - 我的异常网
当前位置:我的异常网» Android » 【安卓札记】gradle入门

【安卓札记】gradle入门

www.MyException.Cn  网友分享于:2015-08-26  浏览:0次
【安卓笔记】gradle入门
随着Android Studio越来越完善,更多的开发者舍弃掉Eclipse。但是新的IDE与以往的Eclipse有很大区别,这导致部分开发者望而却步,其中一个大家觉得比较麻烦的是Android Studio采用的新的构建系统,gradle。那么这篇文章我将对gradle进行一个简单介绍(主要讲gradle配合Android Studio的使用),希望帮助大家熟悉gradle。

一. gradle是什么?
gradle跟ant/maven一样,是一种依赖管理/自动化构建工具。但是跟ant/maven不一样,它并没有使用xml语言,而是采用了Groovy语言,这使得它更加简洁、灵活,更加强大的是,gradle完全兼容maven和ivy。更多详细介绍可以看它的官网:http://www.gradle.org/
 

二.为什么使用gradle?

更容易重用资源和代码;
可以更容易创建不同的版本的程序,多个类型的apk包;
更容易配置,扩展;
更好的IDE集成;


三.gradle入门需知

  1.基本配置:
首先明确gradle跟maven一样,也有一个配置文件,maven里面是叫pom.xml,而在gradle中是叫build.gradle。Android Studio中的android项目通常至少包含两个build.gradle文件,一个是project范围的,另一个是module范围的,由于一个project可以有多个module,所以每个module下都会对应一个build.gradle。这么说有点抽象,看下面这个图:

这是一个android工程的project视图,上面那个是module下的build.gradle文件。下面那个是project下的build.gradle文件。这两个文件是有区别的,project下的build.gradle是基于整个project的配置,而module下的build.gradle是每个模块自己的配置。下面看下这两个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()
    }
}
注:大家可能很奇怪,为什么仓库repositories需要声明两次,这其实是由于它们作用不同,buildscript中的仓库是gradle脚本自身需要的资源,而allprojects下的仓库是项目所有模块需要的资源。所以大家千万不要配错了。

module#build.gradle:
//声明插件,这是一个android程序,如果是android库,应该是com.android.library
apply 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"
    }
    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库
}
defaultConfig中是一些基本配置,它会同时应用到debug/release版本上,下面列举了所有可配项及对应的值:


buildTypes结点很重要,这里可以配置构建的版本的一些参数,默认有两个构建版本release/debug,当然你可以自定义一个构建版本,比如叫foo,然后通过gradlew assembleFoo就可以生成对应的apk了。
buildTypes里还有很多可配置项,下面列举了所有可配项以及debug/release版本的默认值:

现在大家对build.gradle已经初步了解了,我们再看下其他一些与gradle相关的文件:
1.gradle.properties:
从名字上就知道它是一个配置文件,没错,这里面可以定义一些常量供build.gradle使用,比如可以配置签名相关信息如keystore位置,密码,keyalias等。
2.settings.gradle:
这个文件是用来配置多模块的,比如你的项目有两个模块module-a,module-b,那么你就需要在这个文件中进行配置,格式如下:
include ':module-a',':module-b'
3.gradle文件夹:
这里面有两个文件,gradle-wrapper.jar和gradle-wrapper.properties,它们就是gradle wrapper。gradle项目都会有,你可以通过命令gradle init来创建它们(前提是本地安装了gradle并且配置到了环境变量中)。

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

2.gradle仓库:
gradle有三种仓库,maven仓库,ivy仓库以及flat本地仓库。声明方式如下:
maven{
   url  "..."
}
ivy{
  url  "..."
}
flatDir{
 dirs 'xxx'
}
有一些仓库提供了别名,可直接使用:
repositories{
  mavenCentral()
  jcenter()
  mavenLocal()
}
3.gradle任务:
gradle中有一个核心概念叫任务,跟maven中的插件目标类似。
gradle的android插件提供了四个顶级任务
assemble  构建项目输出 
check  运行检测和测试任务
build 运行assemble和check
clean 清理输出任务
执行任务可以通过gradle/gradlew+任务名称的方式执,执行一个顶级任务会同时执行与其依赖的任务,比如你执行
gradlew assemble
它通常会执行:
gradlew assembleDebug
gradlew 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.jks
RELEASE_STORE_PASSWORD=123456
RELEASE_KEY_ALIAS=mykey
RELEASE_KEY_PASSWORD=123456
然后直接引用即可:
 storeFile file(RELEASE_STOREFILE)
 storePassword RELEASE_STORE_PASSWORD
 keyAlias RELEASE_KEY_ALIAS
 keyPassword 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.java
public static final String type = "release"
//build/generate/source/buildConfig/debug/包名/    路径下的BuildConfig.java
public static final String type = "debug"

























3楼chchmlml昨天 11:39
受用,感谢
Re: RowandJJ昨天 11:38
回复chchmlmlths
Re: RowandJJ昨天 16:39
回复chchmlmlths
2楼Neacy_Zz昨天 10:44
看完有收获的就是好文章。
1楼Hellowgy昨天 09:59
总结的很好... studio配置麻烦,将来会改进的。

文章评论

程序员应该关注的一些事儿
程序员应该关注的一些事儿
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
 程序员的样子
程序员的样子
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
漫画:程序员的工作
漫画:程序员的工作
10个调试和排错的小建议
10个调试和排错的小建议
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
中美印日四国程序员比较
中美印日四国程序员比较
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Java程序员必看电影
Java程序员必看电影
那些争议最大的编程观点
那些争议最大的编程观点
编程语言是女人
编程语言是女人
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
鲜为人知的编程真相
鲜为人知的编程真相
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
我的丈夫是个程序员
我的丈夫是个程序员
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
为什么程序员都是夜猫子
为什么程序员都是夜猫子
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员的鄙视链
程序员的鄙视链
程序员都该阅读的书
程序员都该阅读的书
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
总结2014中国互联网十大段子
总结2014中国互联网十大段子
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
我是如何打败拖延症的
我是如何打败拖延症的
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
每天工作4小时的程序员
每天工作4小时的程序员
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
代码女神横空出世
代码女神横空出世
如何成为一名黑客
如何成为一名黑客
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
旅行,写作,编程
旅行,写作,编程
一个程序员的时间管理
一个程序员的时间管理
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有