Android Project A 架构
背景描述:多媒体芯片厂商(以下简称A公司),致力于家庭娱乐平台开发,OS从eCos到纯linux,再到Android,多年来积累了很多的多媒体芯片解决方案。在Android系统盛行时,也想借助Android的开源特性研发出自己的智能家庭娱乐平台– DVB 。
本文主要总结DVB项目的大体软件框架。由于在纯linux时期就已经有完整而稳定DVB解决方案,所以想尽可能移植成型代码,加快开发进度,减少开发工作量。
解决方案
简单说明上面的框架图对照Google发布的Android架构可以看得出来其相似之处,A公司的Android DVB 解决方案是移植原有在Linux上开发的纯C语言应用程序,并通过socket的方式向app提供服务,其中DVB、Multimedia、DLNA、Android Home都是A公司深度定制的app。
市面上其实也有类似的解决方案,不同的是他们采用了JNI的方式与C/C++代码进行通信,最初使用socket而不是JNI的方案最主要的原因是socket总体通信效率较高。
App框架
大体上将DVB客户端 App分为三层:UI、Abstract Layer、SunService,服务端分为两层:SP_Manager、Middleware。
1)UI:
采用Android提供的控件实现预定的效果。
3)Abstract Layer:
服务端的功能抽象,使用Java的Interface实现,服务端的每项功能都被封装成一个模块。
4)DVB Service和SP Manager:
类似Java设计模式中的“中介者模式”,服务端和客户端的子模块不需要直接联系,而是通过DVB Service和SP Manager进行统一管理。
DVB Service采用Remote Service(AIDL)实现进程间的通信,它是一个独立的进程,承担了不同app访问C代码服务端功能的责任。
SP Manager 是所有消息的入口,负责app层/Middleware层之间的消息转发控制、子模块之间的通信等等,其中每个子模块是一个独立的线程,负责处理来自Ap层的请求。
5)Middleware:
从早期DVB项目中移植来的C代码,实现最核心的DVB功能。包括了扫台、播放、EPG、Database、刻录、预约···
启动流程
Power ON —> 启动linux—>启动Android和启动DVB Native—> Boot Completed—>启动DVB应用程序。
由于DVB Native需要向app提供服务,所以必须在开机时就启动DVB Native,要达到开机就启动DVB Native的话就需要修改启动脚本,添加类似的脚本命令:
service dvb /system/bin/logwrapper/system/bin/dvb
class main
socket sp_manager_recv stream 660 system system
user root
group root
用例图
*用例图的目的是在不揭示系统内部构造的前提下,将整个系统划分成多个功能单元并描述各个功能单元之间的交互行为。
MainMenuActivity:DtvPlayer启动首先进入MainActivity,初始化app的行为会在这里完成。
DVBSystemResource:负责掌管系统资源,并为每个资源提供一个外部访问点。
Monitor:系统启动时开启的线程,负责统一实时监听/分发底层信息。
AbstractLayer:抽象出ap所需的功能,接收ap的请求并按照需求转发底层(包括C code),接收底层信息和反馈ap请求的结果。
Activities:负责直接与用户交互的部分,包括检查用户输入,保存/读取用户信息、处理用户请求等行为,是整个ap层主要的功能单元。
Debugger:统一管理不同行为、类型消息的输入格式、开关等。
DVB.Utils:为整个app提供静态的工具。