Gradle Android最新自动化编译脚本教程
转自:http://blog.csdn.net/changemyself/article/details/39927381
一、前言
Gradle 是以 Groovy 语言为基础,面向Java应用为主。基于DSL(领域特定语言)语法的自动化构建工具。
上面这句话我觉得写得很官方,大家只需知道Gradle可以用来android开发中进行多个项目依赖的自动化编译脚本,知道这点也就知道我们使用它的目的;
为什么不使用Ant做自动化编译脚本,因为ant上手快,但是维护起来太不方便了,有了Gradle你可以跟项目组的同事说,用Ant的孩子们别苦逼的维护了,赶紧换成gradle吧。
本文面向gradle新手或者以前使用过gradle低版本的朋友,因为我感觉每次gradle升级那个脚本也有些坑爹,有些api就废弃掉了,不过总体感觉每次升级都让这个工具更加严谨话,易用话了。
二、Demo描述
下面我就简单写一个demo,通过这个demo程序让大家如何快速上手,比较实用的一个实例:
demo程序分为2个工程,你可以直接实用eclipse新建一个android工程,其实我也是这么干的,这样一来大家仔细看下图
这里顺便强调一下demo工程的环境配置:(很重要,否则下面被我坑了别怪我提起没跟你说)
jdk:C:\Program Files\Java\jdk1.8.0_20(注意:不要使用jre,gradle会提示你使用jdk的)
否则脚本会提示以下错误:
* What went wrong:
Execution failed for task ':appcompat_v7:compileReleaseJava'.
> Cannot find System Java Compiler. Ensure that you have installed a JDK (not just a JRE) and configured your JAVA_HOME
system variable to point to the according directory.
android-sdk:D:\dev\adt-bundle-windows-x86-20140702
android-api: 20, android4.4W(注意:做android开发你每次都是用最新的api编译是一个好习惯)
gradle:2.1,(使用最新的版本,no zuo no die,被坑不断,欢乐不断)
gradle的下载地址:http://www.gradle.org/documentation ,大家可以看看文档,当然你的E文好的话,会容易上手,不过没关系,看了我写的文章你gradle的文档你可以不看了,因为很多东西你用不上,除非你项目中使用了特别复杂的功能
gradle2.1的api文档:http://www.gradle.org/docs/current/javadoc/org/gradle/api/Project.html ,这个需要你偶尔翻翻,因为简单功能会用上的
环境变量配置:
JAVA_HOME,GRADLE_HOME都要添加到环境变量里
当然了path变量里你也要加上 JAVA_HOME/bin,和GRADLE_HOME/bin,这样下面你开一个CMD命令行,才可以方面使用gradle build命令
好了准备工作完成后,我们就开始正式讲讲这个demo工程了
TestDemo工程就写了一个activity,显示hello world!
Appcompatv7工程大家懂得一个library,很有代表性,我们实际项目中会用到多个library,你可以举一反三了。
下面看看目录文件:
你想运行编译脚本,需要2个配置文件,local.properties和settings.gradle
settings.gradle里的代码内容:
include ':appcompat_v7', ':TestDemo'
这里面可以看到是project的描述,如果你有多个工程如论主工程还是引用的库工程,都需要在这里面声明,否则gradle找不到
local.properties里的代码内容:
sdk.dir=D:\\dev\\adt-bundle-windows-x86-20140702\\sdk
这里面可以看到是android sdk的目录,自己填好,否则也会报错。
好了下面讲讲每个工程里面都需要配置一个build.gradle 文件
appcompat_v7工程的build.gradle:
buildscript{
repositories{
mavenCentral();
} dependencies{
classpath 'com.android.tools.build:gradle:0.13.+'
} tasks.withType(JavaCompile) { options.encoding = "UTF-8" }
} apply plugin:'android-library' dependencies{
compile fileTree(dir:'libs',include:"*.jar")
} android{
compileSdkVersion 20
buildToolsVersion "20"
enforceUniquePackageName=false lintOptions{
abortOnError false
} sourceSets{
main{
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
} lintOptions{
abortOnError false
}
}
对于这个文件我需要强调几点:
1、classpath 'com.android.tools.build:gradle:0.13.+' ,很多人用了低版本出了问题写什么0.11+,我不管,你要使用gradle2.1版本,这里就写成1.13+包你没错。
2、apply plugin:'android-library',说明这个一个库工程,详细自己找资料脑补
3、tasks.withType(JavaCompile) { options.encoding = "UTF-8" } ,task是个啥自己查去,这里编译encoding配成UTF-8,还有一点在低版本脚本有的人写成tasks.withType(Compile) ,这样子报错了,改成JavaCompile吧,我是一点一点排错的
4、android{
compileSdkVersion 20
buildToolsVersion "20"
这里面version写20,为啥?上面你看看我的android-sdk api的版本就知道了,写成别的也可以,你要保证你本地androidsdk都有。
TestDemo工程里的几个文件:
build目录:是gradle执行编译时候生成的,里面好多内容,有兴趣自己翻翻看
output目录:我写得脚本,最后把build里的apk自动copy到这个目录,这个可以具体看脚本
blue_key:apk签名文件
build.gradle:你懂得
TestDemo工程里面的build.gradle
import java.util.regex.Pattern
//import com.android.builder.DefaultManifestParser
import com.android.builder.core.DefaultManifestParser buildscript{
repositories{
mavenCentral()
}
dependencies{
classpath 'com.android.tools.build:gradle:0.13.+' } /***
tasks.withType(Compile){
options.encoding = "UTF-8"
}
**/ tasks.withType(JavaCompile) { options.encoding = "UTF-8" }
} apply plugin:'android' dependencies{
compile fileTree(dir:"libs",include:'*.jar')
compile project(':appcompat_v7')
} android{
compileSdkVersion 20
buildToolsVersion "20"
enforceUniquePackageName=false defaultConfig{
targetSdkVersion 17;
} lintOptions{
abortOnError false
} dexOptions {
preDexLibraries = false
} packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
exclude 'META-INF/ASL2.0'
} signingConfigs{
myConfig{
storeFile file("bluekey")
storePassword "blue"
keyAlias "blue"
keyPassword "blue"
}
} buildTypes{
release{ runProguard true //打开混淆开关
proguardFile 'proguard.txt.txt' //配置单个文件这样 signingConfigs.myConfig
}
} sourceSets{
main{
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
//rendersrcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
} task copyNativeLibs(type: Copy) {
from(new File(project(':appcompat_v7').getProjectDir(), 'libs')) { include '**/*.so' }
into new File(buildDir, 'native-libs')
} tasks.withType(JavaCompile){
compileTask -> compileTask.dependsOn copyNativeLibs
} clean.dependsOn 'cleanCopyNativeLibs' tasks.withType( com.android.build.gradle.tasks.PackageApplication){
pkgTask -> pkgTask.jniFolders = new HashSet<File>()
pkgTask.jniFolders.add(new File(buildDir,'native-libs'))
} } build.doLast {
def today = new Date().format('yyMMdd');
copy{
//from('build/apk')
from('build/outputs/apk')
into('output')
include('TestDemo-debug.apk')
rename('TestDemo-debug.apk','blue-'+today+'-'+readVersion()+'-demo.apk')
}
} /**
*从Manifest.xml中读取版本号
**/
def readVersion(){
def manifestParser = new DefaultManifestParser()
return manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile);
}
对于这个文件我需要强调几点(很重要):
1、//import com.android.builder.DefaultManifestParser
import com.android.builder.core.DefaultManifestParser
//注释掉的代码是低版本的写法,目前使用最新api
2、 /***
tasks.withType(Compile){
options.encoding = "UTF-8"
}
**/
tasks.withType(JavaCompile) { options.encoding = "UTF-8" }
//注释掉的代码是低版本的写法,目前使用最新api
3、
dependencies{
compile fileTree(dir:"libs",include:'*.jar')
compile project(':appcompat_v7')
}
编译依赖,我们可以看到依赖的库 appcompat_v7要写在这里,注意":"(冒号一定要写)
4、
signingConfigs{
myConfig{
storeFile file("bluekey")
storePassword "blue"
keyAlias "blue"
keyPassword "blue"
}
}
buildTypes{
release{
signingConfigs.myConfig
}
}
编译时候签名文件配置,当然你也可以编译出debug和没有签名的apk,自行查资料去
5、
task copyNativeLibs(type: Copy) {
from(new File(project(':appcompat_v7').getProjectDir(), 'libs')) { include '**/*.so' }
into new File(buildDir, 'native-libs')
}
tasks.withType(JavaCompile){
compileTask -> compileTask.dependsOn copyNativeLibs
}
关于依赖的so文件和jar文件,在编译之前copy依赖到主工程的native-libs目录
6、build.doLast {
def today = new Date().format('yyMMdd');
copy{
//from('build/apk')
from('build/outputs/apk')
into('output')
include('TestDemo-debug.apk')
rename('TestDemo-debug.apk','blue-'+today+'-'+readVersion()+'-demo.apk')
}
}
/**
*从Manifest.xml中读取版本号
**/
def readVersion(){
def manifestParser = new DefaultManifestParser()
return manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile);
}
build.doLast,就是最后执行的意思,关于gradle task大家需要简单查资料掌握即可。
这里面需要注意的:
def today = new Date().format('yyMMdd');
def manifestParser = new DefaultManifestParser()
都需要def声明变量,低版本不用写的,但是目前不写就要报错了。
这个代码的功能:就是从Manifest文件里读出versioncode然后结合当前日期重新命名output里的apk文件。
方便吧,很实用的一点。
7、apply plugin:'android'
这说明这个脚本需要编译的是一个 android工程,跟上面的library是不是有所不同呢? gradle还支持java project的编译,大家自行查资料。
三、编译执行:
下面我们打开cmd命令窗口进行编译操作
在TestDemo目录执行gradle build,因为这里是local.properties和settings.gradle 所在的根目录。
第一次执行时候,gradle根据依赖去下载所需要的jar包,会在你每个工程里创建一个.gradle目录
dependencies{
classpath 'com.android.tools.build:gradle:0.13.+'
}
下载成功后
ok,那我们开始执行编译操作了,gradle build
编译正常的话会提示 BUILD SUCCESSFUL,然后自己去output目录找apk去。
这里提醒大家一个jar冲突会引起编译中断的问题:
因为很多朋友的project的libs目录有多个android-support-v4.jar导致的。
最后啰嗦
四、参考资料:
After upgrading to Gradle 2.0: Could not find property 'Compile' on root project
Unable to resolve class in build.gradle using Android Studio 0.60/Gradle 0.11
How to configure build.gradle files of an existing project with actionbarsherlock lib?
Multiple settings gradle files for multiple projects building
Android Tools Project Site
demo下载地址:
gradle2.1demo教程(多评论哈)
Gradle Android最新自动化编译脚本教程的更多相关文章
- Gradle Android它自己的编译脚本教程的最新举措(提供demo源代码)
一.前言 Gradle 是以 Groovy 语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自己主动化构建工具. 上面这句话我认为写得非常官方,大家仅仅需知道Gradle能够用来an ...
- VS2008 自动化编译脚本
可以通过调用MSBuild来使VS2008进行自动化编译. 1.新建文本文件,后缀名改为bat 2.文件内加上: ;转到MSBuild.exe路径 c: cd\ cd C:\Windows\Micro ...
- linux安装配置apk打包程序gradle+jdk+Android_sdk+python自动化编译脚本
安装gradle: 1.下载gradle包 去这里下载需要的tar.gz包:https://services.gradle.org/distributions/ 2.解压 tar zxvf gradl ...
- Android最新源码4.3下载-教程 2013-11
Android最新源码4.3下载-教程 有的下载会出现问题: 需要 修改manifest.xml中的fetch: "git://Android.git.linaro.org/" ...
- [Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程
本文转载自:[Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...
- Android应用开发编译框架流程与IDE及Gradle概要
1 背景 建议阅读本文之前先阅读<Android Studio入门到精通>和<Groovy脚本基础全攻略>及<Gradle脚本基础全攻略>三篇博客作为背景知识,这样 ...
- linux软件管理之------编译安装nginx服务器并手动编写自动化运行脚本
红帽系列的 linux软件管理分为三类:1. rpm 安装软件.2. yum 安装软件.3. 源码包编译安装.前面两种会在相关专题给出详细讲解.源码包的编译安装是非常关键的,我们知道linux的相关版 ...
- Android系统编译脚本理解
android源码编译步骤: 1. repo sync 代码(下载代码) 2.start branch(用哪个分支,git相关) 3. 到根目录(android目录) $cd android/ 4. ...
- 【转】在Ubuntu上下载、编译和安装Android最新源代码
原文网址:http://blog.csdn.net/luoshengyang/article/details/6559955 看完了前面说的几本书之后,对Linux Kernel和Android有一定 ...
随机推荐
- 20165301 2017-2018-2 《Java程序设计》第五周学习总结
20165301 2017-2018-2 <Java程序设计>第五周学习总结 教材学习内容总结 第七章:内部类与异常类 内部类 在一个类中定义另一个类 非内部类不可以是static类 匿名 ...
- csu 1556(快速幂)
1556: Jerry's trouble Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 787 Solved: 317[Submit][Statu ...
- phpmailer发送邮件出现错误:stream_socket_enable_crypto(): SSL operation failed with code 1.
如果开了调试,调试进去会看到错误提示: smtp_code:"stream_socket_enable_crypto(): SSL operation failed with code 1. ...
- Jmeter----连接mysql数据库及常见问题处理
jmeter要链接mysql数据库,首先得下载mysql jdbc驱动包,(注:驱动包的版本一定要与你数据库的版本匹配,驱动版本低于mysql版本有可能会导致连接失败报错) 本人的数据为5.7.18, ...
- 0ra-12170 tns 连接超时
https://blog.csdn.net/zhaoxiangchong/article/details/8296980
- MINIBASE源代码阅读笔记之HFPage
HFPage heap file的page的类 成员 slot_t:用来表示页里的slot,包括offset和length slot[]:倒着生长的slot array slotCnt:有多少已用sl ...
- 《构建高性能 Web站点》笔记
书名:构建高性能Web站点 出版社: 电子工业出版社 ISBN:9787121170935 一 绪论 等待的时间: (1) 数据在网络上的传输时间 (2) 站点服务器处理请求并生成回应数据的时间 ( ...
- c++ primer 9 顺序容器
定义: #include <vector> #include <list> #include <deque> vector<int> svec; lis ...
- phpstorm+xdebug远程调试设置
1 xdebug扩展安装 1.1 xdebug扩展安装: 2 服务器PHP配置 3 phpstorm设置 3.1 添加远程debug 3.2 phpstorm设置: 4 浏览器插件安装 4.1 chr ...
- ref:ubuntu下如何批量修改文件后缀名
ref:https://blog.csdn.net/whuslei/article/details/6724900 ubuntu下如何批量修改文件后缀名 正确的方法是: 在命令行中输入 renam ...