请教大佬们关于 SDK 对接方面的问题

2022-09-19 10:33:15 +08:00
 XiaoXiaoMagician
前置说明:

部门 A ,提供了一个授权认证的 Framework 动态库。
部门 B ,提供了一个数据收集的 Framework 静态库。
部门 C ,需要对接 部门 A 和 部门 B 的 SDK 库。

因为部门 A 的 SDK 的内部含有部门 B 的静态库。导致部门 C 对接两边 SDK 时编译冲突。

问题:

1 、部门 A 这边有没有好的办法隔离自身内部包含的 Framework ?(如没有,请看问题 2 )
2 、由于部门 A 的 SDK 内部需要做数据收集,部门 C 的业务上也需要数据收集,部门 B 则是提供这个服务方。那么有没有什么好的方案能解决这种类似的情况?

---------------------------------------------------
还请大佬们看看如何处理?感激不尽!
8289 次点击
所在节点    iDev
14 条回复
timelessg
2022-09-19 10:40:45 +08:00
不确定你是什么平台,但都大同小异。首先这个是符号冲突,无解,除非改类名,静态变量,枚举等等。最好的解决办法是两边搞一个 base 库去依赖
XiaoXiaoMagician
2022-09-19 10:55:46 +08:00
@timelessg 就是我们这边是提供授权认证的部门,有个内部对接埋点的需求,数据要上报到数据那边的部门。
别的部门的 APP 一些业务服务上也需要用到埋点收集。所以,用依赖的话会有初始化数据 SDK 这块的顺序问题。而且上报的数据对应的后台无法区分是哪块的数据。
xuanbg
2022-09-19 11:02:45 +08:00
让 A 部门用部门 B 的新版本静态库重新编译动态库,然后你之间用部门 A 编译的动态库就行了。
shawndev
2022-09-19 11:10:46 +08:00
方案:
1. 首先通过 lipo 分离部门 A 不同架构的静态库。
2. 通过 ar -x 将静态库拆解为 .o 文件。
3. 移除部门 A 中,部门 B 静态库的相关.o
4. 通过 ar 命令重新生成部门 A 的动态库。

注意需要确保部门 C 对接的部门 B 库,和部门 A 对接的部门 B 库是同一个版本。不然只能通过阻止符号冲突解决了。
XiaoXiaoMagician
2022-09-19 11:12:38 +08:00
@xuanbg 你的意思是 部门 C 只使用 部门 A 提供的动态库就行了是吗?主要是应为 部门 B 的 SDK 也会给其他部门使用的。毕竟业务不同。
XiaoXiaoMagician
2022-09-19 11:24:10 +08:00
@shawndev 主要是因为数据收集的 SDK 会有一个初始化的调用来设置参数,然后根据参数将数据发往不同的服务器上的。如果只用 1 个库的话就有这种问题。
是不是直接让 部门 A 通过直接对接服务端 API 的方式去收集数据的好?避免外部依赖?
dayeye2006199
2022-09-19 11:28:45 +08:00
典型的💎依赖问题
XiaoXiaoMagician
2022-09-19 11:30:21 +08:00
想知道其他平台对于自身 SDK 内部做数据收集是用什么方案?直接通过接口上报给自己的服务器吗?不使用外部依赖?
xylophone21
2022-09-19 13:52:12 +08:00
授权认证模块产生的埋点信息, 其分析责任在部门 A 还是部门 C?

1. 如果在部门 C,可以使用依赖倒置的方式, 让部门 C 来依赖埋点信息. 授权认证模块只需要把必要信息通知给接口, 不再关心具体埋点数据到哪里了.
2. 如果在部门 A, 那么数据收集模块应该具备多实例和一定的 API 兼容特性. A 和 C 各自使用自己初始化(参数)的实例.
3. 如果部门 A 和 C 都要关注, 那么说明 C 这样的业务单元不会太多, 或者在部门 A 内部有负责人, 那么 1 或 2 都可以.
XiaoXiaoMagician
2022-09-19 14:40:33 +08:00
@xylophone21 感谢大佬,大体明白了需要怎样处理的思路。
pheyer
2022-09-19 15:42:14 +08:00
部门 A 的 SDK 只导出对外公开的符号就行,build setting 有一个设置是类似于 exported symbol 的选项
XiaoXiaoMagician
2022-09-19 15:45:31 +08:00
@pheyer 主要是 部门 A 的 SDK 内部打包了 部门 B 的 SDK ,设置不了对 部门 B 里面的公开符号把?
BigDogWang
2022-09-19 16:11:35 +08:00
部门 A 改成 compileOnly B SDK 就可以了
pheyer
2022-09-19 19:09:54 +08:00
@XiaoXiaoMagician 相反设置也可以的,指定哪些符号不对外公开,unexported symbol

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

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

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

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

© 2021 V2EX