Gradle生命周期&project&task,androidstudio开发环境配置

/**

  • 配置当前结点工程和其subproject的所有project(module)

*/

allprojects {

group ‘com.fuyao’

version ‘1.0.0’

}

println project(‘module_use’).group//com.fuyao

  • 不包括当前结点工程,只包括它的subproject(子module)

/**

  • 不包括当前结点工程,只包括它的subproject(子module)

*/

subprojects {

if (project.plugins.hasPlugin(‘com.android.library’)){

apply from:’…/public.gradle’

}

}

在module的build.gradle中
  • 获取父project

/**

  • 获取父project

*/

def getParentProject() {

def name = this.getParent().name

println “他的父project 是:${name}”

}

this.getParentProject()

/**

他的父project 是:ParallelSearchGradle

**/

  • 获取根project

/**

  • 获取根project

  • @return

*/

def getMRootProject() {

def name = this.getRootProject().name

println “根project是:${name}”

}

this.getMRootProject()

/**

根project是:ParallelSearchGradle

**/


属性


  • 扩展属性

/**

  • 扩展属性 在project的build.gradle中进行声明

*/

subprojects {

ext{

compileSdkVersion=28

libSupport=‘com.android.support:support-v4:28.0.0’

}

}

ext{

minSdkVersion=19

libConstraint=‘com.android.support.constraint:constraint-layout:1.1.3’

}

或者 新建gradle文件(例:public.gradle)

ext {

android = [targetSdkVersion: 28,

applicationId : ‘com.fuyao.parallelsearch’]

signconfigs = []

dependence = []

}

在project的build.gradle中引入

//引入公共库

apply from: this.file(‘public.gradle’)

或者在gradle.properties中声明

#****公共配置

##最低版本minSdkVersion

MIN_SDK_VERSION=19

##最高版本targetSdkVersion

TAR_SDK_VERSION=28

##编译版本compileSdkVersion

COMPILER_SDK_VERSION=28

##版本号

VERSION_CODE=1

##版本名称

VERSION_NAME=1.0

在module中进行引用

android {

compileSdkVersion this.compileSdkVersion

dataBinding {

enabled = true

}

defaultConfig {

applicationId rootProject.ext.android.applicationId

// minSdkVersion this.project.minSdkVersion

//或者

minSdkVersion this.minSdkVersion

targetSdkVersion rootProject.ext.android.targetSdkVersion

versionCode project.VERSION_CODE as int

versionName project.VERSION_NAME

testInstrumentationRunner “androidx.test.runner.AndroidJUnitRunner”

}

}

dependencies {

implementation fileTree(include: [’*.jar’], dir: ‘libs’)

implementation this.libSupport

// implementation this.project.libConstraint

//或者

implementation this.libConstraint

}


file相关API


  • 在project的build.gradle中

/**

  • 获取根工程的文件路径

*/

println “root file path==>${getRootDir().absolutePath}”

//root file path==>E:\workspace\work_demo\ParallelSearchGradle

/**

  • 获取当前工程build文件路径

*/

println “build file path==>${getBuildDir().absolutePath}”

//build file path==>E:\workspace\work_demo\ParallelSearchGradle\build

/**

  • 获取当前工程文件路径

*/

println “project file path==>${getProjectDir().absolutePath}”

//project file path==>E:\workspace\work_demo\ParallelSearchGradle

/**

*从当前gradle中寻找file

  • @param path

  • @return

*/

def getContent(String path){

try {

def file=this.file(path)//files

//相当于当前的project工程开始查找

return file.text

}catch(Exception e){

println ‘文件没有找到’

}

}

println getContent(‘public.gradle’)

/**

ext {

android = [targetSdkVersion: 28,

applicationId : ‘com.fuyao.parallelsearch’]

signconfigs = []

dependence = []

}

**/

  • 在module的build.gradle中

/**

  • 获取根工程的文件路径

*/

println “root file path==>${getRootDir().absolutePath}”

