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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

Android

[Android] Implementation vs API dependency

發(fā)布時(shí)間:2023/12/31 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Android] Implementation vs API dependency 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

原文鏈接:
https://jeroenmols.com/blog/2017/06/14/androidstudio3/

https://blog.csdn.net/lonewolf521125/article/details/78482880

?


更新到 Android Studio 3.0 之后,構(gòu)建多 module 結(jié)構(gòu)的項(xiàng)目速度有很大的提升,但不幸的是這同樣意為著 Gradle 插件的 API 也做了修改.

本文將詳細(xì)的介紹本次改變的優(yōu)點(diǎn),以及使你能夠順暢應(yīng)用升級(jí)。

目前的問(wèn)題

為了理解 Gradle plugin 2.0 編譯系統(tǒng)的限制,現(xiàn)在考慮下面這個(gè)擁有多層引用 module 的工程:

現(xiàn)在請(qǐng)考慮一下最下面的 module A,對(duì) module A 一般來(lái)講會(huì)有兩種變化:

  • Implementation change(內(nèi)部實(shí)現(xiàn)的更改):
    內(nèi)部更改,未涉及到對(duì)外的接口變更
  • ABI change(Application binary interface change;對(duì)外接口的更改):
    module A 對(duì)外的接口做了修改
  • 注意:下文中,所有重編譯的 module 都會(huì)用紅色高亮顯示。

    Implementation change

    既然 module A 的對(duì)外接口未做更改,那么 Gradle 自然也只對(duì) module A 做重編譯。所有 module A 的消費(fèi)者(實(shí)際就是直接或間接引用到 module A 的其他 module)都不會(huì)受到影響。

    在此場(chǎng)景下沒(méi)有什么問(wèn)題。

    ABI change

    當(dāng) module A 的對(duì)外接口做更改的時(shí)候,module A 的直接消費(fèi)者 B1、B2、B3(也就是直接引用到 module A 的其他 module)也需要重編譯。

    但是 A 的直接消費(fèi)者們(B1、B2、B3)有可能通過(guò)自己( B1、B2、B3 )的接口將 A 暴露出去!所以為了保險(xiǎn)起見(jiàn),這些引用到 B1、B2、B3 的 module (C1、C2、C3) 也需要從編譯。同樣的引用到 C1、C2、C3 也一樣需要重新編譯…

    因此 Gradle 實(shí)際上需要對(duì)所有的 module 進(jìn)行重編譯。

    現(xiàn)在我們遇到了一個(gè)大問(wèn)題:

    一個(gè)代碼的更改引發(fā)了所有 module 的重編譯。
    本問(wèn)題最根本的原因是 Gradle 并不知道你是否通過(guò)一個(gè) module 將其引用到的另一個(gè) module 接口給泄露出去了(例如 Gradle 并不知道你是否在 module B1 中將 A module 的接口暴露給了 App)。

    救星來(lái)了(Android Gradle plugin 3.0)

    現(xiàn)在最新一版的 Android Gradle 插件需要你明確的指出你是否要將某 module 的接口暴露出去。基于此它可以在判斷某 module 是否需要重編譯時(shí)做出正確的選擇。

    compile 已被棄用,并由兩個(gè)新的替代:

    • api:通過(guò)你自己的接口將你引用到的 module 接口暴露出去供其他 module 使用,含義上實(shí)際與 compile 一致

      比如:對(duì)于 B1 module ,如果其引用 A module 時(shí)使用了 api ,那么 C1 就可以使用到 A module 的接口

    • implementation:僅僅將你引用到的此 module 在內(nèi)部使用,而不將其接口暴露給外部

      比如:對(duì)于 B1 module,如果其引用 A module 時(shí)使用了 implementation,那么 C1 無(wú)法使用到 A module 的接口


    基于以上,現(xiàn)在你就可以明確的告訴 Gradle 某個(gè) module 在它引用的 module 更改時(shí)進(jìn)行重編譯,在它引用的 module 未更改時(shí)不做重編譯。

    示例如下:

    dependencies {//當(dāng) legofy 對(duì)外接口更新時(shí),重編譯本 module 以及所有引用此 module 的 moduleapi project(':legofy')//當(dāng) landscapevideocamera 對(duì)外接口更新時(shí),僅僅重編譯本 module implementation project(':landscapevideocamera:1.0.0') }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    遷移指南

    (廢棄 compile 改用 api 和 implementation 形式的操作指南)

    理論上你可以將所有的 compile 都修改為 api(運(yùn)行上不會(huì)報(bào)任何錯(cuò)誤),但是這種方式還是可能會(huì)因?yàn)橐粋€(gè)代碼的變動(dòng)引發(fā)所有 module 的重編譯:

    所以最好的方式是盡量使用 implementation 替換 compile ,當(dāng)且僅當(dāng)想將你引用的 module 暴露出去的時(shí)候再用 api,按照這種方式會(huì)減少很多重編譯。

    希望這篇文章能盡量闡明 api 與 implementation 之間模糊的含義
    (至于官方的遷移文檔,呵呵噠)

    其他的依賴配置

    團(tuán)隊(duì)也利用這次變更最終給予其他配置以適當(dāng)?shù)拿Q:

    • provided 配置現(xiàn)在改成了 compileOnly
    • apk 配置現(xiàn)在改成了 runtimeOnly

    就像之前一樣,你可以將配置與 variants 進(jìn)行組合:debugApi、testImplementation 等

    #其他的遷移項(xiàng)目
    ~~Android Studio 3.0 包含了許多終于得到解決的其他改進(jìn),我最喜愛(ài)的是:~~
    * 所有的 google dependencies 在 Maven 在線倉(cāng)庫(kù)中都可以被訪問(wèn)到
    ~~。。。~~

    詳細(xì)信息:
    https://developer.android.com/studio/preview/features/new-android-plugin-migration.html

    總結(jié):

    為了提升多項(xiàng)目結(jié)構(gòu)的構(gòu)建速度, Android Gradle plugin 需要一個(gè)突破性的提升。盡量使用 implementation (因?yàn)樗鼤?huì)引發(fā)更少的 module 重編譯)

    --------------------- 本文來(lái)自 楊筱毅 的CSDN 博客 ,全文地址請(qǐng)點(diǎn)擊:https://blog.csdn.net/lonewolf521125/article/details/78482880?utm_source=copy?

    轉(zhuǎn)載于:https://www.cnblogs.com/0616--ataozhijia/p/9753948.html

    總結(jié)

    以上是生活随笔為你收集整理的[Android] Implementation vs API dependency的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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