一、前言

Gradle 是以 Groovy 语言为基础,面向Java应用为主。基于DSL(领域特定语言)语法的自己主动化构建工具。

上面这句话我认为写得非常官方,大家仅仅需知道Gradle能够用来android开发中进行多个项目依赖的自己主动化编译脚本。知道这点也就知道我们使用它的目的;

为什么不使用Ant做自己主动化编译脚本,由于ant上手快,可是维护起来太不方便了。有了Gradle你能够跟项目组的同事说,用Ant的孩子们别苦逼的维护了,赶紧换成gradle吧。

本文面向gradle新手或者曾经使用过gradle低版本号的朋友,由于我感觉每次gradle升级那个脚本也有些坑爹,有些api就废弃掉了,只是整体感觉每次升级都让这个工具更加严谨话,易用话了。

二、Demo描写叙述

以下我就简单写一个demo。通过这个demo程序让大家怎样高速上手,比較有用的一个实例:

demo程序分为2个project,你能够直接有用eclipse新建一个androidproject,事实上我也是这么干的,这样一来大家细致看下图

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hhbmdlbXlzZWxm/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

这里顺便强调一下demoproject的环境配置:(非常重要,否则以下被我坑了别怪我提起没跟你说)

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。(使用最新的版本号2.2,no zuo no die,被坑不断。欢乐不断)

gradle的下载地址:http://www.gradle.org/documentation ,大家能够看看文档,当然你的E文好的话。会easy上手,只是没关系,看了我写的文章你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命令

好了准备工作完毕后。我们就開始正式讲讲这个demoproject了

TestDemoproject就写了一个activity。显示hello world!

Appcompatv7project大家懂得一个library。非常有代表性。我们实际项目中会用到多个library,你能够举一反三了。

以下看看文件夹文件:

你想运行编译脚本,须要2个配置文件。local.properties和settings.gradle

settings.gradle里的代码内容:

include ':appcompat_v7', ':TestDemo'

这里面能够看到是project的描写叙述。假设你有多个project如论主project还是引用的库project。都须要在这里面声明。否则gradle找不到

local.properties里的代码内容:

sdk.dir=D:\\dev\\adt-bundle-windows-x86-20140702\\sdk

这里面能够看到是android sdk的文件夹,自己填好,否则也会报错。

好了以下讲讲每一个project里面都须要配置一个build.gradle 文件

appcompat_v7project的build.gradle:


