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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

Gradle入門知識之Gradle詳解(下)

jf_78858299 ? 來源:小余的自習室 ? 作者:小余的自習室 ? 2023-03-30 10:51 ? 次閱讀

6.Gradle Api

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

主要有幾下幾種:

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

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

7.Gradle插件

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

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

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

筆者Gradle插件開始學習的時候,也是一臉懵逼,

其實你把Gradle插件理解為一個第三方jar包就可以了,只是這個jar包是用于我們apk構建的過程

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

這里也不會過多講解

下面我們來講下Gradle一個特性:

8.增量更新

有沒發(fā)現(xiàn)你在構建過程中,如果修改的地方對整個任務容器影響不大情況下,你的編譯速度會很快,其實就是Gradle默認支持增量更新功能。

  • 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.

簡單點說就是Gradle目前對Task的輸入和輸出做了判斷,如果發(fā)現(xiàn)文件的輸入和輸出沒有變化,

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

圖片

taskInputsOutputs.png

這里就涉及到了Task的一些知識點:

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

  • 2.Task輸入和輸出

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

Gradle中使用:

TaskInputs:來管理輸入

TaskOutputs:來管理輸出

我們來看下這個兩個類的內(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();
}

源文件中我們可以看出:

輸入可以有以下種類:

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

TaskInputs還可以通過getHasInputs判斷是否有輸入

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

圖片

Outputs.png

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

注意到這里有幾個關鍵的方法:

upToDateWhen和cacheIf

這兩個方法就是用來對構建中的是否對輸出操作進行緩存的點,用于增量構建使用

總結

本篇文章主要是講解了Gradle一些基礎認識,Gradle工程項目的概括以及Gradle構建生命周期管理和監(jiān)聽等操作。

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

    關注

    2

    文章

    59

    瀏覽量

    38320
  • AS
    AS
    +關注

    關注

    0

    文章

    27

    瀏覽量

    26100
  • gradle
    +關注

    關注

    0

    文章

    26

    瀏覽量

    726
收藏 人收藏

    評論

    相關推薦

    Gradle版本目錄功能的簡單應用

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

    gradle安裝與配置unity

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

    Android Studio與Gradle深入

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

    Gradle for Android

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

    DevEco報錯不能順利進入gradle8.0怎么解決?

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

    快速入門Gradle的方法

    我們前面的Gradle是一門基于Groov的DSL,可能很多童鞋就是因為你是這個Gradle的迷,第一覺得Gradle是一門獨立的語言呀,如果想進入歧途了,我一開始也是這么迷糊的,當你了解之后,你就可以這么理解
    的頭像 發(fā)表于 04-08 10:56 ?1342次閱讀
    快速<b class='flag-5'>入門</b><b class='flag-5'>Gradle</b>的方法

    Gradle入門知識Gradle詳解

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

    Gradle入門知識Gradle語法1

    很多開發(fā)喜歡把`Gradle`簡單定義為一種構建工具,和`ant,maven`等作用類似, 誠然Gradle確實是用來做構建,但是如果簡單得把Gradle拿來做構建,就太小看Gradle
    的頭像 發(fā)表于 03-30 10:54 ?1009次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門</b><b class='flag-5'>知識</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b>語法1

    Gradle入門知識Gradle語法2

    很多開發(fā)喜歡把`Gradle`簡單定義為一種構建工具,和`ant,maven`等作用類似, 誠然Gradle確實是用來做構建,但是如果簡單得把Gradle拿來做構建,就太小看Gradle
    的頭像 發(fā)表于 03-30 10:54 ?745次閱讀

    Gradle入門知識Gradle api解析(上)

    由于Project源碼篇幅太長:這里只列出類的部分方法和屬性: 我們前面分析過,每個build.gradle對應一個Project,Project在初始過程中會被構建為`樹`形結構:
    的頭像 發(fā)表于 03-30 11:01 ?2380次閱讀
    <b class='flag-5'>Gradle</b><b class='flag-5'>入門</b><b class='flag-5'>知識</b><b class='flag-5'>之</b><b class='flag-5'>Gradle</b> api解析(上)

    Gradle入門知識Gradle api解析(

    由于Project源碼篇幅太長:這里只列出類的部分方法和屬性: 我們前面分析過,每個build.gradle對應一個Project,Project在初始過程中會被構建為`樹`形結構:
    的頭像 發(fā)表于 03-30 11:05 ?1096次閱讀

    Gradle自定義插件介紹2

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

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

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

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

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

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

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