對(duì)第三方 SDK 依賴沖突,重新打個(gè)包試試

版權(quán)聲明:

本賬號(hào)發(fā)布文章均來自公眾號(hào)蚤氏,承香墨影(cxmyDev)甘耿,版權(quán)歸承香墨影所有。

未經(jīng)允許竿滨,不得轉(zhuǎn)載佳恬。

一、前言

在開發(fā) App 的時(shí)候于游,經(jīng)常會(huì)有需要借助第三方 SDK 的情況毁葱。但是有時(shí)候多方提供的 SDK 中,可能引入了同樣的庫贰剥,或者類的名稱以及包名完全一樣的情況倾剿。這樣的話,如果同時(shí)對(duì)這兩個(gè) SDK 進(jìn)行引入的話蚌成,就會(huì)出現(xiàn) duplicate entry 的錯(cuò)誤前痘。


不談什么和對(duì)方協(xié)商凛捏,給出一個(gè)符合我們使用要求的包這種事,只是從技術(shù)的角度來看芹缔,如何解決這個(gè)問題坯癣。

二、分析問題

首先最欠,分析問題坡锡。如果對(duì)方的 SDK 是使用 Gradle compile 的方式引入的,并且對(duì)方集成其他庫的方式也是如此的話窒所,可以在 Compile 中配置 exclude 的方式剔除掉引入的庫鹉勒,這是一個(gè)理想化的做法。關(guān)于 exclude 的使用吵取,之后有機(jī)會(huì)再講禽额,這不是本文的重點(diǎn)。

使用 exclude 是一個(gè)理想的情況皮官,多數(shù)情況下脯倒,duplicate entry 的沖突,都是來自對(duì)方的代碼中的類(可能對(duì)方使用引入源碼的方式引入的開源庫)捺氢,這種情況下藻丢,使用 exclude 就不好使了。

那么既然是 Java 類重復(fù)了摄乒,那么如果我們有辦法去修改某一個(gè) SDK 中悠反,類的包名,就可以解決這種問題了馍佑。

接下來就是我們修改 jar 中類的包名的工具上場(chǎng)了:jarjar.jar斋否。

二、jarjar.jar

1拭荤、什么是 Jar jar

Jar Jar Link 是一個(gè)實(shí)用的工具茵臭,它可以輕松的重新打包 Java 庫,得到一個(gè)沒有外部依賴的單獨(dú) jar 包舅世,從而很好的嵌入到我們發(fā)布的項(xiàng)目內(nèi)旦委。而我們這里,使用 jarjar.jar 的主要作用雏亚,就是為了解決 duplicate entry 這種文件沖突的情況缨硝。

jarjar 提供了非常方便的 *.jar 工具來供我們使用。這是一個(gè)開源的項(xiàng)目评凝,同時(shí)也提供了和 Gradle 配合使用的方式追葡。通常這種操作,我們并不是很常用奕短,所以一般在需要使用的時(shí)候宜肉,做一次修改就可以了,沒必要集成到項(xiàng)目中翎碑。

JarJar 的地址:https://code.google.com/archive/p/jarjar/

配合 Gradle 的使用谬返,項(xiàng)目的 readme 已經(jīng)寫的很清楚了,有興趣的可以去看看日杈。

https://github.com/shevek/jarjar

2遣铝、使用 jarjar

既然多數(shù)情況下,我們不需要頻繁的修改 jar 包莉擒,所以這里只是提供如何使用 jarjar.jar 這個(gè)工具來幫我們對(duì) jar 包進(jìn)行修改酿炸。

這里使用當(dāng)前能下載的最新版:jarjar-1.4.jar

下載地址:https://code.google.com/archive/p/jarjar/downloads

開始使用前,閱讀一下幫助文檔是有必要的涨冀,除了可以 github 上閱讀到使用文檔之外填硕,還可以通過命令的方式查看 jarjar.jar 的使用文檔。

java -jar jarjar.jar


文檔很長鹿鳖,就不在這里截圖展示了扁眯。

jarjar.jar 從文檔上看,jarjar.jar 的核心命令就三個(gè):

  • 查看幫助:jarjar.jar
  • 查看所有包名: jarjar.jar strings <xxx.jar>
  • 更換包名:jarjar.jar process <rulesFile> <inJar> <outJar>