buildscript{
repositories{
mavenCentral();
} dependencies{
classpath 'com.android.tools.build:gradle:0.13.+' //假设使用gradle2.2版本号。请改为gradle:0.14.+
} 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版本号。这里就写成0.13.+包你没错。假设使用gradle2.2版本号,这里就要写成0.14.+

2、apply plugin:'android-library'。说明这个一个库project,具体自己找资料脑补

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都有。

TestDemoproject里的几个文件:

build文件夹:是gradle运行编译时候生成的。里面好多内容。有兴趣自己翻翻看

output文件夹:我写得脚本,最后把build里的apk自己主动copy到这个文件夹,这个能够具体看脚本

blue_key:apk签名文件

build.gradle:你懂得

TestDemoproject里面的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' //配置单个文件这样,这样的写法不能够了
			minifyEnabled true
            proguardFile getDefaultProguardFile('proguard-android.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依赖到主project的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'

这说明这个脚本须要编译的是一个 androidproject,跟上面的library是不是有所不同呢? gradle还支持java project的编译。大家自行查资料。

三、编译运行:

以下我们打开cmd命令窗体进行编译操作

在TestDemo文件夹运行gradle build。由于这里是local.properties和settings.gradle 所在的根文件夹。

第一次运行时候,gradle依据依赖去下载所须要的jar包,会在你每一个project里创建一个.gradle文件夹

dependencies{
classpath 'com.android.tools.build:gradle:0.13.+'
}

下载成功后

ok,那我们開始运行编译操作了。gradle build

编译正常的话会提示 BUILD SUCCESSFUL,然后自己去output文件夹找apk去。

这里提醒大家一个jar冲突会引起编译中断的问题:

由于非常多朋友的project的libs文件夹有多个android-support-v4.jar导致的。

最后啰嗦

今天先写到这。我们实际运用中有非常多需求,比如:自己主动依据多渠道打包。依据不同的资源和不同的pkg进行apk打包,gradle都能帮你搞定。这块demo兴许有时间我贴上来。
有什么问题,大家能够跟我交流(QQ群:221057495)。

四、參考资料:

After upgrading to Gradle 2.0: Could not find property 'Compile' on root projectUnable 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

五、扩展阅读:

引用配置文件中的变量,比如:我们能够引用gradle.properties

sdk.dir=C:\\haha\\dev\\adt-bundle-windows-x86_64-20140702\\sdk

在我们的build.gradle文件中假设要想引用sdk.dir

能够例如以下操作:

使用 project.hasProperty('sdk.dir') 推断key值是否存在
 使用project.properties['sdk.dir']进行key值的value引用

demo下载地址:

gradle2.1demo过程(哈评论)

版权声明:本文博主原创文章。博客,未经同意不得转载。

Gradle Android它自己的编译脚本教程的最新举措(提供demo源代码)的更多相关文章

  1. Gradle Android最新自动化编译脚本教程

    转自:http://blog.csdn.net/changemyself/article/details/39927381 一.前言 Gradle 是以 Groovy 语言为基础,面向Java应用为主 ...

  2. linux安装配置apk打包程序gradle+jdk+Android_sdk+python自动化编译脚本

    安装gradle: 1.下载gradle包 去这里下载需要的tar.gz包:https://services.gradle.org/distributions/ 2.解压 tar zxvf gradl ...

  3. 转:Android开发实践:用脚本编译Android工程

    转自: http://ticktick.blog.51cto.com/823160/1365947 一般情况下,我们都是使用Eclipse+ADT插件或者Android studio软件来编译Andr ...

  4. Android系统编译脚本理解

    android源码编译步骤: 1. repo sync 代码(下载代码) 2.start branch(用哪个分支,git相关) 3. 到根目录(android目录) $cd android/ 4. ...

  5. Android NDK学习(二):编译脚本语法Android.mk和Application.mk

    一.Android.mk Android.mk分为一下几部分: LOCAL_PATH:= $(call my-dir), 返回当前文件在系统中的路径,Android.mk文件开始时必须定义该变量. i ...

  6. Powershell极速教程-如何在三分钟内编写项目编译脚本

    分析及思路 来看一下项目目录结构 炒鸡正常的三板斧src+docs+tests.咦,怎么会多出一个build的文件夹呢,这就是我们今天要研究的目录.今天我会带着大家在五分钟之内编写一个极简的编译脚本. ...

  7. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  8. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. ------------------------------------- ...

  9. 使用Android Studio搭建Android集成开发环境(图文教程)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

随机推荐

  1. 【u243】拓扑排序

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 一些历史迷们打算把历史上的一些大事件按时间顺序列出来.但是,由于资料不全,每个事件发生的具体时间都没有 ...

  2. php 微信支付企业付款

    1.所需参数 字段名 变量名 必填 示例值 类型 描述 公众账号appid mch_appid 是 wx8888888888888888 String 公众号的appId 商户号 mchid 是 19 ...

  3. 《SPA设计与架构》之MV*框架

    原文 简书原文:https://www.jianshu.com/p/39f8f0aefdc2 大纲 1.认识MV*框架 2.传统UI设计模式 3.对框架的本质认识——框架有效性和框架分类 4.MV*基 ...

  4. POJ 1751 Highways (ZOJ 2048 ) MST

    http://poj.org/problem?id=1751 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2048 题目大 ...

  5. 实现拖拽上传文件的一款小控件——dropzone

    由于专注所以专业.非常多小巧的东西乍一看非常不起眼,却在特定的领域表现不俗,就是由于集中了热情. dropzone就是这样一款小控件,实现拖拽上传.它不依赖于其他像jquery等JS库.并且支持多方面 ...

  6. 一个神奇的控件——Android CoordinatorLayout与Behavior使用指南

    CoordinatorLayout是support.design包中的控件,它可以说是Design库中最重要的控件. 本文通过模仿知乎介绍了自定义Behavior,通过模仿百度地图介绍了BottomS ...

  7. 曼德勃罗(Mandelbrot)集合与其编程实现

    一.从科赫雪花谈起 设想一个边长为1的等边三角形(例如以下图所看到的).取每边中间的三分之中的一个,接上去一个形状全然类似的但边长为其三分之中的一个的三角形,结果是一个六角形.如今取六角形的每个边做相 ...

  8. JVM源码系列:ThreadMXBean 打出堆栈信息原理分析

    我们通常会使用工具jstack 去跟踪线程信息,其如何实现使用attach 的方式还是ptrace 的方式,这些可以去参考本人的博客的其他文章. 但这些方式都是外部使用的方式,如何直接使用java代码 ...

  9. $.ajax 请求 拦截器 重定向 无效 解决办法

    在ajax 异步请求下 拦截器过滤器中使用 重定向 页面响应无效 我这里用的是springboot框架,用拦截器实现 对请求的拦截 ,session超时直接跳转到login.html页面. 后台代码: ...

  10. Android 截取手机屏幕两种实现方案解析

    近期在开发的过程中,遇到了一个须要截取屏幕保存为图片的需求,详细为截取webview的视图保存图片. 方法1:首先想到的思路是利用SDK提供的View.getDrawingCache()方法: pub ...