Android 项目多个 Jar 包有命名空间冲突,有办法解决吗?

2021-04-21 09:23:17 +08:00
 Moyudawang

简单来说,同一个芯片的 SDK 被两个硬件组装厂家做了封装,我们的项目添加两个 Module 分别引用两个厂家封装后的 SDK(jar 、so),然后他们引用的芯片 SDK 就出现命名空间冲突了,而且他们用的芯片 SDK 版本还不一样,让厂家修改也不现实。
现在就一直报错几个 Module 引用的 Jar 文件中有相同的内容,
尝试把 Module 编译成 dex 动态加载,可是 dex 不能把 jar 和 so 打包进去,
有没有大佬遇到过这种问题?望赐教

6366 次点击
所在节点    Android
38 条回复
HongJay
2021-04-21 09:26:31 +08:00
jar 不能编辑么。gradle 不是有排除语法么
Moyudawang
2021-04-21 09:27:53 +08:00
@HongJay 厂家的 SDK,不能编辑,因为用的版本不同,也不能排除
xne110
2021-04-21 09:30:25 +08:00
如果就是个 Jar 的话,我倒是遇到过,我是直接用 zip 打开 Jar 把里面重复的东西直接删了 ,在导入就 ok 了
Moyudawang
2021-04-21 09:33:28 +08:00
@xne110 是硬件厂家引用了芯片厂家的 so 和 Jar,我们再引用硬件厂家的 Jar
Moyudawang
2021-04-21 09:34:28 +08:00
@xne110 而且他们用的芯片 Sdk 版本也不一样,直接删除不行
wsxyeah
2021-04-21 09:36:42 +08:00
改 bytecode,参考下 Android X 的做法
cache
2021-04-21 09:41:13 +08:00
我记得有个工具专门干这个事
好像叫 jarjar
xne110
2021-04-21 09:44:11 +08:00
就是有两三方包里引用了 同一个不同版本的三方包 两个直接删了,在自己项目里引用那个相同三方包 不就好了,如果他们混淆了 那就没办法了 ,我可能想的比较简单哈
Moyudawang
2021-04-21 09:52:19 +08:00
@wsxyeah 看一眼头大,慢慢研究一下
@cache 我去试试
@xne110 不同版本不一定向下兼容,命名一样,实现不一定一样
actar
2021-04-21 10:01:16 +08:00
你们是多种设备吗,每种设备使用不同的 SDK 。如果是这样的话,可以考虑多维度打包。每种设备只打入自己需要的包。关键字:flavorDimensions,productFlavors 。这样每种设备打出来的包是不一样的。缺点就是每一种设备都会打一个包,后续更新会需要维护多种设备的安装包。但是打包的时候会将多种设备的安装包同时打出来,不需要一个一个的打包。
Moyudawang
2021-04-21 10:04:52 +08:00
@actar 是的,适配多种设备,现用的也是这种办法,不过还是想只打包到一个 App 里,这样发布到商店也简单点
wms
2021-04-21 10:05:56 +08:00
把两个 SDK 用到的部分做成两个独立的服务, 主 APP 去跟这个两个服务通信
Moyudawang
2021-04-21 10:14:03 +08:00
@wms 那这两个服务不也是 App 启动的吗?现在编译通不过
wms
2021-04-21 10:18:32 +08:00
@Moyudawang 每个服务做一个 APK, 将三个 APK 打包成一个
timethinker
2021-04-21 10:25:37 +08:00
自己实现一个类加载器,加载不同 SDK 的 jar 可行性如何?
就是说把厂商 SDK 的 jar 当做文件资源,不直接通过 gradle 打包,而是使用动态加载的方式载入需要的依赖。
lawfun
2021-04-21 10:39:00 +08:00
我觉得 @qwe520liao 说的可行。

原文中的
“尝试把 Module 编译成 dex 动态加载,可是 dex 不能把 jar 和 so 打包进去”
可以把 so 都打进 主 APP 里。

破解 jar 看源码,分析代码自己再实现下应该也行,不过可能会很费时。
Moyudawang
2021-04-21 10:50:30 +08:00
@wms 我还没试过这种,可以尝试一下
@qwe520liao android 不能动态加载 jar 吧,只能先编译成 dex,第三方的 jar 我试了,编译成 dex 失败
@lawfun 这个确实太费时了,因为厂家的 jar 包不止包含芯片的功能,还有厂家其他硬件的功能
Moyudawang
2021-04-21 11:04:22 +08:00
@cache 试了不行,Jar 里含有 Jni 方式加载 So 里的方法,所以命名空间不能改,
mmrx
2021-04-21 11:53:14 +08:00
@Moyudawang #14 的方案感觉可行,俩库的 apk 当做服务,用哪个装哪个 apk,然后用 AIDL 通信
Moyudawang
2021-04-21 12:29:32 +08:00
@mmrx 嗯,这个方式我需要花时间尝试一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/772085

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX