Android gradle 学习文档

1. gradle 简介

Gradle是一款非常优秀的的项目自动化构建开源工具,在常用的开发软件Android studio中 默认使用此工具进行构建。在本文档中将介绍gradle常用的语句和命令。(此文档基于mac系统环境描述)

2. 学习准备

1. 安装java jdk

java jdk 的下载地址为:https://www.oracle.com/java/technologies/javase-downloads.html
在选择下载时需注意不可使用14.**jdk版本 ,对应下载如图所示在这里插入图片描述
下载时选择mac系统下载,按其后安装步骤继续即可。
安装完成后在路径/Library/Java/JavaVirtualMechines/下可以查看到我们安装的jdk

2. 配置gradle 环境变量

打开mac命令终端 输入以下指令:

cd $HOME
ls -a                   (运行此语句是为了查看是否存在.gradle文件夹)
touch .bash_profile
open -e .bash_profile
------------------------
在文件中写入 
export PATH=${PATH}:/User/你的用户名/.gradle/wrapper/dists/*****直至延续至bin目录
例如:
保存 关闭
------------------------
souece .bash_profile
gradle -v 				(查看安装版本)

3.gradle 常用操作

1.groovy基础

1.字符串

在groovy中 单引号和双引号均可作为字符串,但单引号字符串中不能对表达式进行运算 ,例如

	task showDiffOfMarks(){
		def name = "字符串"
		println '单引号输出的是:${name}'
		println "双引号输出的是:${name}"
	}

运行输出内容如下:

单引号输出的是:${name}
双引号输出的是:字符串

2.集合

1 List

在groovy中,集合可以直接通过下标进行访问,也可以使用复数下表表示从后向前计算。

task sampleList {
	def numberList = [0,1,2,3,4,5,6]
	println nunmberList[1]  //访问第二个元素
	println nunmberList[-1] //访问最后一个元素
	println nunmberList[-2] //访问倒数第二个元素
	println nunmberList[1..3] //访问2-4的元素
	numberList.each{
		println it
	}
}
2 Map

在groovy中,Map也可以类似于数组的访问形式进行访问,只是需替换为键值对的形式,具体如下参考代码。

task  sampleMap {
	def myMap = ['numberOne':1,'stringOne':'this is String']
	println myMap['numberOne'] 
	println myMap.stringOne
	myMap.each{
		println "Key:${it.key},Value:{it.value}"
	}
}

3.返回值

在groovy中return语句是可以被省略的,在没有return语句时,groovy回将最后一行代码作为返回值

task sampleReturn {
	def number1 = getMax 10,15
	def number2 = getMax 18,6
	println "number1:${number2},number2:${number2}"
}
def getMax(int n1,int n2){
	if(n1 > n2){
		n1
	}else{
		n2
	}
}

4.代码块参数

在groovy中可将代码块作为参数传递给其他函数,请看以下示例

def numberList = [0,1,2,3,4,5]
numberList.each{
	println it
}

在实际上 each的定义如下

public static <T> List<T> each(List<T> self, @ClosureParams(FirstGenericType.class) Closure closure) {
    return (List)each((Iterable)self, closure);
}

参照方法定义,传统的调用方法应该为

numberList.each({println it})

在groovy中规定了如果最后一个参数为代码块,可以将代码块放到方法外面,因此我们可以将代码块移到方法外面进行传递,同时可省略括号。

5.向闭包传递参数

闭包的概念实际上在第四条就已经涉略,List.each中传递的参数就是一个普通的闭包,但假设闭包需要有参数怎么办,可采用如下的方法:

def chooseMax = { 
	int numb1,int numb2 -> if(numb1 > numb2){
		numb1
	}else{
		numb2
	}
}
task sampleClosure{
	println choseMax(1,2)
}

2.常用task介绍

1 Copy

Copy:将文件复制到目标目录。此任务还可以在复制时重命名和过滤文件。该任务实现CopySpec用于指定要复制的内容。

方法名作用
from源目标文件夹
into将复制至的文件夹
include包含的文件
exclude不包含的文件
代码示例:
task sampleCopy(type:Copy){
    from 'testDoc/doc/'
    into 'testDoc/myDoc/'
    include '*.txt'
    exclude 'test.txt'
    rename 'mytest.*','mytest.txt'
}

2 Delete

Delete:删除文件或目录

方法名作用
delete使用该方法去删除文件或文件集
followSymlinks返回在删除时是否应遵循符号链接
task makePretty(type: Delete) {
  delete 'noUseFile', 'ownFile'
  followSymlinks = true
}

3 Jar

方法名(6.6前/6.6后)作用
baseName/archiveBaseName储存jar包的基本名称
excludes不包含的文件
includes包含的文件
from源文件目录(class文件)
into打抱成的jar包的目录结构
代码示例
task makeJar(type:org.gradle.api.tasks.bundling.Jar) {
    //指定生成的jar名 6.6版本后替换为 archivesBaseName
    baseName 'samplesdk'
    //从哪里打包class文件
    from('build/intermediates/javac/debug/classes/com/example/sdkmod/')
    //打包到jar后的目录结构
    into('com/example/sdkmod')
    //去掉不需要打包的目录和文件
    exclude('BuildConfig.class', 'R.class')
    //去掉R$开头的文件
     exclude{ it.name.startsWith('R$');}
}

4.其他task选项

此处的task并不一一列举,除上述外还有许多其他的task,使用为 org.gradle.api.tasks.** 见下方图片中的类或文件夹中的类
在这里插入图片描述
在这里插入图片描述

3.gradle 日志

级别作用使用方法
ERROR错误消息logger.quiet(“quiet”)
QUITE重要消息logger.error(“error”)
WARNING警告消息logger.warn(“warn”)
LIFECYCLE进度消息logger.lifecycle(“lifecycler”)
INFO信息消息logger.info(“info”)
DEBUG调试消息logger.debug(“debug”)
log打印的方式 gradle -q task
开关选项输出的日志级别
-------------
无选项LIFECYCLE 及其更高级别
-q 或者–quite QUITE
-i 或者–info INFO
-d 或者–debug DEBUG
task 中的方法作用
setProperty(“name”,value)给相应的变量赋值
dependOn(tasks)设置依赖的task
finalizedBy(task1)最后执行task1
doFirst{ *** }在此任务之前执行的代码(只有在传入方法体的时候才会运行)
doLast{ *** }在此任务之后执行的代码(只有在传入方法体的时候才会运行)
doSelf{ *** }任务本身执行的代码
shuldRunAfter(taskA)应该在taskA之后执行本任务
onlyif{ *** }当代码块返回值为true时,本任务才会被执行

4.gradle 生命周期

初始化阶段
在初始化阶段,Gradle会确定哪些项目参与构建,并且为这些项目创建一个Project实例。

配置阶段
在配置阶段,会构建的所有项目的构建脚本(build.gradle)

执行阶段
Gradle确定要在此期间创建和配置的任务子集。子集由传递给gradle命令和当前目录的任务名称参数确定,其后执行每个选定的任务。

//在project进行配置前调用,子工程必须在主工程中设置才会生效,主工程必须在settings.gradle中设置才会生效
void beforeProject(Closure closure)
//在project配置后调用
afterProject(Closure closure)
//构建开始前调用
void buildStarted(Closure closure)
//构建结束后调用
void buildFinished(Closure closure)
//所有project配置完成后调用
void projectsEvaluated(Closure closure)
//当settings.gradle中引入的所有工程都被创建好后调用,只在该文件设置才会生效
void projectsLoaded(Closure closure)
//settings.gradle配置完后调用,只对settings.gradle设置生效
void settingsEvaluated(Closure closure)

在setting.gradle中添加以下代码:

gradle.settingsEvaluated {
    println "settings:执行settingsEvaluated..."
}

gradle.projectsLoaded {
    println "settings:执行projectsLoaded..."
}

gradle.projectsEvaluated {
    println "settings: 执行projectsEvaluated..."
}

gradle.beforeProject { proj ->
    println "settings:执行${proj.name} beforeProject"
}

gradle.afterProject { proj ->
    println "settings:执行${proj.name} afterProject"
}

gradle.buildStarted {
    println "构建开始..."
}

gradle.buildFinished {
    println "构建结束..."
}

执行结果:

settings:执行settingsEvaluated…
settings:执行projectsLoaded…
Configure project :
settings:执行SDKMod beforeProject
settings:执行SDKMod afterProject
Configure project :app
settings:执行app beforeProject
settings:执行app afterProject
settings: 执行projectsEvaluated…

5.常用操作

1 debug和relese包

buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug{
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

2 生成可用于动态加载的Jar包

找到找到android sdk的目录 (/Users/你的用户名/Library/Android/sdk/build-tools/30.0.1)并进入到sdk目录中,将dx文件和lib/dx.jar文件一并复制到项目根目录中。并在.gradle文件中 编写

task makeMinifyJar(type:proguard.gradle.ProGuardTask,dependsOn:"build"){
    delete './build/libs/mif/minifySdk.jar'
    injars './build/libs/mytasksdk.jar'
    outjars './build/libs/mif/minifySdk.jar'
    configuration 'proguard-rules.pro'
}
String cmd = "./dx --dex --output=./mytestdexsdk.jar ./app/build/libs/mif/minifySdk.jar"
task creatDexJar(type: Delete) {
    def cmdResult = cmd.execute().text.trim()
    logger.info("cmd 执行结束"+cmdResult)
    delete('./build/libs/mif','./build/libs/mytasksdk.jar')
}
task clearJar(type: Delete) {
	//删除生成的jar文件
    delete 'libs/samplesdk.jar'
}
task makeJar(type:org.gradle.api.tasks.bundling.Jar) {
    //指定生成的jar名 6.6版本后替换为 archivesBaseName
    baseName 'samplesdk'
    //从哪里打包class文件
    from('build/intermediates/javac/debug/classes/com/example/sdkmod/')
    //打包到jar后的目录结构
    into('com/example/sdkmod')
    //去掉不需要打包的目录和文件
    exclude('BuildConfig.class', 'R.class')
    //去掉R$开头的文件
     exclude{ it.name.startsWith('R$');}
}
makeJar.finalizedBy(makeMinifyJar,creatDexJar)

在工程根目录终端下输入 gradle makeJar 待运行完成便可在根目录下见到输出的jar文件

生成不带buildconfig或者R.的jar包(非自定义task)

afterEvaluate {
    generateReleaseBuildConfig.enabled = false
    generateDebugBuildConfig.enabled = false
    generateReleaseResValues.enabled = false
    generateDebugResValues.enabled = false
}

或者

android{
	buildFeatures {
        buildConfig = false
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android学习文档 1 一、Android前言 3 1、Android发展历程 3 2、Android发展前景 8 3、Android 应用领域 9 二、准备工作 11 1、 Android开发环境搭建 11 1.1 第一种搭建Android的开发环境步骤: 12 1.2 第二种搭建Android的开发环境步骤: 12 2、AVD设备(模拟器) 13 3、Android的模拟器Emulator 14 4、DDMS调试 14 5、Android开发需知 14 5.1 Android目录结构 14 5.2 UI控件: 15 5.3 应用程序权限 15 6、第一个android应用程序 15 7、Android组件介绍 20 三、Android应用程序架构分析 21 1、Android布局组件介绍及其实例分析 21 2.1 布局组件概述 21 2.1.1 五大布局: 21 2.1.2 属性: 21 2.1.3 常用的长度单位解析: 21 2.2 线性布局 22 2.3 表格布局 22 2.4 相对布局 23 2.5 基本界面组件 23 2、Activity生命周期及其实例分析 24 1.1 Avtivity介绍 24 1.2 Activity的生命周期 25 1.2.1 Activity的三种状态 25 1.2.2 Activity在三种状态切换时调用的方法(7种) 25 1.2.3 Activity跳转与布局管理器 27 1.2.4 Activity中与跳转相关的方法 28 1.2.5 Activity的内部切换界面 28 1.2.6 Activity的用法 28 1.3 Avtivity的回调机制 28 四、事件处理机制 29 1、事件效果 29 2、事件监听器的处理模型 30 3、监听器的事件处理模型步骤 31 4、事件监听器必须实现事件监听器接口 31 5、实现事件监听器 31 6、基于回调的事件处理 32 7、基于回调的事件传播 32 五、 Android数据存储 32 1、android的数据存储 32 2、如何在android中使用SQlite数据库? 33 2.1 使用SharedPreferences 33 2.2 练习使用SharedPreferences 33 3、要读写其他应用的SharedPreferences怎么做? 33 六、 Json数据格式解析和xml解析 34 1、JSON简介 34 2、Gson介绍 34 3、JSON与XML 34 4、Android中对xml的解析 35 4.1 学习json数据格式,编写xml文件转化成实体bean的工具类 35 1.先写一个工具类,把list集合转化成xml格式,注意支持各种类型 35 分析:用dom4j来操作 35 2.涉及的知识 35 五、开发中会用到的技术 36 1、Selector技术 36 2、Tosat显示消息提示框技术 36 3、Handler消息传递机制 36 4、Handler类的主要作用 37 六、Android实例 38 1、做多米播放器的特效 38 2、做时钟的特效 39 1. 涉及的知识 40 一、完成”时钟”应用程序的操作 43 七、图形与图像处理 44
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值