项目应用需要匹配多个外部厂家,如何优雅实现 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
FranzKafka95
V2EX    程序员

项目应用需要匹配多个外部厂家,如何优雅实现

  •  
  •   FranzKafka95 2022-03-11 12:15:40 +08:00 via Android 1989 次点击
    这是一个创建于 1311 天前的主题,其中的信息可能已经有所发展或是发生改变。
    继上次头文件向下兼容后(最终我们采用了宏控的方式来解决这个问题),我们产品经理又给我们带来了难题,在同一个项目中,两个厂家都需要来适配我们定义的借口并提供 lib.so ,在编译时无法区分具体的厂家,只有在程序运行起来时根据配置去解析。
    这样意味着我们的软件在打包时需要打包两个 libx.so ,且不能再放到 system/lib64 目录下了(程序运行环境是安卓)

    目前为止,我们想到的办法是,将代码里直接调用 libx.so 接口的地方改掉,改为调用函数指针,而这个指针地址通过 dlopen 后拿到的句柄去获取,对于不同的厂家 dlopen 不同路径下的 libx.so 即可。

    除了这种方式,我们也想过在程序运行真正前,先执行代码逻辑将 libx. so 拷贝到 system/lib64 目录下,然后调用的地方仍旧保持不变。但实践下来并不成功,原因是 system/lib64 不支持外部拷入。

    想问一下大家,这种情况有没有好的解决办法?
    11 条回复    2022-03-11 23:03:16 +08:00
    FranzKafka95
        1
    FranzKafka95  
    OP
       2022-03-11 12:20:37 +08:00 via Android
    另外备注一下,本身我们的进程属于 root 进程,而且 /system/lib64 对于 root 是可读写的,但就是不清楚为什么 cp 执行不成功,脑壳痛
    cppc
        2
    cppc  
       2022-03-11 12:48:45 +08:00
    一个 so ,两份头文件分别给两家厂商。你这个场景我看着像提供两份特供 SDK ,不是别人来适配你们。。
    jorneyr
        3
    jorneyr  
       2022-03-11 12:51:13 +08:00
    so 动态加载
    FranzKafka95
        4
    FranzKafka95  
    OP
       2022-03-11 13:12:47 +08:00 via Android
    @cppc 一份头文件,给两个甚至多个厂家,厂家来实现提供 so 库,我们集成厂家的 so 库
    FranzKafka95
        5
    FranzKafka95  
    OP
       2022-03-11 13:13:19 +08:00 via Android
    @jorneyr 请问如果实现这个动态加载,除了 dlopen 的这种形式坏还有其他办法吗
    cppc
        6
    cppc  
       2022-03-11 13:28:12 +08:00
    @FranzKafka95 搞半天你才是服务使用方,你自己开发一个代理层,它在根据需求加载同厂家的 so ,把 so 的句柄,和函数指针保存起来,你自己应用不直接调用厂商的 so ,而是通过这个代理来调用。
    jorneyr
        7
    jorneyr  
       2022-03-11 13:30:21 +08:00
    @FranzKafka95
    好像没了,就是 so 的隐式动态加载。
    FranzKafka95
        8
    FranzKafka95  
    OP
       2022-03-11 13:52:08 +08:00 via Android
    @cppc 貌似只有这样改了,可是我还是不死心,为什么不能 cp 到 system/lib64 直接以系统加载的方式直接掉接口
    cppc
        9
    cppc  
       2022-03-11 14:00:24 +08:00
    jna 跨平台动态库加载实现是这样的:它加载动态库时,先判断当前环境,然后把 jar 包里面的动态库保存到临时目录,最后再通过绝对路径加载动态库。
    都是 java ,可抄
    FranzKafka95
        10
    FranzKafka95  
    OP
       2022-03-11 14:02:34 +08:00 via Android
    @cppc 我们是 native C++的应用,你说的这个我知道,最终都是通过 dlopen 动态加载,可现在我就是不想通过 dlopen 加载
    orannge
        11
    orannge  
       2022-03-11 23:03:16 +08:00
    要是 /system/lib64 改了,系统还怎么做 OTA 升级?这样明显不行
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2555 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 05:01 PVG 13:01 LAX 22:01 JFK 01:01
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86