RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Gradle入門(mén)知識(shí)之Gradle詳解(下)

jf_78858299 ? 來(lái)源:小余的自習(xí)室 ? 作者:小余的自習(xí)室 ? 2023-03-30 10:51 ? 次閱讀

6.Gradle Api

Gradle為我們提供了很多豐富的api操作

主要有幾下幾種:

  • Project api
  • Task api
  • 屬性 api
  • 文件 api
  • 以及一些其他api

由于api這塊篇幅比較多,就不展開(kāi)講解了,后面會(huì)單獨(dú)出一篇文章來(lái)講解這塊內(nèi)容

7.Gradle插件

Gradle插件在我們的項(xiàng)目中使用的還是比較多的,在一些優(yōu)秀的開(kāi)源框架:

如鵝廠的Tinker,滴滴的VirtualApk,阿里的Arouter

內(nèi)部都使用了Gradle插件知識(shí)

筆者Gradle插件開(kāi)始學(xué)習(xí)的時(shí)候,也是一臉懵逼,

其實(shí)你把Gradle插件理解為一個(gè)第三方j(luò)ar包就可以了,只是這個(gè)jar包是用于我們apk構(gòu)建的過(guò)程

內(nèi)部其實(shí)也是使用一些Task,掛接到我們的apk構(gòu)建生命周期中。

這里也不會(huì)過(guò)多講解

下面我們來(lái)講下Gradle一個(gè)特性:

8.增量更新

有沒(méi)發(fā)現(xiàn)你在構(gòu)建過(guò)程中,如果修改的地方對(duì)整個(gè)任務(wù)容器影響不大情況下,你的編譯速度會(huì)很快,其實(shí)就是Gradle默認(rèn)支持增量更新功能。

  • 1.定義:

    官方:

An important part of any build tool is the ability to avoid doing work that has already been done.

Consider the process of compilation. Once your source files have been compiled,

there should be no need to recompile them unless something has changed that affects the output,

such as the modification of a source file or the removal of an output file. And compilation can take a significant amount of time,

so skipping the step when it’s not needed saves a lot of time.

簡(jiǎn)單點(diǎn)說(shuō)就是Gradle目前對(duì)Task的輸入和輸出做了判斷,如果發(fā)現(xiàn)文件的輸入和輸出沒(méi)有變化,

就直接使用之前緩存的輸入輸出數(shù)據(jù),不再重新執(zhí)行,縮短編譯時(shí)間

圖片

taskInputsOutputs.png

這里就涉及到了Task的一些知識(shí)點(diǎn):

Task是我們apk構(gòu)建過(guò)程中給的最少單位,每個(gè)任務(wù)都有輸入和輸出,將輸入的信息傳遞給下一個(gè)任務(wù)作為下一個(gè)任務(wù)的輸入,這就是整個(gè)構(gòu)建體系正常運(yùn)行的核心。

  • 2.Task輸入和輸出

    任務(wù)的執(zhí)行離不開(kāi)輸入和輸出,和我們方法執(zhí)行一樣,依賴輸入參數(shù)和輸出返回值

Gradle中使用:

TaskInputs:來(lái)管理輸入

TaskOutputs:來(lái)管理輸出

我們來(lái)看下這個(gè)兩個(gè)類(lèi)的內(nèi)部代碼:

TaskInputs.java
public interface TaskInputs {
    /**
     * Returns true if this task has declared the inputs that it consumes.
     *
     * @return true if this task has declared any inputs.
     */
    boolean getHasInputs();

    /**
     * Returns the input files of this task.
     *
     * @return The input files. Returns an empty collection if this task has no input files.
     */
    FileCollection getFiles();

    /**
     * Registers some input files for this task.
     *
     * @param paths The input files. The given paths are evaluated as per {@link org.gradle.api.Project#files(Object...)}.
     * @return a property builder to further configure the property.
     */
    TaskInputFilePropertyBuilder files(Object... paths);

    /**
     * Registers some input file for this task.
     *
     * @param path The input file. The given path is evaluated as per {@link org.gradle.api.Project#file(Object)}.
     * @return a property builder to further configure the property.
     */
    TaskInputFilePropertyBuilder file(Object path);

    /**
     * Registers an input directory hierarchy. All files found under the given directory are treated as input files for
     * this task.
     *
     * @param dirPath The directory. The path is evaluated as per {@link org.gradle.api.Project#file(Object)}.
     * @return a property builder to further configure the property.
     */
    TaskInputFilePropertyBuilder dir(Object dirPath);

    /**
     * Returns a map of input properties for this task.
     *
     * The returned map is unmodifiable, and does not reflect further changes to the task's properties.
     * Trying to modify the map will result in an {@link UnsupportedOperationException} being thrown.
     *
     * @return The properties.
     */
    Map<String, Object> getProperties();

    /**
     * Registers an input property for this task. This value is persisted when the task executes, and is compared
     * against the property value for later invocations of the task, to determine if the task is up-to-date.
     *
     * The given value for the property must be Serializable, so that it can be persisted. It should also provide a
     * useful {@code equals()} method.
     *
     * You can specify a closure or {@code Callable} as the value of the property. In which case, the closure or
     * {@code Callable} is executed to determine the actual property value.
     *
     * @param name The name of the property. Must not be null.
     * @param value The value for the property. Can be null.
     */
    TaskInputPropertyBuilder property(String name, @Nullable Object value);

    /**
     * Registers a set of input properties for this task. See {@link #property(String, Object)} for details.
     *
     * Note: do not use the return value to chain calls.
     * Instead always use call via {@link org.gradle.api.Task#getInputs()}.
     *
     * @param properties The properties.
     */
    TaskInputs properties(Map<String, ?> properties);

    /**
     * Returns true if this task has declared that it accepts source files.
     *
     * @return true if this task has source files, false if not.
     */
    boolean getHasSourceFiles();

    /**
     * Returns the set of source files for this task. These are the subset of input files which the task actually does work on.
     * A task is skipped if it has declared it accepts source files, and this collection is empty.
     *
     * @return The set of source files for this task.
     */
    FileCollection getSourceFiles();
}

源文件中我們可以看出:

輸入可以有以下種類(lèi):

  • 1.文件,文件夾以及一個(gè)文件集合
  • 2.普通的key value屬性
  • 2.Map:傳遞一個(gè)Map的屬性集合

TaskInputs還可以通過(guò)getHasInputs判斷是否有輸入

同理我們來(lái)看下TaskOutputs的源碼,篇幅原因,這里直接看下TaskOutputs的方法框架:

圖片

Outputs.png

大部分情況和inputs類(lèi)似,可以輸出為文件,屬性properties等

注意到這里有幾個(gè)關(guān)鍵的方法:

upToDateWhen和cacheIf

這兩個(gè)方法就是用來(lái)對(duì)構(gòu)建中的是否對(duì)輸出操作進(jìn)行緩存的點(diǎn),用于增量構(gòu)建使用

總結(jié)