Jarjar 雖然提供了查看包名的方法翅帜,但是一般也不怎么使用它姻檀,這里簡單舉個(gè)例子,提供一個(gè) cxmylib.jar 的包涝滴,先使用 strings 命令看看它的內(nèi)容吧绣版。


可以看到,cxmylib.jar 內(nèi)部其實(shí)非常的簡單歼疮,如果復(fù)雜的 lib 的話僵娃,會(huì)將所有的包全部輸出出來。

使用 jarjar 最重要的方法腋妙,還是用來修改 Jar 的命令:

java -jar process <rulesFile> <inJar> <outJar>

inJar默怨、outJar 非常的好理解,既然是修改 Jar 包骤素,一個(gè)是待修改的 Jar 包匙睹,另外一個(gè)是修改之后重新輸出的 Jar 包。

但是這樣的一個(gè)修改济竹,jarjar 如何知道是需要將哪些 packages 進(jìn)行修改了痕檬,這個(gè)就需要使用 rulesFile 來進(jìn)行規(guī)則的配置了。

3送浊、rulesFile 配置修改規(guī)則

rulesFile 只要是一個(gè)文本文件就可以了梦谜,它主要包含三條命令。

1、rule 指定替換的 Package唁桩。

rule pattern result

2闭树、zap 移除符合規(guī)則的 Package

zap pattern

3、keep 保留符合要求的 Package

keep pattern

其中 pattern 用來指定一個(gè)帶操作的 package 荒澡,為了方便操作报辱,可以使用 「 *」、「 ** 」通配符的方式单山,來進(jìn)行匹配碍现,「 *」表示一個(gè)包名, 「 ** 」將匹配任何有效的類名稱的字符串 米奸。而 result 可以指定 pattern 中通配符匹配的子字符串昼接,通過 @1 ,@2 的方式來匹配悴晰。

這都是通配符的標(biāo)準(zhǔn)用法慢睡,沒什么好細(xì)說的。接下來看個(gè)例子就清楚了膨疏。

rule com.cxmydev.** com.cxmylibdev.@1

這樣的一條 rule 規(guī)則一睁,就會(huì)將一個(gè) com.cxmydev.a.java 替換成 com.cxmylibdev.a.jar 。

而既然有三個(gè)規(guī)則佃却,他們必定是有優(yōu)先級(jí)的者吁。首先 zap 指定需要?jiǎng)h除的所有類,然后在執(zhí)行 rule 規(guī)則替換符合要求的類饲帅,最后如果配置了 keep 規(guī)則的話复凳,會(huì)再執(zhí)行 keep 規(guī)則,將不符合規(guī)則的所有類的移除灶泵,只保留 keep指定的包育八。

總結(jié)來說,這三條命令的執(zhí)行優(yōu)先級(jí)是 : zap > rule > keep 赦邻。

4髓棋、舉個(gè)例子

首先,編輯 rule.txt 文件惶洲,來指定修改規(guī)則按声。

rule com.cxmydev.** com.cxmylibdev.@1

然后使用 process 命令,來進(jìn)行修改恬吕。

java -jar jarjar.jar process rule.txt cxmylib.jar cxmylib_new.jar

就可以在當(dāng)前目錄下看到修改后的 cxmylib_new.jar 文件了签则。

然后使用 jadx 看看源碼,驗(yàn)證修改結(jié)果铐料。


可以看到渐裂,已經(jīng)修改成功了豺旬。

三、修改 aar

在 Android 項(xiàng)目中柒凉,可以被引入的庫族阅,除了 jar 格式的,還有 aar 格式的扛拨。aar 和 jar 相比耘分,簡單來說就是 aar 會(huì)多出一些額外的資源文件举塔,例如:布局绑警、圖片、顏色央渣、so 庫 等计盒。

那么我們碰到需要修改 aar 的情況,怎么辦呢芽丹?其實(shí) aar 也是一個(gè)標(biāo)準(zhǔn)的壓縮包北启,所以我們只需要對(duì)其進(jìn)行解壓,就可以得到 classes.jar 文件拔第,對(duì)其進(jìn)行修改再打包回去即可咕村。

這里就剛才同樣的庫,打包出來的 aar 文件蚊俺,進(jìn)行修改懈涛。

1、使用 unzip 命令進(jìn)行解壓


unzpi 解壓完成之后泳猬,就可以在 tmpDir 目錄下批钠,看到解壓后的文件,其中 classes.jar 文件就是我們需要修改的 jar 包得封。

2埋心、修改 classes.jar 文件

和前面舉例一樣,修改 classes.jar 文件之后忙上,再替換掉它拷呆。

3、再使用 jar 命令重新打包回 aar


4疫粥、驗(yàn)證修改后的效果

四茬斧、缺點(diǎn)

可以看到,如果只是需要修改一個(gè)現(xiàn)成的 jar 的包名并重新打包手形,使用 jarjar.jar 是非常的方便的啥供。

但是它也是有缺陷的:

  • 無法支持反射。如果在 jar 包內(nèi)有使用反射調(diào)用的情況库糠,是無法一并修改的伙狐。
  • aar 的資源文件涮毫,也無法修改(jarjar.jar 只能修改 *.jar 文件)。

不管如何贷屎,自行修改第三方的 SDK 罢防,總是有風(fēng)險(xiǎn)的,可能會(huì)造成不可預(yù)料的問題唉侄,最好還是嘗試和第三方溝通咒吐,說明情況,由第三方來提供一個(gè)修改后的包進(jìn)行集成属划。

本文內(nèi)的示例文件恬叹,可以關(guān)注 承香墨影(cxmydev),回復(fù)關(guān)鍵字:『jarjar』 來獲得。

公眾號(hào)二維碼.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末同眯,一起剝皮案震驚了整個(gè)濱河市绽昼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌须蜗,老刑警劉巖硅确,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異明肮,居然都是意外死亡菱农,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門柿估,熙熙樓的掌柜王于貴愁眉苦臉地迎上來循未,“玉大人,你說我怎么就攤上這事官份≈焕澹” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵舅巷,是天一觀的道長羔味。 經(jīng)常有香客問我,道長钠右,這世上最難降的妖魔是什么赋元? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮飒房,結(jié)果婚禮上搁凸,老公的妹妹穿的比我還像新娘。我一直安慰自己狠毯,他們只是感情好护糖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嚼松,像睡著了一般嫡良。 火紅的嫁衣襯著肌膚如雪锰扶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天寝受,我揣著相機(jī)與錄音坷牛,去河邊找鬼。 笑死很澄,一個(gè)胖子當(dāng)著我的面吹牛京闰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甩苛,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蹂楣,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了浪藻?” 一聲冷哼從身側(cè)響起捐迫,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤乾翔,失蹤者是張志新(化名)和其女友劉穎爱葵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體反浓,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萌丈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雷则。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辆雾。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖月劈,靈堂內(nèi)的尸體忽然破棺而出度迂,到底是詐尸還是另有隱情,我是刑警寧澤猜揪,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布惭墓,位于F島的核電站,受9級(jí)特大地震影響而姐,放射性物質(zhì)發(fā)生泄漏腊凶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一拴念、第九天 我趴在偏房一處隱蔽的房頂上張望钧萍。 院中可真熱鬧,春花似錦政鼠、人聲如沸风瘦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽万搔。三九已至器躏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟹略,已是汗流浹背登失。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挖炬,地道東北人揽浙。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像意敛,于是被迫代替她去往敵國和親馅巷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理草姻,服務(wù)發(fā)現(xiàn)钓猬,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 本文原作者為:kale2010 .blog地址:http://www.cnblogs.com/tianzhijie...
    NoValue閱讀 3,555評(píng)論 0 11
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,099評(píng)論 25 707
  • 對(duì)于昨天的事情我想談?wù)勛约旱目捶枚溃m然我也覺得自己有點(diǎn)傻敞曹,有點(diǎn)過于信任別人了。 對(duì)于矯正牙齒這件事來說全是我的一個(gè)...
    mila翁翁閱讀 159評(píng)論 0 0
  • Review: Excuse me, where can I get a taxi? 請(qǐng)問综膀,我在哪里打車澳迫? Tax...
    0c05e63bafa4閱讀 549評(píng)論 0 0