自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

 [[196375]]

一、前言

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

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

二、分析問(wèn)題

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

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

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

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

二、jarjar.jar

1、什么是 Jar jar

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

jarjar 提供了非常方便的 *.jar 工具來(lái)供我們使用。這是一個(gè)開源的項(xiàng)目,同時(shí)也提供了和 Gradle 配合使用的方式。通常這種操作,我們并不是很常用,所以一般在需要使用的時(shí)候,做一次修改就可以了,沒(méi)必要集成到項(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è)工具來(lái)幫我們對(duì) jar 包進(jìn)行修改。

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

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

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

  1. java -jar jarjar.jar 

文檔很長(zhǎng),就不在這里截圖展示了。

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

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

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

 

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

使用 jarjar 最重要的方法,還是用來(lái)修改 Jar 的命令:

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

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

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

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

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

1、rule 指定替換的 Package。

  1. rule pattern result 

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

  1. zap pattern 

3、keep 保留符合要求的 Package

  1. keep pattern 

其中 pattern 用來(lái)指定一個(gè)帶操作的 package ,為了方便操作,可以使用 「 * 」、「 ** 」通配符的方式,來(lái)進(jìn)行匹配,「 * 」表示一個(gè)包名, 「 ** 」將匹配任何有效的類名稱的字符串 。而 result 可以指定 pattern 中通配符匹配的子字符串,通過(guò) @1 ,@2 的方式來(lái)匹配。

這都是通配符的標(biāo)準(zhǔn)用法,沒(méi)什么好細(xì)說(shuō)的。接下來(lái)看個(gè)例子就清楚了。

  1. 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é)來(lái)說(shuō),這三條命令的執(zhí)行優(yōu)先級(jí)是 : zap > rule > keep 。

4、舉個(gè)例子

首先,編輯 rule.txt 文件,來(lái)指定修改規(guī)則。

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

然后使用 process 命令,來(lái)進(jìn)行修改。

  1. 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)目中,可以被引入的庫(kù),除了 jar 格式的,還有 aar 格式的。aar 和 jar 相比,簡(jiǎn)單來(lái)說(shuō)就是 aar 會(huì)多出一些額外的資源文件,例如:布局、圖片、顏色、so 庫(kù) 等。

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

這里就剛才同樣的庫(kù),打包出來(lái)的 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 是非常的方便的。

但是它也是有缺陷的:

無(wú)法支持反射。如果在 jar 包內(nèi)有使用反射調(diào)用的情況,是無(wú)法一并修改的。

aar 的資源文件,也無(wú)法修改(jarjar.jar 只能修改 *.jar 文件)。

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

【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)微信公眾號(hào)聯(lián)系作者獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專欄
相關(guān)推薦

2024-04-03 12:57:29

2015-11-05 16:44:37

第三方登陸android源碼

2023-06-27 07:44:53

xxl-job分布式任務(wù)調(diào)度平臺(tái)

2014-07-23 08:55:42

iOSFMDB

2019-07-30 11:35:54

AndroidRetrofit庫(kù)

2019-09-03 18:31:19

第三方支付電商支付行業(yè)

2009-12-31 14:38:34

Silverlight

2016-10-21 14:09:10

2017-12-11 15:53:56

2021-06-22 11:58:47

Windows操作系統(tǒng)功能

2022-01-14 09:57:14

鴻蒙HarmonyOS應(yīng)用

2011-07-15 09:26:04

.NET第三方控件

2009-01-14 12:45:05

MSNIM蘋果

2014-07-22 10:56:45

Android Stu第三方類庫(kù)

2017-05-16 13:24:02

LinuxCentOS第三方倉(cāng)庫(kù)

2021-09-26 10:43:08

注冊(cè)Istio集成

2013-08-12 16:04:19

第三方移動(dòng)應(yīng)用

2010-05-25 11:09:31

SVN工具

2021-12-06 09:44:30

鴻蒙HarmonyOS應(yīng)用

2014-07-25 09:33:22

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)