本篇文章主要是講解了Gradle一些基礎(chǔ)認(rèn)識(shí),Gradle工程項(xiàng)目的概括以及Gradle構(gòu)建生命周期管理和監(jiān)聽(tīng)等操作。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • DSL
    DSL
    +關(guān)注

    關(guān)注

    2

    文章

    58

    瀏覽量

    38293
  • AS
    AS
    +關(guān)注

    關(guān)注

    0

    文章

    27

    瀏覽量

    26080
  • gradle
    +關(guān)注

    關(guān)注

    0

    文章

    26

    瀏覽量

    708
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Gradle版本目錄功能的簡(jiǎn)單應(yīng)用

    版本帝 Gradle 最新版本已經(jīng)到了 8.1.1 ,你是不是還在用著 Gradle 3 的功能?今天我們了解一 Gradle 7.0 之后推出的新功能 Version Catalo
    的頭像 發(fā)表于 09-30 11:12 ?1352次閱讀

    gradle安裝與配置unity

    Gradle是一種用于構(gòu)建和自動(dòng)化構(gòu)建過(guò)程的強(qiáng)大工具,而Unity則是一款跨平臺(tái)的游戲引擎。在Unity項(xiàng)目中使用Gradle可以幫助我們更方便地管理和構(gòu)建項(xiàng)目,同時(shí)能夠提供更高的自定義能力和穩(wěn)定性
    的頭像 發(fā)表于 12-07 14:48 ?2136次閱讀

    Android Studio與Gradle深入

    小語(yǔ)言規(guī)范用來(lái)處理一個(gè)特定的事情(大多情況是配置)。Android 的插件的 DSL 文檔在 Android Gradle DSL有說(shuō)明。  理解了以上基礎(chǔ)之后,你就會(huì)知其然,知其所以然了?! ∫陨?b class='flag-5'>知識(shí)
    發(fā)表于 08-31 17:58

    Gradle for Android

    Gradle for Android
    發(fā)表于 07-16 15:50

    DevEco報(bào)錯(cuò)不能順利進(jìn)入gradle8.0怎么解決?

    報(bào)錯(cuò)內(nèi)容為:此版本中使用了已棄用的 Gradle 功能,使其與 Gradle 8.0 不兼容。翻譯一,大概有些人說(shuō)這個(gè)中外使用了Gradle的特性,但它應(yīng)該與
    發(fā)表于 04-21 11:15

    快速入門(mén)Gradle的方法

    我們前面的Gradle是一門(mén)基于Groov的DSL,可能很多童鞋就是因?yàn)槟闶沁@個(gè)Gradle的迷,第一覺(jué)得Gradle是一門(mén)獨(dú)立的語(yǔ)言呀,如果想進(jìn)入歧途了,我一開(kāi)始也是這么迷糊的,當(dāng)你了解之后,你就可以這么理解
    的頭像 發(fā)表于 04-08 10:56 ?1320次閱讀
    快速<b class='flag-5'>入門(mén)</b><b class='flag-5'>Gradle</b>的方法

    Gradle入門(mén)知識(shí)Gradle詳解

    大家回想一自己第一次接觸`Gradle`是什么時(shí)候? 相信大家也都是和我一樣,在我們打開(kāi)第一個(gè)AS項(xiàng)目的時(shí)候, 發(fā)現(xiàn)有很多帶gradle字樣的文件:`setting.gradle
    的頭像 發(fā)表于 03-30 10:47 ?2524次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門(mén)</b><b class='flag-5'>知識(shí)</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b><b class='flag-5'>詳解</b>

    Gradle入門(mén)知識(shí)Gradle語(yǔ)法1

    很多開(kāi)發(fā)喜歡把`Gradle`簡(jiǎn)單定義為一種構(gòu)建工具,和`ant,maven`等作用類(lèi)似, 誠(chéng)然Gradle確實(shí)是用來(lái)做構(gòu)建,但是如果簡(jiǎn)單得把Gradle拿來(lái)做構(gòu)建,就太小看Gradle
    的頭像 發(fā)表于 03-30 10:54 ?995次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門(mén)</b><b class='flag-5'>知識(shí)</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b>語(yǔ)法1

    Gradle入門(mén)知識(shí)Gradle語(yǔ)法2

    很多開(kāi)發(fā)喜歡把`Gradle`簡(jiǎn)單定義為一種構(gòu)建工具,和`ant,maven`等作用類(lèi)似, 誠(chéng)然Gradle確實(shí)是用來(lái)做構(gòu)建,但是如果簡(jiǎn)單得把Gradle拿來(lái)做構(gòu)建,就太小看Gradle
    的頭像 發(fā)表于 03-30 10:54 ?728次閱讀

    Gradle入門(mén)知識(shí)Gradle api解析(上)

    由于Project源碼篇幅太長(zhǎng):這里只列出類(lèi)的部分方法和屬性: 我們前面分析過(guò),每個(gè)build.gradle對(duì)應(yīng)一個(gè)Project,Project在初始過(guò)程中會(huì)被構(gòu)建為`樹(shù)`形結(jié)構(gòu):
    的頭像 發(fā)表于 03-30 11:01 ?2343次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門(mén)</b><b class='flag-5'>知識(shí)</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b> api解析(上)

    Gradle入門(mén)知識(shí)Gradle api解析(

    由于Project源碼篇幅太長(zhǎng):這里只列出類(lèi)的部分方法和屬性: 我們前面分析過(guò),每個(gè)build.gradle對(duì)應(yīng)一個(gè)Project,Project在初始過(guò)程中會(huì)被構(gòu)建為`樹(shù)`形結(jié)構(gòu):
    的頭像 發(fā)表于 03-30 11:05 ?1061次閱讀

    Gradle自定義插件介紹2

    首先來(lái)講`Gradle`和`Gradle插件`有啥區(qū)別? > `Gradle`是一套構(gòu)建工具,其內(nèi)部構(gòu)建過(guò)程主要是以`Project`組成一個(gè)樹(shù)形的生態(tài)系統(tǒng),整個(gè)構(gòu)建流程有自己
    的頭像 發(fā)表于 03-30 11:17 ?886次閱讀
    <b class='flag-5'>Gradle</b>自定義插件介紹2

    Gradle Plugin和AGP的區(qū)別1

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構(gòu)建過(guò)程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:48 ?1213次閱讀
    <b class='flag-5'>Gradle</b> Plugin和AGP的區(qū)別1

    Gradle Plugin和AGP的區(qū)別2

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構(gòu)建過(guò)程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:49 ?1160次閱讀

    Gradle Plugin和AGP的區(qū)別3

    Gradle Plugin`和`AGP`的區(qū)別? `Gradle Plugin`是`Gradle`構(gòu)建過(guò)程中使用的插件的總稱,而`Android Gradle Plugin`是這
    的頭像 發(fā)表于 03-30 11:50 ?1250次閱讀
    RM新时代网站-首页