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

問題背景

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

近期發(fā)現(xiàn)線上用戶有反應(yīng)升級到以下開發(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個哪個的升級導(dǎo)致的問題。

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

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

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

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

明確了調(diào)查的方向忍燥,接下來就可以有的放矢了拧晕。

調(diào)查分析

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

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

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

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ā)布才過去2個月,只好自給自足机久。

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

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

上JCenter找叶圃,結(jié)果JCenter倉庫只更新到2.x版本。

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

先到AS的緩存路徑下碰碰運(yùn)氣吧憾股,不過碰運(yùn)氣也得先有個方向鹿蜀,別忘了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();

看來屬性已經(jīng)變成了 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本質(zhì)上是一個 ProcessApplicationManifest 實例,但從 4.1.0 版本開始霸株, task變?yōu)?ProcessMultiApkApplicationManifest 的實例雕沉,屬性變?yōu)?multiApkMnifestOutputDirectory 了。

好了淳衙,剩下的就是做一下版本兼容了蘑秽,大功告成饺著。

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

總結(jié)

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市功咒,隨后出現(xiàn)的幾起案子愉阎,更是在濱河造成了極大的恐慌绞蹦,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榜旦,死亡現(xiàn)場離奇詭異幽七,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)溅呢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門澡屡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咐旧,你說我怎么就攤上這事挪蹭。” “怎么了休偶?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵梁厉,是天一觀的道長。 經(jīng)常有香客問我踏兜,道長词顾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任碱妆,我火速辦了婚禮肉盹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疹尾。我一直安慰自己上忍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布纳本。 她就那樣靜靜地躺著窍蓝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪繁成。 梳的紋絲不亂的頭發(fā)上吓笙,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音巾腕,去河邊找鬼面睛。 笑死,一個胖子當(dāng)著我的面吹牛尊搬,可吹牛的內(nèi)容都是我干的叁鉴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼佛寿,長吁一口氣:“原來是場噩夢啊……” “哼幌墓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤克锣,失蹤者是張志新(化名)和其女友劉穎茵肃,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袭祟,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡验残,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巾乳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片您没。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胆绊,靈堂內(nèi)的尸體忽然破棺而出氨鹏,到底是詐尸還是另有隱情,我是刑警寧澤压状,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布仆抵,位于F島的核電站,受9級特大地震影響种冬,放射性物質(zhì)發(fā)生泄漏镣丑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一娱两、第九天 我趴在偏房一處隱蔽的房頂上張望莺匠。 院中可真熱鬧,春花似錦十兢、人聲如沸趣竣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遥缕。三九已至,卻和暖如春异袄,著一層夾襖步出監(jiān)牢的瞬間通砍,已是汗流浹背玛臂。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工烤蜕, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迹冤。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓讽营,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泡徙。 傳聞我的和親對象是個殘疾皇子橱鹏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355