当前位置: 首页 > 科技观察

第三方SDK存在依赖冲突,重新打包试试

时间:2023-03-19 13:37:25 科技观察

1.前言在开发APP的时候,往往需要依赖第三方SDK。但有时多方提供的SDK中可能会引入同一个库,或者类名和包名完全一样。在这种情况下,如果同时引入两个SDK,就会出现重复录入的错误。不是说和对方协商,给一个符合我们要求的包,而是从技术角度怎么解决这个问题。二、分析问题首先,分析问题。如果对方的SDK是使用Gradlecompile导入的,并且对方集成其他库的方式也是一样的,那么可以在Compile中配置exclude来剔除导入的库,是比较理想的做法。关于exclude的使用,后面再说,这不是本文的重点。使用exclude是一种理想情况。大多数情况下,重复入口的冲突来自于对方代码中的类(可能对方使用源码导入了开源库)。这种情况下用exclude就不好做了。那么既然Java类是重复的,如果我们有办法修改某个SDK中某个类的包名,就可以解决这个问题。接下来是我们修改jar中类的包名的工具:jarjar.jar。2、jarjar.jar1、什么是JarjarJarJarLink是一个实用的工具,它可以方便的对Java库进行重新打包,得到一个独立的jar包,不需要外部依赖,从而可以很好的嵌入到我们发布的项目中。而这里使用jarjar.jar的主要作用是解决重复录入等文件冲突的情况。jarjar提供了一个非常方便的*.jar工具供我们使用。这是一个开源项目,它还提供了一种使用Gradle的方法。通常,我们不会经常使用这种操作,所以当我们需要使用它时,只需修改一次即可,不需要将其集成到项目中。JarJar的地址:https://code.google.com/archive/p/jarjar/使用Gradle,项目的readme已经写的很清楚了。如果你有兴趣,你可以看看。https://github.com/shevek/jarjar2.使用jarjar由于大多数情况下,我们不需要经常修改jar包,所以这里只是介绍如何使用工具jarjar.jar来帮助我们修改jar包.这里使用的是这里可??以下载到的最新版本:jarjar-1.4.jar下载地址:https://code.google.com/archive/p/jarjar/downloads在开始使用之前,需要阅读帮助文档,除了在github上阅读使用文档外,还可以通过命令查看jarjar.jar的使用文档。java-jarjarjar.jar文件很长,这里就不截图了。jarjar.jar从文档上看jarjar.jar的核心命令只有三个:查看帮助:jarjar.jar查看所有包名:jarjar.jarstrings替换包名:jarjar.jarprocessJarjar虽然提供了查看包名的方法,但是一般用的不多。这里简单举例提供一个cxmylib.jar包,先用strings命令查看其内容。可见cxmylib.jar的内部其实很简单。如果是复杂的lib,会输出所有包。jarjar最主要的使用方式就是修改Jar命令:java-jarprocessinJar和outJar很好理解,既然是修改Jar包,一个是Jar包待修改,另一种是修改后重新导出的Jar包。但是这样的修改,jarjar怎么知道哪些包需要修改,这就需要使用rulesFile来配置规则了。3.rulesFile配置和修改规则rulesFile只需要是一个文本文件即可,主要包含三个命令。1.规则指定替换包。rulepatternresult2,zap移除符合规则的packagezappatern3,keep保留符合要求的packagekeeppattern,其中pattern用于指定带操作的包,为了操作方便,可以使用“*”和“**”通配符要匹配,“*”表示包名,“**”将匹配任何有效的类名字符串。而result可以在pattern中指定通配符匹配的子串,通过@1和@2的方式进行匹配。这是通配符的标准用法,没什么好细说的。接下来我们看一个例子。像rulecom.cxmydev.**com.cxmylibdev.@1这样的规则将用com.cxmylibdev.a.jar替换com.cxmydev.a.java。既然有三个规则,它们就必须具有优先权。首先zap指定所有需要删除的类,然后执行rule规则替换符合要求的类。最后,如果配置了keep规则,会再次执行keep规则,将不符合规则的类全部移除,只保留指定的类。包。综上所述,这三个命令的执行优先级为:zap>rule>keep。4.例如首先编辑rule.txt文件,指定修改规则。rulecom.cxmydev.**com.cxmylibdev.@1然后用process命令修改。java-jarjarjar.jarprocessrule.txtcxmylib.jarcxmylib_new.jar在当前目录下可以看到修改后的cxmylib_new.jar文件。然后使用jadx查看源码,验证修改结果。可见修改成功。3、修改aar在Android工程中,可以导入的库,除了jar格式外,还有aar格式。相对于jar,aar简单的说就是aar会多出一些资源文件,比如:layout,picture,color,solibrary等等。那么如果我们需要修改aar怎么办呢?其实aar也是一个标准的压缩包,所以我们只需要解压得到classes.jar文件,修改后打包回去即可。这里还是刚才一样的库,修改打包的aar文件。1.使用unzip命令解压unzpi解压完成后在tmpDir目录下可以看到解压后的文件,其中classes.jar文件就是我们需要修改的jar包。2.修改classes.jar文件如上例,修改classes.jar文件后,将其替换。3、然后用jar命令重新打包回aar4,验证修改后的效果。4.缺点可见。如果只是需要修改已有jar的包名,重新打包,使用jarjar.jar非常方便。但它也有缺陷:不能支持反射。如果jar包中有反射调用,则不能同时修改。aar的资源文件也不能修改(jarjar.jar只能修改*.jar文件)。不管怎样,自己修改第三方SDK总是有风险的,可能会出现不可预知的问题。最好尽量和第三方沟通,说明情况,让第三方提供修改包进行集成。【本文为专栏作家“张扬”原创稿件,转载请微信♂联系作者获得授权】点此查看作者更多好文