3

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

 2 years ago
source link: https://www.v2ex.com/t/881183
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  iDev

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

  XiaoXiaoMagician · 7 小时 7 分钟前 · 734 次点击
前置说明:

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

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

问题:

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

---------------------------------------------------
还请大佬们看看如何处理?感激不尽!
13 条回复    2022-09-19 16:11:35 +08:00
timelessg

timelessg      7 小时 0 分钟前 via Android

不确定你是什么平台,但都大同小异。首先这个是符号冲突,无解,除非改类名,静态变量,枚举等等。最好的解决办法是两边搞一个 base 库去依赖
XiaoXiaoMagician

XiaoXiaoMagician      6 小时 45 分钟前

@timelessg 就是我们这边是提供授权认证的部门,有个内部对接埋点的需求,数据要上报到数据那边的部门。
别的部门的 APP 一些业务服务上也需要用到埋点收集。所以,用依赖的话会有初始化数据 SDK 这块的顺序问题。而且上报的数据对应的后台无法区分是哪块的数据。
xuanbg

xuanbg      6 小时 38 分钟前

让 A 部门用部门 B 的新版本静态库重新编译动态库,然后你之间用部门 A 编译的动态库就行了。
shawndev

shawndev      6 小时 30 分钟前

方案:
1. 首先通过 lipo 分离部门 A 不同架构的静态库。
2. 通过 ar -x 将静态库拆解为 .o 文件。
3. 移除部门 A 中,部门 B 静态库的相关.o
4. 通过 ar 命令重新生成部门 A 的动态库。

注意需要确保部门 C 对接的部门 B 库,和部门 A 对接的部门 B 库是同一个版本。不然只能通过阻止符号冲突解决了。
XiaoXiaoMagician

XiaoXiaoMagician      6 小时 28 分钟前

@xuanbg 你的意思是 部门 C 只使用 部门 A 提供的动态库就行了是吗?主要是应为 部门 B 的 SDK 也会给其他部门使用的。毕竟业务不同。
XiaoXiaoMagician

XiaoXiaoMagician      6 小时 16 分钟前

@shawndev 主要是因为数据收集的 SDK 会有一个初始化的调用来设置参数,然后根据参数将数据发往不同的服务器上的。如果只用 1 个库的话就有这种问题。
是不是直接让 部门 A 通过直接对接服务端 API 的方式去收集数据的好?避免外部依赖?
dayeye2006199

dayeye2006199      6 小时 12 分钟前 via Android

典型的💎依赖问题
XiaoXiaoMagician

XiaoXiaoMagician      6 小时 10 分钟前

想知道其他平台对于自身 SDK 内部做数据收集是用什么方案?直接通过接口上报给自己的服务器吗?不使用外部依赖?
xylophone21

xylophone21      3 小时 48 分钟前

授权认证模块产生的埋点信息, 其分析责任在部门 A 还是部门 C?

1. 如果在部门 C,可以使用依赖倒置的方式, 让部门 C 来依赖埋点信息. 授权认证模块只需要把必要信息通知给接口, 不再关心具体埋点数据到哪里了.
2. 如果在部门 A, 那么数据收集模块应该具备多实例和一定的 API 兼容特性. A 和 C 各自使用自己初始化(参数)的实例.
3. 如果部门 A 和 C 都要关注, 那么说明 C 这样的业务单元不会太多, 或者在部门 A 内部有负责人, 那么 1 或 2 都可以.
XiaoXiaoMagician

XiaoXiaoMagician      3 小时 0 分钟前

@xylophone21 感谢大佬,大体明白了需要怎样处理的思路。
pheyer

pheyer      1 小时 58 分钟前

部门 A 的 SDK 只导出对外公开的符号就行,build setting 有一个设置是类似于 exported symbol 的选项
XiaoXiaoMagician

XiaoXiaoMagician      1 小时 55 分钟前

@pheyer 主要是 部门 A 的 SDK 内部打包了 部门 B 的 SDK ,设置不了对 部门 B 里面的公开符号把?
BigDogWang

BigDogWang      1 小时 29 分钟前

部门 A 改成 compileOnly B SDK 就可以了

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK