我在书本上看到了基于Java的编译,脚本、编译器、注解等我觉得对于初学者来说有些复杂,我没有看下去,想到在平时的工作中使用的Gradle编译,自我感觉可以仔细了解下。Gradle是基于Groovy语言的编译脚本,Groovy不仅仅局限于编译java代码,还可以编译其他语言的代码,对于一个开发团队来说,这点非常重要。
Groovy 给 Java 开发人员提供了迄今为止最大的透明度. 其基本的符号和类型与 Java 是一样的,其封装结构和许多其他的地方也是如此。Groovy 在这基础上提供了更多的功能, 而且与 Java 有共同的基础。
以下根据W3Cschool的内容学习。(https://www.w3cschool.cn/gradle_user_guide/gradle_user_guide-s3k126h1.html)
Gradle 里的任何东西都是基于这两个基础概念:
projects ( 项目 )
tasks ( 任务 )
例1:
build.gradle
task hello{
doLast{
println 'Hello World!'
}
}
或
task hello << {
println 'Hello World!'
}
执行命令,这里的 -q 表示quiet 模式. 它不会生成 Gradle 的日志信息 (log messages)
>gradle -q hello
Hello World!
例2:
build.gradle
task upper{
String someString = 'Apple Dog'
println 'name = ' + someString
println 'UpperName = ' + someString.toUpperCase()
}
运行结果
>gradle -q upper
name = Apple Dog
UpperName = APPLE DOG
例3:
build.gradle
task count{
4.times {print "$it "}
}
运行结果
>gradle -q count
0 1 2 3
例4:任务之间的依赖关系
build.gradle
task hello{
println 'Hello World!'
}
task intro(dependsOn: hello){
println 'I am Gradle'
}
运行结果
>gradle -q intro
Hello World!
I am Gradle
例5:动态创建任务
build.gradle
4.times { counter ->
task "task$counter" << {
println "I am task number $counter"
}
}
运行结果
>gradle -q task1
I am task number 1
例6:任务创建以后,还可以加入额外的依赖
build.gradle
4.times { counter ->
task "task$counter" << {
println "I am task number $counter"
}
}
task1.dependsOn task2, task0
运行结果
>gradle -q task1
I am task number 0
I am task number 2
I am task number 1
例7:给一个已经存在的task加入行为
task hello{
println 'Hello Earth!'
}
hello.doLast {
println 'Hello Mars!'
}
hello << {
println 'Hello Jupiter!'
}
hello.doFirst {
println 'Hello Venus!'
}
运行结果
>gradle -q hello
Hello Earth!
Hello Venus!
Hello Mars!
Hello Jupiter!
例8:段标记 $ 可以访问任意一个已经存在的任务
build.gradle
task hello{
println 'Hello Earth!'
}
task test{
println "$hello.name"
}
运行结果
>gradle -q test
Hello Earth!
hello
例9:给任务加入自定义属性
build.gradle
task myTask {
ext.myProperty = "myValue"
}
task printmyProperty << {
println myTask.myProperty
}
运行结果
>gradle -q printmyProperty
myValue
例10:定义默认任务
build.gradle
defaultTasks 'cleans', 'run'
task cleans << {
println 'cleans'
}
task run << {
println 'run'
}
task other << {
println 'other'
}
运行结果
>gradle -q
cleans
run
例11:根据执行的任务不同产生不同的输出
build.gradle
task distribution << {
println "we build the zip version=$version"
}
task release(dependsOn: distribution) << {
println 'release now'
}
gradle.taskGraph.whenReady {taskGraph ->
if(taskGraph.hasTask(release)){
version = '1.0'
}else {
version = '1.0-SNAPSHOT'
}
}
运行结果
>gradle -q release
we build the zip version=1.0
release now
>gradle -q distribution
we build the zip version=1.0-SNAPSHOT
插件
插件是Gradle的扩展,Gradle自带了很多的插件,插件会通过一些方式控制工程的配置,还会加入一些预配置的任务。
在Gradle中增加java插件
build.gradle
apply plugin: 'java'
输入命令
>gradle tasks
可以看到build的所有任务
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.
其中一些有用的任务是
assemble | 编译并打包代码,但是不运行单元测试,有些插件会影响该任务的运行 |
---|---|
build | 编译代码 |
clean | 删除build目录和所有为build目录生成的文件 |
check | 编译并测试代码,有些插件会影响该任务的运行 |
外部依赖
编写java代码的时候经常会需要用到外部的依赖包,此时如果想要编译代码,就需要将这些依赖包写入build.gradle
加入Maven仓库
repositories {
mavenCentral()
}
加入一些依赖文件
dependencies {
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
compile group: 'junit', name: 'junit', version: '4.+'
定制项目
输入命令 gradle properties 可以列出项目的所有默认属性。此时我们可以通过修改build.gradle来定制项目,使得项目输出的属性不一样。
定制MANIFEST.MF文件
sourceCompatibility = 1.5
version = '1.0'
jar {
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version
}
}
测试阶段加入一个系统属性
test {
systemProperties 'property': 'value'
}
学到这里,我觉得有些头疼,其实我并不理解上面说到的maven库,测试阶段,或者是什么系统属性,再继续自学这个教程我觉得我会爆炸!!!
其实我学gradle的初衷也不过就是为了3个问题:如何打包jar包,如何引入依赖jar包,以及如何在安卓工程中使用gradle命令打包出一个可执行的手机apk。下面我就根据这3个问题进行调试。
首先,我们建一个非常简单的工程mycalculate,该工程只有一个src文件夹和一个build.gradle文件。
src目录下有2个文件
build.gradle
apply plugin: 'java'
jar {
manifest {
attributes("Main-Class": "com.study.wangxianlu.mycalculate", "Implementation-Title": "Gradle")
}
into('libs') {
from('src/com/study/wangxianlu/mycalculate/')
}
}
mycalculate.java,定义了2个函数
package com.study.wangxianlu.mycalculate;
public class mycalculate {
public double add(double a, double b) {
return a + b;
}
public double reduce(double a, double b) {
return a - b;
}
}
myoutput.java,定义了1个函数
package com.study.wangxianlu.mycalculate;
public class myoutput {
public void op() {
System.out.println("********** *********8");
}
}
在build.gradle所在目录下执行命令gradle build
生成jar文件
首先我们建一个安卓工程Gradlestudy
将刚刚生成的包放在lib文件夹下
右键->Add As Library
可以看到app下面的build.gradle中的依赖增加了一行
而jar包也变得可以打开,可以使用了
执行gradle assembleRelease
然后发现这个apk并不可用!!!需要对apk进行签名,然后我发现这篇文章写得很好https://www.jianshu.com/p/4b886a63b590
但是目前我并没有自己的签名,我只是学习而已,所以我想用android studio自带的签名。在build.gradle中增加这么几行
android {
signingConfigs {
releaseConfig {
keyAlias 'stone'
keyPassword 'android'
storeFile file('C:/Users/Administrator/.android/debug.keystore')
storePassword 'android'
}
}
buildTypes {
release {
//...
signingConfig signingConfigs.releaseConfig
}
}
}
执行gradle assembleRelease
emmmmm…此时没有任何apk文件生成,懵逼树上懵逼果,懵逼树下你和我???
执行gradle clean
再执行gradle build
出现apk
安装到手机
成功!!!
我有点懵~~~就这样吧
本篇over >_<