av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

Android Gradle Plug 4.1.0 升級后gradle獲取manifest位置失敗問題解決

瀏覽:40日期:2022-09-22 09:46:55

問題背景

項目編譯過程中,使用了類似Android Gradle Plugin的gradle插件進行編譯,在最終打包apk時,會動態(tài)修改manifest文件。

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

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

確認調查方向

首先要確認清楚到底是上述3個哪個的升級導致的問題。

在本地進行環(huán)境升級過程驗證了以下結論:

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

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

Android Gradle Plugin:4.0.2 是 4.1 的前一個版本,至此可以確認是 Android Gradle Plugin:4.1.0 的升級導致的不兼容問題。

明確了調查的方向,接下來就可以有的放矢了。

調查分析

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

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

其實并非如此簡單,只是這一句是最關鍵的。在gradle插件中增加了一些關鍵打印語句后,編譯過程中得到了以下錯誤提示:

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

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

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

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

上JCenter找,結果JCenter倉庫只更新到2.x版本。

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

先到AS的緩存路徑下碰碰運氣吧,不過碰運氣也得先有個方向,別忘了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

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

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

同時還有一個抽象方法:

public abstract DirectoryProperty getMultiApkManifestOutputDirectory();

看來屬性已經變成了 multiApkManifestOutputDirectory。

如果不確定,我們再看看 4.0.2 的源碼,在 ProcessApplicationManifest.class 中找到了以下代碼:

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

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

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

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

總結

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

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

另外,有時候Gradle的升級也會帶來一些兼容問題。

到此這篇關于Android Gradle Plug 4.1.0 升級后gradle獲取manifest位置失敗問題解決的文章就介紹到這了,更多相關Android Gradle4.1升級內容請搜索好吧啦網以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 日韩一二区 | 亚洲视频免费在线观看 | 91丝袜一区在线观看 | 久久国产亚洲 | 麻豆av在线免费观看 | 日本少妇中文字幕 | 国产精品一区在线播放 | 中文字幕日韩一区 | 日韩av一二三区 | 97精品| 欧美精产国品一二三区 | 黄色激情视频网站 | 成人午夜小视频 | av网站免费在线观看 | 日本特级黄色片 | 黄色大片视频 | 国产网友自拍 | 青青草手机在线视频 | 亚洲激情中文字幕 | 一本色道久久综合亚洲精品酒店 | 亚洲成人欧美 | av在线播放网址 | 91视频在线观看免费 | 成人在线免费视频 | 国产高清视频在线 | 欧美日韩综合网 | 亚洲国产精品久久久 | 亚洲成人免费 | 国产又粗又猛又爽又黄 | 张津瑜国内精品www在线 | 欧美一区二区三区在线视频 | 日韩精品免费看 | 天天操天天干天天操 | 中文字幕国产在线 | 国产精品久久一区 | 欧美一区二区三区在线 | 日韩黄色一级 | 亚洲人精品| 一级黄色小视频 | 亚洲欧美成人 | 久久久久久穴 |