Gradle生命周期&project&task,2019-2021历年字节跳动Android面试真题解析

本文详细介绍了Gradle在Android项目中的应用,包括如何获取子project、根project,以及如何在父工程中配置子工程。同时,文章讲解了Gradle的属性设置、文件操作、依赖管理和执行外部命令等实用技巧,是Android开发者理解Gradle生命周期和项目构建的宝贵资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


**/

  • 获取所有的子project

/**

  • 获取所有的子project

  • @return

*/

def getSubProjects() {

println ‘-------------------------’

println ‘Sub Project’

println ‘-------------------------’

this.getSubprojects().each { Project project ->

println “±-- project 😒{project.name}”

}

}

this.getSubProjects()

/**


Sub Project


±-- project :app

±-- project :lib_base

±-- project :lib_res

±-- project :module_fun

±-- project :module_me

±-- project :module_search

±-- project :module_thing

±-- project :module_use

**/

  • 获取根project

**

  • 获取根project

  • @return

*/

def getMRootProject(){

def name = this.getRootProject().name

println “根project是:${name}”

}

this.getMRootProject()

/**

根project是:ParallelSearchGradle

**/

  • 在父工程中对子工程进行配置(这里依 app为例,也可以为module_use等)

/**

*在父工程中对子工程进行配置(这里依 app为例,也可以为module_use等)

*/

project(‘app’){ Project project->

apply plugin: ‘com.android.application’

group ‘com.fuyao’

version ‘1.0.0’

dependencies{

}

android{

}

}

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

/**

  • 配置当前结点工程和其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’)

}

}

/**

  • 对文件树进行遍历

*/

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路径

}

}

}

最后相关架构及资料领取方式:

点击我的GitHub免费领取获取往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值