11年的文章,当时在做系统集成,实际上当时的思路到现在我还在琢磨,只不过后来就不做系统集成了,也一直没机会深入下去解决这个问题。

==== 正文 ====

一直以来做的项目中有很大一部分工作量都是有关集成设备的工作。为了方便扩展以支持更多厂家的设备,但在这个过程中遇到了非常头疼的问题,在这里我把问题描述一下,欢迎大家来探讨。

问题描述:
所谓设备集成,多数情况下可以简化为SDK的集成(这个比较方便,有时候我们宁愿直接集成协议,但是厂家有厂家的考虑)。针对这种情况,我们的系统采用了比较典型的插件式设计思路,把功能大体一致的设备封装为统一接口的动态共享库,运行时根据数据库配置动态加载调用,同时宿主软件本身也提供了一套接口以便下层动态库来回调获得必要的信息。
我把问题描述到这个程度,估计很多人已经在窃笑了——是的,就是动态库版本问题……

应该说在多数情况下这种插件机制可以很好的应付设备集成需求,并且可以很容易的跨平台实现(这很重要),但是有一种情况,就是在一个进程中使用同一个共享库,却妄图加载两个版本。这时候情况就变得非常混乱。看图:(工具简陋,箭头我没画,大概意思应该都明白)

图中的问题很明了:现在的嵌入式设备厂家众多,但是跟手机行业一样,有很多厂家生产的是“山寨机”,也就是基于嵌入式解决方案做二次开发做出来的产品(比如国内的周立功和华为海思的方案)。针对一些复杂的功能比如解码器,解决方案提供商会以动态库的形式提供上位机开发包,也就是图中的厂家底层库那个模块,然后设备厂家封装SDK要调用这些动态库。如果要在一个软件内集成两个厂家的设备A和B,俩厂家用的是一个品牌的硬件解决方案,但是版本不一样,问题就出现了。这时候底层库的文件名是一样的,但是版本不一样,一个进程做不到同时加载两个版本的底层库。如果解决方案提供商做不到完全的版本兼容,一定会有一种设备用不了。

针对这个问题我曾经尝试用两个方法解决过:

方法一:

很猥琐的方法。当时客户的平台为win32,设备都是遗留设备,厂家的人根本找不到,为了快速解决问题我直接用UltraEdit打开一种设备的SDK文件把里面调用文件名字符串改了一个名字,然后把底层库也改了一个名字,问题就解决了……后来我一直不太放心,怕出问题,还好一直没出问题。后来问同事他们说也这么干过……囧。

方法二:

在设计新版软件的时候,一方面行业的规范性增强了,地区性行业标准相继出现,另一方面新系统主打整体解决方案,不针对老项目改造,这个问题不被重视。但是我预感到基于商业的考量肯定还会出现这种问题。我实验了一种方法,就是把设备这一块封装到另一个进程中,和主程序做数据交互,或者另一个进程也实现一部分界面,直接嵌入到主程序界面中(就像是Smplayer)。我在windows上做了一个原型程序,功能没有问题,但是最终新版软件没有考虑这个方案。原因主要是一方面这个机制和主程序的机制差别很大,封装到一起很不容易,另一方面要考虑跨平台,在linux平台上这样做性能不好,也没有办法优化,甚至某些功能实现不了(经过研究这些确实是有结论的)。

目前这个问题我还没有太好的解决方案,只能就事论事针对项目的特点逐个解决。

应该说造成这个问题的原因和技术是没有关系的,主要还是因为规范不到位,各厂家各行其是,盲目追求”大集成“,对可用性的关注不足。这种问题本事不足为道,但是往往是这种“非智力问题”最困扰人。在这里说这个问题可能不合时宜,就算是带来一点不一样的空气吧。

转载于:https://www.cnblogs.com/legendlee/p/5545611.html

