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

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

==== 正文 ====

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

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

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

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

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

方法一:

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

方法二:

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

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

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

时间: 2024-10-07 20:44:37

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

安卓架构 视频 Android 插件化架构设计

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha Android 插件化架构设计-Dream老师 自定义SDK =====

[老文章搬家] 关于屏蔽优酷视频广告的一个方法

11年的老文章,稳重那个插件让我爽了很久,不过后来就买会员了.代码我已经遗失了,不过无所谓,思路还是明确的,我后来在 Chrome 上测试过,一样能用. ==== 正文 ==== 需求:优酷最近搞了一个广告防屏蔽,导致修改host的方法不能用了.我们需要一个新方法来绕过这个防屏蔽机制. 基本思想:新版的优酷flv player下载不到广告会罢工30秒,既然不能屏蔽广告,那我们就替换广告文件,用一个假广告文件让flv player播放. 实现:首先抓一下包,或者用Fiddle2拦截请求,会发现优酷

[老文章搬家] 关于 Huffman 编码

按:去年接手一个项目,涉及到一个一个叫做Mxpeg的非主流视频编码格式,编解码器是厂商以源代码形式提供的,但是可能代码写的不算健壮,以至于我们tcp直连设备很正常,但是经过一个UDP数据分发服务器之后,在偶尔有丢包的情况下解码器会偶发崩溃,翻了翻他们的代码觉得可能问题出在Huffman这一块.水平有限也没有看太懂他们的源码,而且我也不是科班出身当时对Huffman编码算法只是知道这么个名字,还好服务端软件那边做了修改,解决了丢包的问题.在回家过年的火车上想起这件事,阅读了一些关于Huffman编

[老文章搬家] [翻译] 深入解析win32 crt 调试堆

09 年翻译的东西. 原文见:  http://www.nobugs.org/developer/win32/debug_crt_heap.html 在DeviceStudio的Debug编译模式下, crt中的堆内存分配操作----包括malloc()和free()----使用一个特殊的, 便于调试的版本, 我们称之为crt debug堆(译注: 下面简称CDH). 相比于电光火石(译注: 原文blazingly, 我想不出更确切的说法)的运行效率, 调试版本更关注对于堆错误的定位, 它通过以

android 插件化 模块化开发

http://blog.csdn.net/o1587790525/article/details/11891997 Android 插件化架构设计  http://www.iqiyi.com/w_19rt6edhb9.html Android入门详细讲解微信内部技术之插件化架构设计学习基础 http://www.le.com/ptv/vplay/23128514.html?ch=baidu_s Android 插件化框架 DynamicLoadApk 源码解析  http://www.andro

小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理

前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以决心花些时间研究了一下 DroidPlugin 插件框架的原理,以便再出现问题时也能从容应对.打开源码后发现尽是大把大把的 hook.binder.classloader 等等,很难摸清头绪,幸运的是,有很多热心的大神已经对 DroidPlugin 的原理进行了透彻的剖析,文末会有本人对参考文章的致

Android插件化开发之解决Atlas组件在宿主的注册问题

OpenAtlas有一个问题,就是四大组件必须在Manifest文件中进行注册,那么就必然带来一个问题,插件中的组件都要重复在宿主中注册.像Service,ContentProvider等组件目前没有什么好的解决方法,只能在宿主中注册.但是像Activity,显然是有解决方法的,就是使用Fragment代替Activity,Activity只是作为一个放Fragment的容器,那么不仅在插件中不用再清单文件中注册,就连宿主的注册问题也一并解决了.那么,解决方案呢,没错,就是之前写的一篇博文And

处理程序关键数据变化的一种软件设计

项目中遇到的所有问题可以归纳如下: 1.本地逻辑外地控制 2.外地逻辑本地透明 3.所有命令皆为被动 限于子板处于从属地位,子板与主控间传递的命令事实上只是一种控制信号的传输.所有的功能跟随控制信号而发生变化,或者更确切地说,功能向控制数据的方向调整变化. 数据控制逻辑,而不是逻辑控制逻辑,这是所有项目最显著的特征.这点似乎显而易见,不值一提.仔细想想,这也是常规应用程序的一搬特征,区别于工业控制.自动控制等. 守候数据变化,变化驱动逻辑顺次展开.结合多相机拼接的软件设计,简单概括一般问题的解决

Android 插件化框架 DynamicLoadApk 源码解析

1. 功能介绍 1.1 简介 DynamicLoadApk 是一个开源的 Android 插件化框架. 插件化的优点包括:(1) 模块解耦,(2) 动态升级,(3) 高效并行开发(编译速度更快) (4) 按需加载,内存占用更低等等. DynamicLoadApk 提供了 3 种开发方式,让开发者在无需理解其工作原理的情况下快速的集成插件化功能. 宿主程序与插件完全独立 宿主程序开放部分接口供插件与之通信 宿主程序耦合插件的部分业务逻辑 三种开发模式都可以在 demo 中看到. 1.2 核心概念