//root file path==>E:\workspace\work_demo\ParallelSearchGradle

/**

  • 获取当前工程build文件路径

*/

println “build file path==>${getBuildDir().absolutePath}”

//build file path==>E:\workspace\work_demo\ParallelSearchGradle\app\build

/**

  • 获取当前工程文件路径

*/

println “project file path==>${getProjectDir().absolutePath}”

//project file path==>E:\workspace\work_demo\ParallelSearchGradle\app

  • 文件copy

/**

  • 文件copy

*/

copy {

from file(‘ceshi.jks’)

into getRootProject().getBuildDir()//拷贝到根目录的build下

}

copy {

from file(‘ceshi.jks’)

into getRootDir()//拷贝到根目录下

}

/**

  • 拷贝文件夹

*/

copy {

from file(‘dev/release/’)

into getRootProject().getBuildDir().path + “/release/”//拷贝到根目录的build下release中

//筛选不想复制的内容

exclude { details ->

details.file.name.endsWith(’.json’)

}

//更改文件名称

rename { fileName ->

fileName.replace(‘parallelsearch’, ‘huang’)

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

开源分享完整内容戳这里

}

}

/**

  • 对文件树进行遍历

*/

fileTree(‘dev/release/’) { FileTree fileTree ->

fileTree.visit { FileTreeElement element ->

println “file name==>${element.file.name}”

copy {

from element.file

into getRootProject().getBuildDir().path + “/test/”

}

}

}

在这里插入图片描述

  • 执行外部命令(以copy apk包到windows桌面为例)

tasks.create(‘apkcopy’) {

doLast {

//gradle的执行阶段去执行

def sourcePath = this.buildDir.path + ‘\outputs\apk’

def desationPath = ‘C:\Users\Administrator\Desktop\downloads’

def command = “xcopy /s ${sourcePath} ${desationPath}”

try {

exec {

workingDir ‘C:\Users\Administrator\Desktop’

commandLine ‘cmd’, ‘/c’, command

println “执行外部命令copy成功”

}

} catch (Exception e) {

e.printStackTrace()

println “执行外部命令copy失败”

}

}

}

依赖相关API


buildscript {

//配置我们工程的仓库地址

repositories {

jcenter()

mavenCentral()

mavenLocal()

ivy {}

maven {

name ‘personal’

url ‘仓库地址url’

credentials {

username = ‘admin’

password = ‘admin123’

}

}

}

//配置我们工程的“插件”依赖地址

dependencies {

classpath ‘com.android.tools.build:gradle:3.4.1’

}

}


sourceSets


/**

在android{}中调用

**/

android{

sourceSets {

main {

jniLibs.srcDirs = [‘libs’]//修改so库存放位置

res.srcDirs = [‘src/main/res’,

‘src/main/res-ad’,

‘src/main/res-buy’]//修改res路径

}

}

}

/**

  • 在外部调用sourceSets

*/

this.android.sourceSets{

main {

jniLibs.srcDirs = [‘libs’]//修改so库存放位置

res.srcDirs = [‘src/main/res’,

‘src/main/res-ad’,

‘src/main/res-buy’]//修改res路径

}

}

相关配置均在AndroidSourceSet类中


Task任务


  • task定义

/**

  • task定义,直接通过task函数去创建

*/

task helloTask {

println “定义一个task”

}

task helloTask1(group: ‘huang’, description: ‘task study’) {

println “定义一个helloTask1”

}

/**

  • task定义,通过TaskContainer去创建Task

*/

this.tasks.create(name: ‘helloTask2’) {

println “定义一个helloTask2”

}

this.tasks.create(name: ‘helloTask3’) {

setGroup(‘huang’)//添加分组

setDescription(‘task study’)//添加描述信息

println “定义一个helloTask3”

}

给任务添加group会新增自定义的组方便在as任务列表中找到,否则均在other中

  • doFirst,doLast使用

/**

  • doFirst使用

*/