[老文章搬家] 插件化软件设计的头疼问题以及可能的解决思路相关推荐

  1. 结构化软件设计的具体步骤

    结构化软件设计的具体步骤 1.从需求分析阶段的数据流图出发,指定几个方案,从中选择合理的方案. 2.采用某种设计方法,将一个复杂的系统按功能划分成模块的层次结构 3.确定每个模块的功能及模块间的调用关 ...

  2. Shadow插件化框架设计——replugin原理(架构师进阶之旅)

    DroidPlugin原理解析 从系统设计的角度,组件和窗口的逻辑实体都存在于系统服务,比如Activity创建后,其逻辑控制主体在AMS,对于窗口,其逻辑控制主体在WMS android将逻辑主体放 ...

  3. 算法设计与分析:二叉树问题的解决思路

    文章目录 前言 二叉树的基本思想 简单题 合并二叉树 二叉树的坡度 中等题 二叉树剪枝 总结 前言 二叉树是数据结构中使用频率非常高的一种了,凭借高实用性和效率成为数据结构中必须攻克的一环.关于二叉树 ...

  4. 软件工程:结构化软件设计方法 VS 面向对象软件设计方法

    一.基本概念 1.结构化方法 结构化方法是一种传统的软件开发方法,它是由结构化分析.结构化设计和结构化程序设计三部分有机组合而成的. 基本思想:把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向 ...

  5. Ubuntu安装软件或更新过程中出现问题,一些解决思路

    Ubuntu在安装软件或者进行系统更新时,可能会遇到一些问题.尤其是Linux内核版本升级时极有可能造成一些错误,甚至造成系统不能启动.以下是我在使用Ubuntu过程中会遇到的问题,依照网络上提供的方 ...

  6. iOS 上的插件化设计

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? 转自:掘金 ZenonHuang https://juejin.cn/post/697962703724 ...

  7. Android插件化原理解析——ContentProvider的插件化

    目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特点定制了不同的插件化方案:那么对于Co ...

  8. ContentProvider插件化

    ContentProvider插件化 目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特 ...

  9. 插件化原理解析——ContentProvider的插件化

    目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特点定制了不同的插件化方案:那么对于Co ...

  10. 【Android 插件化】恶意软件判定规则 | 恶意软件的范围定义

    文章目录 一.恶意软件判定规则 二.恶意软件的范围定义 一.恶意软件判定规则 在 [Android 插件化]基于插件化的恶意软件的加载策略分析 ( 自定义路径加载插件 | 系统路径加载插件 | 用户同 ...

最新文章

  1. 解决数据库读写分离(转)
  2. Windows7查看本地Java安装是否成功和路径的方法
  3. Python基础学习篇-2-数值运算和字符串
  4. 服务端I/O性能:Node、PHP、Java、Go的对比
  5. “Python编程及大数据应用”课程教师(厦门)寒假研修班
  6. mm1排队系统仿真matlab实验报告,MM1排队系统仿真matlab实验报告.doc
  7. 从数据库读取数据后输出XML
  8. 简述隐含表法化简状态步骤
  9. WAP PUSH 技术
  10. 湖北省武汉市谷歌高清卫星地图下载
  11. npm安装vant(有赞UI)框架 - cmd篇
  12. airtest web 录制滑块_AirTest学习四,录制Web测试脚本
  13. 通俗理解逻辑删除和物理删除的区别
  14. Windows 11 中打印时提示打印机不兼容,都来是“+”惹的祸
  15. 打印1000-2000年的闰年
  16. Gym - 101492 F. Hitting the target(几何)
  17. 阿里云服务器docker安装网心云容器魔方
  18. Data-driven methods for solving algebra word problems论文阅读
  19. 在Linux服务器上解压rar压缩文件
  20. electron 自动更新 热跟新

热门文章

  1. Win10下VB6.0开发之串口通信基础(一)控件属性篇
  2. 简述中断的整个过程,谈谈你对中断在计算机中作用的理解。
  3. 抓取html的地址怎么写,跪求一个获取URL地址html代码的写法
  4. Zephyr在编译时将二进制文件转化成c语言数组
  5. 计算机编码详解_什么是计算机编码?计算机编码的起源与操作系统是如何解码的。
  6. 招聘网站数百万条敏感数据泄露,简历、×××扫描件统统曝光
  7. springboot Hello World探究
  8. [4/10]指定结进程名称的命令taskkill.exe
  9. zabbix源分支---zabbix-rpm
  10. 【转】Build Your own Simplified AngularJS in 200 Lines of JavaScript