对第三方 SDK 依赖冲突,重新打个包试试

版权声明:

本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。

未经允许,不得转载。

一、前言

在开发 App 的时候,经常会有需要借助第三方 SDK 的情况。但是有时候多方提供的 SDK 中,可能引入了同样的库,或者类的名称以及包名完全一样的情况。这样的话,如果同时对这两个 SDK 进行引入的话,就会出现 duplicate entry 的错误。


不谈什么和对方协商,给出一个符合我们使用要求的包这种事,只是从技术的角度来看,如何解决这个问题。

二、分析问题

首先,分析问题。如果对方的 SDK 是使用 Gradle compile 的方式引入的,并且对方集成其他库的方式也是如此的话,可以在 Compile 中配置 exclude 的方式剔除掉引入的库,这是一个理想化的做法。关于 exclude 的使用,之后有机会再讲,这不是本文的重点。

使用 exclude 是一个理想的情况,多数情况下,duplicate entry 的冲突,都是来自对方的代码中的类(可能对方使用引入源码的方式引入的开源库),这种情况下,使用 exclude 就不好使了。

那么既然是 Java 类重复了,那么如果我们有办法去修改某一个 SDK 中,类的包名,就可以解决这种问题了。

接下来就是我们修改 jar 中类的包名的工具上场了:jarjar.jar。

二、jarjar.jar

1、什么是 Jar jar

Jar Jar Link 是一个实用的工具,它可以轻松的重新打包 Java 库,得到一个没有外部依赖的单独 jar 包,从而很好的嵌入到我们发布的项目内。而我们这里,使用 jarjar.jar 的主要作用,就是为了解决 duplicate entry 这种文件冲突的情况。

jarjar 提供了非常方便的 *.jar 工具来供我们使用。这是一个开源的项目,同时也提供了和 Gradle 配合使用的方式。通常这种操作,我们并不是很常用,所以一般在需要使用的时候,做一次修改就可以了,没必要集成到项目中。

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

配合 Gradle 的使用,项目的 readme 已经写的很清楚了,有兴趣的可以去看看。

https://github.com/shevek/jarjar

2、使用 jarjar

既然多数情况下,我们不需要频繁的修改 jar 包,所以这里只是提供如何使用 jarjar.jar 这个工具来帮我们对 jar 包进行修改。

这里使用当前能下载的最新版:jarjar-1.4.jar

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

开始使用前,阅读一下帮助文档是有必要的,除了可以 github 上阅读到使用文档之外,还可以通过命令的方式查看 jarjar.jar 的使用文档。

java -jar jarjar.jar


文档很长,就不在这里截图展示了。

jarjar.jar 从文档上看,jarjar.jar 的核心命令就三个:

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

Jarjar 虽然提供了查看包名的方法,但是一般也不怎么使用它,这里简单举个例子,提供一个 cxmylib.jar 的包,先使用 strings 命令看看它的内容吧。


可以看到,cxmylib.jar 内部其实非常的简单,如果复杂的 lib 的话,会将所有的包全部输出出来。

使用 jarjar 最重要的方法,还是用来修改 Jar 的命令:

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

inJar、outJar 非常的好理解,既然是修改 Jar 包,一个是待修改的 Jar 包,另外一个是修改之后重新输出的 Jar 包。

但是这样的一个修改,jarjar 如何知道是需要将哪些 packages 进行修改了,这个就需要使用 rulesFile 来进行规则的配置了。

3、rulesFile 配置修改规则

rulesFile 只要是一个文本文件就可以了,它主要包含三条命令。

1、rule 指定替换的 Package。

rule pattern result

2、zap 移除符合规则的 Package

zap pattern

3、keep 保留符合要求的 Package

keep pattern

其中 pattern 用来指定一个带操作的 package ,为了方便操作,可以使用 「 *」、「 ** 」通配符的方式,来进行匹配,「 *」表示一个包名, 「 ** 」将匹配任何有效的类名称的字符串 。而 result 可以指定 pattern 中通配符匹配的子字符串,通过 @1 ,@2 的方式来匹配。

这都是通配符的标准用法,没什么好细说的。接下来看个例子就清楚了。

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

这样的一条 rule 规则,就会将一个 com.cxmydev.a.java 替换成 com.cxmylibdev.a.jar 。

而既然有三个规则,他们必定是有优先级的。首先 zap 指定需要删除的所有类,然后在执行 rule 规则替换符合要求的类,最后如果配置了 keep 规则的话,会再执行 keep 规则,将不符合规则的所有类的移除,只保留 keep指定的包。

总结来说,这三条命令的执行优先级是 : zap > rule > keep 。

4、举个例子

首先,编辑 rule.txt 文件,来指定修改规则。

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

然后使用 process 命令,来进行修改。

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

就可以在当前目录下看到修改后的 cxmylib_new.jar 文件了。

然后使用 jadx 看看源码,验证修改结果。


可以看到,已经修改成功了。

三、修改 aar

在 Android 项目中,可以被引入的库,除了 jar 格式的,还有 aar 格式的。aar 和 jar 相比,简单来说就是 aar 会多出一些额外的资源文件,例如:布局、图片、颜色、so 库 等。

那么我们碰到需要修改 aar 的情况,怎么办呢?其实 aar 也是一个标准的压缩包,所以我们只需要对其进行解压,就可以得到 classes.jar 文件,对其进行修改再打包回去即可。

这里就刚才同样的库,打包出来的 aar 文件,进行修改。

1、使用 unzip 命令进行解压


unzpi 解压完成之后,就可以在 tmpDir 目录下,看到解压后的文件,其中 classes.jar 文件就是我们需要修改的 jar 包。

2、修改 classes.jar 文件

和前面举例一样,修改 classes.jar 文件之后,再替换掉它。

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


4、验证修改后的效果

四、缺点

可以看到,如果只是需要修改一个现成的 jar 的包名并重新打包,使用 jarjar.jar 是非常的方便的。

但是它也是有缺陷的:

  • 无法支持反射。如果在 jar 包内有使用反射调用的情况,是无法一并修改的。
  • aar 的资源文件,也无法修改(jarjar.jar 只能修改 *.jar 文件)。

不管如何,自行修改第三方的 SDK ,总是有风险的,可能会造成不可预料的问题,最好还是尝试和第三方沟通,说明情况,由第三方来提供一个修改后的包进行集成。

本文内的示例文件,可以关注 承香墨影(cxmydev),回复关键字:『jarjar』 来获得。

公众号二维码.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 本文原作者为:kale2010 .blog地址:http://www.cnblogs.com/tianzhijie...
    NoValue阅读 3,529评论 0 11
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,079评论 25 707
  • 对于昨天的事情我想谈谈自己的看法,虽然我也觉得自己有点傻,有点过于信任别人了。 对于矫正牙齿这件事来说全是我的一个...
    mila翁翁阅读 149评论 0 0
  • Review: Excuse me, where can I get a taxi? 请问,我在哪里打车? Tax...
    0c05e63bafa4阅读 526评论 0 0