Tencent / MMKV

An efficient, small mobile key-value storage framework developed by WeChat. Works on Android, iOS, macOS, Windows, and POSIX.
Other
17.2k stars 1.88k forks source link

iOS依赖了底层C++库,iOS上层和底层C++都想使用mmkv,该怎么集成mmkv到项目中 #1251

Closed PentonBin closed 5 months ago

PentonBin commented 5 months ago

背景

我们的iOS项目,上层使用的是oc语言,底层有一个C++库,这个C++库以静态库的方式集成到iOS工程中。 最开始只有上层iOS使用mmkv,我们构建mmkv的iOS版本,一切正常,后来底层C++库也希望能够使用mmkv,而且这个C++库还会在Android、pc(Window/MacOS)上集成使用。

问题

如果底层C++库也希望使用mmkv,有以下方案可以集成到工程中,但都会有问题。

方案1:底层C++库集成mmkv

如果底层C++库自己打包一份mmkv代码,并集成到C++库中,iOS上层同样集成了mmkv,会有符号冲突、包增量、启动耗时等问题。

方案2:上层iOS和底层C++库集成相同的一份MMKVCore

由于MMKVCore中包含了部分iOS平台的代码,构建MMKVCore时会使用宏区分开,例如同一个接口,构建产物在C++平台参数类型是std::string,在iOS平台就是NSString 如果构建C++版本的MMKVCore,则会丢失iOS平台相关的代码,这个C++版本的MMKVCore无法在iOS上使用,也就无法共用同一份MMKVCore代码。

方案3:iOS层提供接口给底层C++库调用

iOS上层提供mmkv wrap层给底层C++调用,但由于底层C++库有自己的demo工程,无法运行和调试代码,研发效率也会大打折扣

方案4:修改MMKVCore,同时生成C++和iOS两个平台的代码

底层C++库使用C++版本的MMKVCore,但在生成底层C++库的产物时,strip掉MMKVCore的符号,上层iOS打包生成同时包含C++和iOS的MMKVCore,最终链接时,使用上层的符号 这个方案需要修改MMKVCore的代码,让其能够同时生成两个平台的代码,但改动比较大,同步github代码增加成本,稳定性可能会受到影响,风险和难度较大

预期

以上的方案都有一些问题,想请问对于这个场景,是否有一些比较好的建议,或者未来是否有相关的规划。