日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

android中gradle的作用,Gradle 之 Android 中的应用

發(fā)布時(shí)間:2025/3/8 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android中gradle的作用,Gradle 之 Android 中的应用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在上一篇文章中 Gradle 之語(yǔ)言基礎(chǔ) Groovy 主要介紹了 Groovy 的基礎(chǔ)語(yǔ)法(如果沒有 Groovy 的基礎(chǔ),建議先看看上篇文章,如果可以動(dòng)手敲一下里面的示例代碼就更好不過(guò)了),也是為本篇文章打基礎(chǔ)的。

本篇文章主要介紹 Gradle 在 Android 中的應(yīng)用(Android DSL 和 Gradle DSL),也是通過(guò)一些示例來(lái)介紹和理解,主要分為以下一些內(nèi)容,示例代碼都在 GradleForAndroid

一. Gradle 構(gòu)建生命周期

一個(gè) Gradle 的構(gòu)建通常有如下三個(gè)階段

初始化:項(xiàng)目 Project 實(shí)例會(huì)在該階段被創(chuàng)建。如果一個(gè)項(xiàng)目中包含有多個(gè)模塊,并且每一個(gè)模塊都有其對(duì)應(yīng)的 build.gradle 文件,就會(huì)為每一個(gè)模塊都創(chuàng)建一個(gè)對(duì)應(yīng)的 Project 實(shí)例

配置:執(zhí)行各個(gè)模塊下的 build.gradle 腳本,為 Project實(shí)例創(chuàng)建和配置 Task,構(gòu)造 Task 任務(wù)依賴關(guān)系圖以便在執(zhí)行階段按照依賴關(guān)系執(zhí)行 Task

執(zhí)行:在這個(gè)階段將會(huì)決定執(zhí)行哪個(gè) Task,哪個(gè) Task 被執(zhí)行取決于開始該次構(gòu)建的參數(shù)配置和該 Gradle 文件的當(dāng)前目錄

在創(chuàng)建完成一個(gè)新的 Android 應(yīng)用項(xiàng)目之后,一般情況下, .gradle 文件的目錄結(jié)構(gòu)如下所示:

GradleForAndroid

|---- build.gradle

|---- setting.gradle

\---- app

\---- build.gradle

其中,兩個(gè)文件 build.gradle 和 setting.gradle 位于項(xiàng)目的根目錄下,還有一個(gè) build.gradle 位于 \app\ 目錄下。\build.gradle 是頂層構(gòu)建文件,\app\build.gradle 是模塊構(gòu)建文件。

我們以上面這個(gè)新創(chuàng)建的項(xiàng)目來(lái)學(xué)習(xí) Gradle 的構(gòu)建生命周期

1.1 初始化

在初始化階段,會(huì)創(chuàng)建一個(gè) Setting 對(duì)象,對(duì)應(yīng)著 setting.gradle 文件,

Setting 對(duì)象的一個(gè)主要作用就是聲明哪些模塊將會(huì)參與到構(gòu)建中去,Setting 文檔(Gradle API 5.0)

在新建的項(xiàng)目中,setting.gradle 文件一般會(huì)默認(rèn)包含一行內(nèi)容,如下所示

include ':app'

上面這一行,其實(shí)是一行 groovy 代碼的簡(jiǎn)寫,對(duì)應(yīng)的是 Setting#include(String[] projectPaths) 方法,表示 :app 模塊將會(huì)參與到構(gòu)建中去。

如果我們創(chuàng)建一個(gè) library 庫(kù),setting.gradle 將會(huì)變?yōu)槿缦滤?#xff0c;表示 :app 和 :library 兩個(gè)模塊將會(huì)參與到構(gòu)建中

include ':app', ':library'

setting.gradle 腳本文件可以中讀取一些只可讀的配置信息,這些配置信息的來(lái)源可以有如下三個(gè):

可以在本工程的 gradle.properties 文件中定義配置信息