task helloTask4(group: ‘huang’, description: ‘task study’) {

println “定义一个helloTask4”

doFirst {

println “定义一个helloTask4-doFirst,他的group是:” + group

}

doLast {

println “定义一个helloTask4-doLast,他的group是:” + group

}

}

helloTask4.doFirst {

println “定义一个helloTask4-doFirst,他的description是:” + description

}

helloTask4.doLast {

println “定义一个helloTask4-doLast,他的description是:” + description

}

/**

  • 计算build执行时长

*/

def startBuildTime, endBuildTime

this.afterEvaluate {

//保证要找的task已经配置完毕

def preBuildTask = project.tasks.getByName(‘preBuild’)

preBuildTask.doFirst {

startBuildTime = System.currentTimeMillis()

println ‘开始编译时间:’ + startBuildTime

}

def buildTask = project.tasks.getByName(‘build’)

buildTask.doLast {

endBuildTime = System.currentTimeMillis()

println “编译时间:${endBuildTime - startBuildTime}”

}

}

  • Task依赖

/**

  • Task依赖

*/

task exHello {

doLast {

println ‘hello’

}

}

task exWorld {

doLast {

println ‘world’

}

}

task exMain(dependsOn: exHello) {

doLast {

println ‘main’

}

}

//任务多依赖

task exMain1 {

dependsOn exHello, exWorld

doLast {

println ‘main’

}

}

task exMain2(dependsOn: [exHello, exWorld]) {

doLast {

println ‘main2’

}

}

在被依赖的任务执行完成后才执行当前任务

  • 通过运行结果指定依赖

/**

  • 通过运行结果指定依赖

*/

task lib1 {

doLast {

println ‘lib1’

}

}

task lib2 {

doLast {

println ‘lib2’

}

}

task nolib {

doLast {

println ‘nolib’

}

}

task exMain3(dependsOn: [exHello, exWorld]) {

dependsOn this.tasks.findAll {

return it.name.startsWith(‘lib’)

}

doLast {

println ‘main3’

}

}

  • 执行顺序

/**

  • 执行顺序

*/

task taskX {

doLast {

println ‘taskX’

}

}

task taskY {

mustRunAfter taskX

doLast {

println ‘taskY’

}

}

task taskZ {

mustRunAfter taskY

doLast {

println ‘taskZ’

}

}

按照 taskX ->taskY ->taskZ 顺序执行

  • 案例解析版本迭代信息

/**

  • 案例解析版本迭代信息

*/

task handleReleaseFile {

def srcFile = file(‘releases.xml’)

def destDir = new File(this.buildDir, ‘generated/release/’)

doLast {

println ‘开始解析版本迭代信息对应的xml文件…’

destDir.mkdir()

def releases = new XmlParser().parse(srcFile)

releases.resource.each { releaseNode ->

//解析每个release结点的内容

def name = releaseNode.versionName.text()

def code = releaseNode.versionCode.text()

def info = releaseNode.versionInfo.text()

//创建文件并写入结点数据

def destFile = new File(destDir, “release-${name}.txt”)

destFile.withWriter { writer ->

writer.write(" n a m e − > {name}-> name>{code}->${info}")

}

}

}

}

task handleReleaseFileTest(dependsOn: handleReleaseFile) {

def dir = this.fileTree(this.buildDir.path + ‘generated/release/’)

doLast {

dir.each {

println “file name is: ${it}”

}

println ‘解析版本迭代信息对应的xml文件测试完成’

}

}

  • task输入版本信息

ext {

versionName = ‘1.0.5’

versionCode = ‘105’

versionInfo = ‘App的第5个版本,上线基本架构核心功能’

destFile = file(‘releases.xml’)

if (destFile != null && !destFile.exists()) {

destFile.createNewFile()

}

}

task writeTask {

//为task指定输入

inputs.property(‘versionCode’, this.versionCode)

inputs.property(‘versionName’, this.versionName)

inputs.property(‘versionInfo’, this.versionInfo)

//为Task指定输出

outputs.file(destFile)

doLast {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值