1 初始化BREW
1.1 确定BREW运行环境
1.2 定义独一无二的AEE_APP_SIG信号标识
1.3 创建BREW任务循环
在收到AEE_APP_SIG时,执行AEE_Dispathc()分派消息
1.4 BREW初始化代码AEE_Init(AEE_APP_SIG)
初始化Ishell, IOEMDisplay和ITAPI以及其他的一些接口
使用CFGI_AUTOSTART选择参数调用OEM_GetConfig(),决定是不是在初始化后执行一个applet. 如果返回值是一个applet的ID,则起动后运行;如果是0,则起动后不运行某applet。
如果前面通过Ishell_SetAlarm()定义了定时器,则BREW起动用户级别的定时器
1.5 增加BREW退出代码,AEE_Exit()
2 设置事件处理
2.1 把消息转换成AEE虚拟键值,通过以下函数发送消息
AEE_Key(wVCode)
AEE_KeyPress (wVCode)
AEE_KeyRelease(wVCode)
发送时,按下和松开都要发送
2.2 发送以下事件到BREW环境中
AEE_SEND_FLIP_EVT (p)
AEE_SEND_KEYGUARD_EVT (p)
AEE_SEND_LOCKED_EVT (p)
AEE_SEND_HEADSET_EVT (p)
AEE_SEND_SCRROTATE_EVT (p)
2.3 处理flip和显示切换和耳机
当flip打开或关闭时
l 不挂起或继续BREW,即不执行AEE_Suspend()或AEE_Resume()
l 不中断BREW应用,即不执行ISHELL_CloseApplet()
l 通过AEE_SEND_FLIP_EVT(pAEEDeviceNotify)发送一个EVT_FLIP事件到BREW
l 当flip关闭时,在OEMNTF_APP_START通知中,OEM_Notify()不返回false。表示在flip关闭时,BREW应用仍可以启动
l 在flip关闭时仍然处理BREW消息,仍通过AEE_Dispatch()发送BREW消息
l 在flip关闭时,支持所有BREW接口。如发送或接收消息、播放铃、在第二个LCD上显示等
l 当flip打开时更新屏幕。OEM可以在flip关闭时停止更新内屏
当keyguard活动时,OEM发送EVT_KEYGUARD_EVT(pAEEDeviceNotify)
当屏幕切换时,OEM要发送AEE_SEND_SCRROTATE_EVT(pAEEDeviceNotify)
当耳机插入或移走时,OEM要发送AEE_SEND_HEADSET_EVT(pAEEDeviceNotify)
发送画笔事件
发送游戏操纵杆事件
3 实现显示支持
具体步骤
1) 选择一个适合屏幕颜色位的OEMBitmap实现
2) 使用OEMDisplayDev.c作为模板,实现IdisplayDev接口
3) 实现EECLSID_DEVBITMAPn和EECLSID_DEVBITMAPn_CHILD类用来显示第一步中选的图
4) 使用OEMAppFrame.c为例子,实现IappFrame接口.链接到OEM mod表.作用AEECLSID_APPFRAMEn, 其实n表为1-4,表示显示器号
5) 实现AEE_DEVICEITEM_SYS_COLORS_DISPn和AEE_DEVICEITEM_DISPINFOn设备,在OEM_GetDeviceInfoEx()(在OEMCconfig.c文件中)
6) 对于主显示,修改OEM_GetDeviceInfo(),实现AEEDeviceInfo结构类,实现屏幕高度、宽度和颜色深度等信息。
7) 实现OEM_Disp_Annunciators。
3.1 核心显示信息
通过三个接口Ibitmap、IbitmapDev、IbitmapCtl。 Ibitmap由所有的bitmaps暴露。而IbitmapDev和IbitmapCtl由设备bitmaps暴露。
每一个显示需要一个bitmap缓冲。可能通过AEECLSID_DEVBITMAPn来获得全局的设备bitmap。
用AEECLSID_DEVBITMAPn_CHILD来创建设备bitmap的子设备bitmap
在OEMBitmap实现中,保存了一个无效矩形区,存储改变的屏幕
对不同的显示,显示的访问权限授予方式是不同的。对于主显示,是由当前活动的BREW应用控制。OEM层要得到访问权限,则要调用AEE_Suspend()先挂起当前应用,使用完后,再用AEE_Resume继续应用,将权限返回。但现在不建议这么做,现在建议使用一个临时的BREW应用接管shim application,OEM在shim application执行画屏动作。
对于第二显示,访问权先给当前的应用,如果当前应用不使用第二显示,则到应用程序栈中找,找到第一个要使用的,将访问权给它。如果在应用栈中还没有,则到后台再找。
OEM层要使用第二显示,则要调用AEE_EnableDisplay()得到和放弃第二屏的控制权。
3.2 字体
3.3 PNG文件支持
3.4 Annunciators
3.5 使用Brew模拟器
3.6 验证实现
4 配置设备
4.1 通过实现BREW (OEM_GetDeviceInfo(), OEM_GetDeviceInfoEx())函数提供设备信息
4.2 通过OEM_GetConfig()函数提供配置信息
4.3 为BREW环境和实际设备之间提供路径映射
AEEFS_ROOT_DIR
AEEFS_HOME_DIR
AEEFS_SYS_DIR
AEEFS_MOD_DIR
AEEFS_MIF_DIR
AEEFS_SHARED_DIR
AEEFS_ADDRESS_DIR
AEEFS_RINGERS_DIR
AEEFS_CARD0_DIR
5 执行第一个设备build
5.1 在apps/BREW/inc/BREWVersion.h中查看文件版本
5.2 如果是3.0的,则不用修改
5.3 如果原来的程序是2.0版本的,则要修改(见文档Migrating From BREW 2.1 to 3.0.
基本步骤如下:
确定所有BREW库都在
编译所有需要的OEM文件
所有的静态应用都有mif文件,在OEMConstFiles.c中
协条文件从BREW 2.1到BREW 3.0的变化。
6 实现BREW特征
与实际operator相关,各用不同。
7 实现BREW应用程序管理和OTA下载
实现BREWAppManger
link是要包含BrewAppMgr库文件
拷贝相应的颜色度的brewappmgr.mif文件到../brew/mifs目录
7.1 BREW文件类型和动态应用安装
文件类型:
MIF:包含了模块信息。每一个模块可以包含以下信息:
l 应用类id,应用名,图片和设置
l 通用模块信息,公司,版权等
l 权限信息
l 暴露的id和mime类
l 模块依赖信息
mod文件:动态加载的应用程序
bar文件:资源文件
sig文件:签名信息
7.2 安装BREW文件
通过QCT EFS Exporer
7.3 创建表态DLL扩展
步骤:
创建win32 DLL
暴露函数 const AEEStaticClass * GetStaticClassEntries(void)
在头文件中定义AEE_STATIC
创建好的DLL放到module目录下
要包含AEE头文件,并且链接时加入BREW_Simulator.lib
7.4 异步BREW接口
这一节描述了如何编写以异步方式与OEM层进行交互的BREW扩展。
7.4.1 系统级的服务扩展
BREW层支持应用级的数据管理与回调。系统级的服务扩展有如下特征:
存储当前应用的上下文环境
向底层调用系统级的API,传入适当的数据
从系统处理进程/线程之间的回调,并调度返回给主BREW线程的返回
分配适当的针对特定接口的回调到调用它的BREW应用。
7.4.2 应用程序上下文
通过AEE_GetAppContext(void)得到应用程序上下文
7.4.3 回调
7.4.4 应用接口
7.4.5 系统服务
7.4.6 示例实现
7.5 应用程序下载
7.6 实现BREW应用程序管理器
7.7 实现BREW工具接口
8 集合native UI于设备
9 实现资源管理
10 创建MCF目录
11 性能测试