最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android Gradle Plug 4.1.0 升級(jí)后gradle獲取manifest位置失敗問(wèn)題解決

 更新時(shí)間:2020年10月18日 10:08:57   作者:未子涵  
這篇文章主要介紹了Android Gradle Plug 4.1.0 升級(jí)后gradle獲取manifest位置失敗問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

問(wèn)題背景

項(xiàng)目編譯過(guò)程中,使用了類似Android Gradle Plugin的gradle插件進(jìn)行編譯,在最終打包apk時(shí),會(huì)動(dòng)態(tài)修改manifest文件。

近期發(fā)現(xiàn)線上用戶有反應(yīng)升級(jí)到以下開發(fā)環(huán)境后,打包apk后manifest文件中沒有應(yīng)有的任何配置。

Android Gradle Plugin:4.1.0
Gradle:6.5
Android Studio:4.1

確認(rèn)調(diào)查方向

首先要確認(rèn)清楚到底是上述3個(gè)哪個(gè)的升級(jí)導(dǎo)致的問(wèn)題。

在本地進(jìn)行環(huán)境升級(jí)過(guò)程驗(yàn)證了以下結(jié)論:

Android Gradle Plugin:4.1.0 強(qiáng)制要求 Android Studio:4.1 + Gradle:6.5。然而 以下環(huán)境下打包過(guò)程是正常的:

Android Gradle Plugin:4.0.2
Gradle:6.5
Android Studio:4.1

Android Gradle Plugin:4.0.2 是 4.1 的前一個(gè)版本,至此可以確認(rèn)是 Android Gradle Plugin:4.1.0 的升級(jí)導(dǎo)致的不兼容問(wèn)題。

明確了調(diào)查的方向,接下來(lái)就可以有的放矢了。

調(diào)查分析

我們的gradle插件,是通過(guò)以下代碼獲取到manifest文件后做處理的:

new File(output.processManifestProvider.get().manifestOutputDirectory.get().getAsFile(), "AndroidManifest.xml")

其實(shí)并非如此簡(jiǎn)單,只是這一句是最關(guān)鍵的。在gradle插件中增加了一些關(guān)鍵打印語(yǔ)句后,編譯過(guò)程中得到了以下錯(cuò)誤提示:

Could not get unknown property 'manifestOutputDirectory' for task ':app:processDebugManifest' of type com.android.build.gradle.tasks.ProcessMultiApkApplicationManifest

百度了一下,沒有任何相關(guān)記錄,畢竟距離 Android Gradle Plugin:4.1.0 正式發(fā)布才過(guò)去2個(gè)月,只好自給自足。

很明顯是讀取manifest文件位置的屬性失效了,那最直接的方法就是看源碼。找到 Android Gradle Plugin:4.1.0 的jar包看看就行。

又是百度一下,很可惜,沒有下載地址。

上JCenter找,結(jié)果JCenter倉(cāng)庫(kù)只更新到2.x版本。

也對(duì),好像是從 Android Studio 3.0 開始,google就將 Android Gradle Plugin 轉(zhuǎn)移至 google() 倉(cāng)庫(kù)了,那只能去 google() 倉(cāng)庫(kù)找了,一時(shí)半會(huì)也不知道具體地址,以前的編譯過(guò)程中也沒留意看studio的編譯日志輸出,當(dāng)然如果是一個(gè)全新工程環(huán)境,編譯一下,肯定能找到倉(cāng)庫(kù)地址的,不過(guò)我懶得搞。

先到AS的緩存路徑下碰碰運(yùn)氣吧,不過(guò)碰運(yùn)氣也得先有個(gè)方向,別忘了Android Gradle Plugin的classpath配置:

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

果不其然,在以下路徑找到了:

/Users/jackie/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle

加載過(guò)的各種版本都有,直接拿到 4.1.0 的jar包看源碼,在 ProcessMultiApkApplicationManifest.class 中找到了以下代碼:

File mergedManifestOutputFile = new File(((Directory)getMultiApkManifestOutputDirectory().get()).getAsFile(), 
  FileUtils.join(new String[] { dirName, 
    "AndroidManifest.xml" }));

同時(shí)還有一個(gè)抽象方法:

public abstract DirectoryProperty getMultiApkManifestOutputDirectory();

看來(lái)屬性已經(jīng)變成了 multiApkManifestOutputDirectory。

如果不確定,我們?cè)倏纯?4.0.2 的源碼,在 ProcessApplicationManifest.class 中找到了以下代碼:

復(fù)制代碼 代碼如下:
File manifestOutputFile = new File(((Directory)getManifestOutputDirectory().get()).getAsFile(), FileUtils.join(new String[] { apkData.getDirName(), "AndroidManifest.xml" }));

很明顯,在 4.0.2 版本時(shí),獲取manifest文件路徑的屬性確實(shí)是 manifestOutputDirectory ,而task本質(zhì)上是一個(gè) ProcessApplicationManifest 實(shí)例,但從 4.1.0 版本開始, task變?yōu)?ProcessMultiApkApplicationManifest 的實(shí)例,屬性變?yōu)?multiApkMnifestOutputDirectory 了。

好了,剩下的就是做一下版本兼容了,大功告成。

復(fù)制代碼 代碼如下:
new File(output.processManifestProvider.get().multiApkManifestOutputDirectory.get().getAsFile(), "AndroidManifest.xml")

總結(jié)

大部分基于gradle的編譯腳本,其工作原理都一樣,就是在編寫自定義的task、在某個(gè)預(yù)設(shè)的task之前或之后做自定義的特殊處理等等,更高級(jí)一點(diǎn)的gradle插件也不例外。

而 Android Gradle Plugin 同樣也只是一個(gè)Google官方開發(fā)的gradle插件,每次升級(jí)版本都會(huì)伴隨著一些“task名變更”、“task處理內(nèi)容變更”、“task執(zhí)行順序變更”等等的更新,這些更新很可能就會(huì)影響到我們這些基于其“預(yù)置task”做特殊處理的gradle插件,所以大部分版本兼容問(wèn)題都應(yīng)該從這個(gè)方向出發(fā)調(diào)查。

另外,有時(shí)候Gradle的升級(jí)也會(huì)帶來(lái)一些兼容問(wèn)題。

到此這篇關(guān)于Android Gradle Plug 4.1.0 升級(jí)后gradle獲取manifest位置失敗問(wèn)題解決的文章就介紹到這了,更多相關(guān)Android Gradle4.1升級(jí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

于田县| 钦州市| 黑龙江省| 灵川县| 增城市| 嘉善县| 黎城县| 惠水县| 平度市| 滁州市| 西盟| 海晏县| 云浮市| 天台县| 浦江县| 博客| 临桂县| 萨嘎县| 如皋市| 鹤庆县| 棋牌| 楚雄市| 吴旗县| 汾阳市| 富阳市| 什邡市| 南郑县| 高碑店市| 南康市| 萨迦县| 浦城县| 镇宁| 龙海市| 景德镇市| 博白县| 张掖市| 香河县| 阿巴嘎旗| 平和县| 凌云县| 开平市|