1
timelessg 2022-09-19 10:40:45 +08:00 via Android
不确定你是什么平台,但都大同小异。首先这个是符号冲突,无解,除非改类名,静态变量,枚举等等。最好的解决办法是两边搞一个 base 库去依赖
|
2
XiaoXiaoMagician OP @timelessg 就是我们这边是提供授权认证的部门,有个内部对接埋点的需求,数据要上报到数据那边的部门。
别的部门的 APP 一些业务服务上也需要用到埋点收集。所以,用依赖的话会有初始化数据 SDK 这块的顺序问题。而且上报的数据对应的后台无法区分是哪块的数据。 |
3
xuanbg 2022-09-19 11:02:45 +08:00
让 A 部门用部门 B 的新版本静态库重新编译动态库,然后你之间用部门 A 编译的动态库就行了。
|
4
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 库是同一个版本。不然只能通过阻止符号冲突解决了。 |
5
XiaoXiaoMagician OP @xuanbg 你的意思是 部门 C 只使用 部门 A 提供的动态库就行了是吗?主要是应为 部门 B 的 SDK 也会给其他部门使用的。毕竟业务不同。
|
6
XiaoXiaoMagician OP @shawndev 主要是因为数据收集的 SDK 会有一个初始化的调用来设置参数,然后根据参数将数据发往不同的服务器上的。如果只用 1 个库的话就有这种问题。
是不是直接让 部门 A 通过直接对接服务端 API 的方式去收集数据的好?避免外部依赖? |
7
dayeye2006199 2022-09-19 11:28:45 +08:00 via Android
典型的💎依赖问题
|
8
XiaoXiaoMagician OP 想知道其他平台对于自身 SDK 内部做数据收集是用什么方案?直接通过接口上报给自己的服务器吗?不使用外部依赖?
|
9
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 都可以. |
10
XiaoXiaoMagician OP @xylophone21 感谢大佬,大体明白了需要怎样处理的思路。
|
11
pheyer 2022-09-19 15:42:14 +08:00
部门 A 的 SDK 只导出对外公开的符号就行,build setting 有一个设置是类似于 exported symbol 的选项
|
12
XiaoXiaoMagician OP @pheyer 主要是 部门 A 的 SDK 内部打包了 部门 B 的 SDK ,设置不了对 部门 B 里面的公开符号把?
|
13
BigDogWang 2022-09-19 16:11:35 +08:00
部门 A 改成 compileOnly B SDK 就可以了
|
14
pheyer 2022-09-19 19:09:54 +08:00
@XiaoXiaoMagician 相反设置也可以的,指定哪些符号不对外公开,unexported symbol
|