也可以在系統(tǒng)的 gradle.properties 文件中定義配置信息,系統(tǒng)的 gradle.properties 位于 user's .gradle 目錄下

還可以通過(guò) -P 命令參數(shù)指定配置信息,比如 ./gradlew clean -P cmd='Hello from commandLine' 便在執(zhí)行 clean task 的時(shí)候,指定了 cmd='Hello from commandLine' 配置信息

上面講到,一個(gè) setting.gradle 文件對(duì)應(yīng)著一個(gè) Setting 對(duì)象,Setting 對(duì)象包含的方法如下圖所示

Setting.png

例如有如下代碼

include ':app', ':library'

println propertiesFile

println DEFAULT_SETTINGS_FILE

println getRootProject().name

println getRootProject().path

getGradle().addBuildListener(new BuildListener() {

@Override

void buildStarted(Gradle gradle) {

println 'buildStarted'

}

@Override

void settingsEvaluated(Settings settings) {

println "settingsEvaluated"

}

@Override

void projectsLoaded(Gradle gradle) {

println 'projectsLoaded'

}

@Override

void projectsEvaluated(Gradle gradle) {

println 'projectsEvaluated'

}

@Override

void buildFinished(BuildResult result) {

println 'buildFinished'

}

})

其輸出是:

Hello from gradle.properties

settings.gradle

GradleForAndroid

:

settingsEvaluated

projectsLoaded

projectsEvaluated

BUILD SUCCESSFUL in 0s

3 actionable tasks: 3 executed

buildFinished

1.2 配置

在配置階段,會(huì)執(zhí)行所有的 build.gradle,包括項(xiàng)目根目錄下的 build.gradle 和各個(gè) module 下的 build.gradle

在執(zhí)行 build.gradle 的時(shí)候,會(huì)為每個(gè) build.gradle 創(chuàng)建一個(gè)對(duì)應(yīng)的 Project 對(duì)象,Project 文檔(Gradle API 5.0)

配置階段會(huì)執(zhí)行 build.gradle 里面的所有代碼和 Task 里面的配置代碼,比如下面的 printProperties Task,只執(zhí)行了 doLast{} 之外的代碼,doLast{} 之外的代碼是 Task 的配置代碼

配置執(zhí)行完成之后,會(huì)根據(jù)各個(gè) Task 的依賴關(guān)系生成一個(gè)有向無(wú)環(huán)圖,可以通過(guò)Gradle對(duì)象的getTaskGraph方法訪問,對(duì)應(yīng)的類為TaskExecutionGraph

在執(zhí)行所有的 Gradle Task 之前,都會(huì)執(zhí)行 初始化階段 和 配置階段 的代碼

比如有如下代碼

// Top-level build file where you can add configuration options common to all sub-projects/modules.

println "/build.gradle 開始配置"

buildscript {

println "/build.gradle buildscript 開始配置"

ext.kotlin_version = '1.2.71'

repositories {

google()

jcenter()

}

dependencies {

classpath 'com.android.tools.build:gradle:3.0.1'

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

// NOTE: Do not place your application dependencies here; they belong

// in the individual module build.gradle files

}

println "/build.gradle buildscript 結(jié)束配置"

}

allprojects {

println "/build.gradle allprojects 開始配置"

repositories {

google()

jcenter()

}

println "/build.gradle allprojects 結(jié)束配置"

}

task clean(type: Delete) {

delete rootProject.buildDir

}

ext {

local = 'Hello from build.gradle'

}

task printProperties {

println "/build.gradle task printProperties 開始配置"

println '/build.gradle task printProperties'

println "/build.gradle task printProperties 結(jié)束配置"

doLast {

println local

println propertiesFile

if (project.hasProperty('cmd')) {

println cmd

}

}

}

println "/build.gradle 結(jié)束配置"

在 Terminal 里面執(zhí)行 ./gradlew clean 會(huì)有如下輸出

Hello from gradle.properties

settings.gradle

GradleForAndroid

:

settingsEvaluated

projectsLoaded

// 配置階段,執(zhí)行 /build.gradle 里面的代碼

> Configure project :

/build.gradle buildscript 開始配置

/build.gradle buildscript 結(jié)束配置

/build.gradle 開始配置

/build.gradle allprojects 開始配置

/build.gradle allprojects 結(jié)束配置

/build.gradle allprojects 開始配置

/build.gradle allprojects 結(jié)束配置

/build.gradle allprojects 開始配置

/build.gradle allprojects 結(jié)束配置

/build.gradle task printProperties 開始配置

/build.gradle task printProperties

/build.gradle task printProperties 結(jié)束配置

/build.gradle 結(jié)束配置

projectsEvaluated

BUILD SUCCESSFUL in 0s

3 actionable tasks: 3 executed

buildFinished

1.3 執(zhí)行

執(zhí)行階段就是指執(zhí)行某個(gè)具體的任務(wù) Task。說(shuō)道 Task,我想大家應(yīng)該比較熟悉,在 Android 項(xiàng)目中依賴了 Android Gradle 插件以后,會(huì)有許多自帶的 Task,比如常用的 clean、assemble 等,而且大家更應(yīng)該掌握的是如何自定義 Task,關(guān)于 Task 會(huì)單獨(dú)抽一節(jié)來(lái)講述。

二. 自定義 Task

任務(wù) Task 代表了在構(gòu)建過(guò)程中的一個(gè)單原子性的動(dòng)作,比如:編程生成 .class 文件或者生成 javadoc 等.

每一個(gè) task 都是屬于某一個(gè) Project 對(duì)象的,每一個(gè) task 都有自己的名字,在 project 中 task 的名字是唯一的,如果在整個(gè)項(xiàng)目 projects 范圍內(nèi)需要指定某個(gè) task 的話,也需要指定 project 的名字,project 和 task 的名字中間使用 : 相連接,比如:./gradlew :app:clean

創(chuàng)建 Task 對(duì)象的方法有以下幾種

// 通過(guò) TaskContainer.create(String) 創(chuàng)建 `Task`

getTasks().create('helloTask') {

doLast {

println 'create Task by TaskContainer'

}

}

task helloTask1 {

doLast {

println 'create Task by task(String name)'

}

}

class HelloTask extends DefaultTask {

def message = 'create Task by extends DefaultTask'

@TaskAction

def hello() {

println message

}

}

// 通過(guò) type 參數(shù)可以指定該 task 的父類,默認(rèn)的父類是 DefaultTask

task helloTask2(type: HelloTask)

一個(gè) Task 是由一系列的 Action 組成的,當(dāng)一個(gè) Task 執(zhí)行的時(shí)候就是按照一定的順序執(zhí)行這些 Action,可以有以下兩種方式向 Task 中添加 Action

通過(guò)閉包 Closure 的方式添加 Action

class HelloTask extends DefaultTask {

def message = 'create Task by extends DefaultTask'

@TaskAction

def hello() {

println message

}

}

task helloTask2(type: HelloTask) {

doFirst {

println 'helloTask2 doFirst'

}

doLast {

println 'helloTask2 doLast'

}

}

直接添加 Action 實(shí)例對(duì)象

def taskDef = task helloTask3(type: HelloTask)

taskDef.doFirst(new Action() {

@Override

void execute(Task task) {

println 'helloTask3 Action execute doFirst'

}

})

taskDef.doLast(new Action() {

@Override

void execute(Task task) {

println 'helloTask3 Action execute doLast'

}

})

Task 依賴關(guān)系 & Task 執(zhí)行順序

在 Task 中有兩個(gè)很重要的概念 dependsOn 和 mustRunAfter。dependsOn 用于聲明兩個(gè) Task 對(duì)象之間的依賴關(guān)系,mustRunAfter 用于聲明一個(gè) Task 必須在另一個(gè) Task 之后運(yùn)行,雖然感覺差不多,但是實(shí)際上還是有區(qū)別的

helloTaskB.dependsOn(helloTaskA) 中,可以單獨(dú)運(yùn)行 helloTaskA,但是運(yùn)行 helloTaskB 的時(shí)候會(huì)觸發(fā) helloTaskA 的執(zhí)行

helloTaskC.mustRunAfter(helloTaskA)中,helloTaskA 和 helloTaskC 都是可以單獨(dú)運(yùn)行的,但是當(dāng) helloTaskC 和 helloTaskA 同時(shí)運(yùn)行時(shí),helloTaskC 一定會(huì)在 helloTaskA 之后運(yùn)行

task helloTaskA {

doFirst {

println 'helloTaskA doFirst'

}

}

task helloTaskB {

doFirst {

println 'helloTaskB doFirst'

}

}

helloTaskB.dependsOn(helloTaskA)

task helloTaskC {

doFirst {

println 'helloTaskC doFirst'

}

}

helloTaskC.mustRunAfter(helloTaskA)

Android 中使用自定義 Task

在 Gradle 構(gòu)建的時(shí)候,需要將自定義的 Task 添加到構(gòu)建過(guò)程中時(shí),需要把握好添加自定義 Task 的時(shí)機(jī)與位置

下面一幅圖清晰地展示了 Gradle 構(gòu)建過(guò)程中一些關(guān)鍵的回調(diào),可以在下面一些回調(diào)中添加自定義 Task

在 project 對(duì)象中,可以通過(guò) gradle 對(duì)象得到 TaskExecutionGraph 的實(shí)例對(duì)象,也可以通過(guò) TaskExecutionGraph 實(shí)例對(duì)象一些關(guān)鍵回調(diào)添加自定義的 Task。比如下面這個(gè)例子,就是在 TaskExecutionGraph 實(shí)例對(duì)象準(zhǔn)備好之后,彈出一個(gè) dialog 用于輸入 storePass 和 keyPass,然后將 storePass 和 keyPass 設(shè)置到 android.signingConfigs 中

apply plugin: 'com.android.application'

import groovy.swing.SwingBuilder

//......

gradle.taskGraph.whenReady { taskGraph ->

if (taskGraph.hasTask(':app:assembleRelease')) {

def storePass = ''

def keyPass = ''

if (System.console() == null) {

System.setProperty('java.awt.headless', 'false')

new SwingBuilder().edt {

dialog(modal: true, title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, pack: true, show: true) {

vbox { // Put everything below each other

label(text: "Please enter store passphrase:")

def input1 = passwordField()

label(text: "Please enter key passphrase:")

def input2 = passwordField()

button(defaultButton: true, text: 'OK', actionPerformed: {

storePass = input1.password;

keyPass = input2.password;

dispose();

})

}

}

}

} else {

storePass = System.console().readPassword("\nPlease enter store passphrase: ")

keyPass = System.console().readPassword("\nPlease enter key passphrase: ")

}

if (storePass.size() <= 0 || keyPass.size() <= 0) {

throw new InvalidUserDataException("You must enter the passwords to proceed.")

}

storePass = new String(storePass)

keyPass = new String(keyPass)

android.signingConfigs.release.storePassword = storePass

android.signingConfigs.release.keyPassword = keyPass

}

}

如下圖所示 TaskExecutionGraph 的方法結(jié)構(gòu)如下圖所示,都是非常實(shí)用方便的方法

TaskExecutionGraph.png

三. Android DSL & Gradle DSL

3.1 Android DSL

Android DSL 是 Gradle 的一個(gè) Android 插件,其實(shí)在使用 Android Studio 開發(fā)的時(shí)候經(jīng)常會(huì)和 Android DSL 打交道,比如下面 android{ } 閉包 里面的內(nèi)容都是 Android DSL

apply plugin: 'com.android.application'

import groovy.swing.SwingBuilder

android {

compileSdkVersion 27

defaultConfig {

applicationId "com.lijiankun24.gradleforandroid"

minSdkVersion 15

targetSdkVersion 27

// ......

}

buildTypes {

// ......

}

signingConfigs {

// ......

}

}

至于里面都有哪些 API,可以去 Android DSL 文檔 查看,也可以去 GitHub 上面搜 android-gradle-dsl

3.2 Gradle DSL

Gradle DSL 在上面介紹 Gradle 生命周期和自定義 Task 的時(shí)候已經(jīng)介紹過(guò)了,比如上面介紹的 Setting 和 TaskExecutionGraph 都是 Gradle DSL 中的類,其他的類和方法等 API 可以去 Gradle DSL 文檔 查看,或者可以在 Android Studio 中像查看 Android SDK 源碼一樣去查看 Gradle DSL 的源碼

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的android中gradle的作用,Gradle 之 Android 中的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一二三四国产精品 | 国产大奶| 先锋av资源| 毛片天堂 | 日韩在线精品强乱中文字幕 | 摸一摸操一操 | 五月深爱婷婷 | 国产不卡在线 | 久久综合九色综合网站 | 999av| 日韩视频福利 | 国产福利免费在线观看 | 91丨porny丨在线中文 | 波多野吉衣久久 | 亚洲黄色影视 | 国产成人无码a区在线观看视频 | 欧美肥老妇视频 | 亚洲av永久中文无码精品综合 | www毛片com | 欧美日韩一区二区三区在线视频 | 神马影院午夜伦理 | 午夜黄色 | 中日韩av在线 | 国产中文一区二区三区 | 综合色网站 | 欧美播放| 成人欧美精品一区二区 | 99热这里只| 国产成a人亚洲精v品无码 | 免费视频一区二区 | 丁香六月久久 | 伊人激情综合 | 日韩乱码在线观看 | 五月激情四射网 | 一级在线观看 | 青青草原免费观看 | 国产一区亚洲一区 | 精国产品一区二区三区a片 国产精品第一 | 少妇25p | 国产精品国产三级国产专区52 | 精品久久综合 | 亚洲妇熟xx妇色黄蜜桃 | 国产一级影片 | 四虎在线精品 | 午夜剧场免费在线观看 | 捆绑调教sm束缚网站 | jizzjizz视频| 国产成人看片 | 亚洲精品电影网 | 国产av不卡一区二区 | 91福利在线导航 | 香蕉国产 | 中文字幕在线观看视频一区 | 日韩国产成人在线 | 日韩久久一区二区三区 | 女同性做受全过程动图 | 国产精品av在线免费观看 | 国产裸体永久免费无遮挡 | 日韩欧美国产亚洲 | 亚洲骚| 手机成人在线视频 | 午夜一区二区三区在线 | 韩国美女啪啪 | 女人洗澡一级特黄毛片 | 最好看的2019年中文视频 | 午夜粉色视频 | 亚洲色吧 | caoporn视频在线| 不卡一区二区三区四区 | 手机看片日韩日韩 | 奇米影视第四色首页 | 中文字幕亚洲一区二区三区五十路 | 久久久久久无码午夜精品直播 | 日韩成人av在线 | 精品国产乱码久久久久久影片 | 亚洲在线激情 | 成人gav| 午夜精品小视频 | 午夜亚洲aⅴ无码高潮片苍井空 | 日韩免费视频一区二区 | 97人妻精品一区二区三区免费 | 亚洲av鲁丝一区二区三区 | 日本在线网站 | 黄色午夜网站 | 91成年人视频 | 久久伊人国产 | 可以看av的网站 | 日本少妇喂奶漫画 | 国产精品麻豆入口 | 欧美精品一级在线观看 | jizz18国产| 日韩激情视频 | 邻家有女4完整版电影观看 欧美偷拍另类 | 精品国产无码一区二区三区 | 亚洲精品免费在线视频 | 欧美第一视频 | 男人的天堂影院 | av一区二区在线观看 | 欧美性潮喷xxxxx免费视频看 |