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, IOEMDisplayITAPI以及其他的一些接口

使用CFGI_AUTOSTART选择参数调用OEM_GetConfig(),决定是不是在初始化后执行一个applet. 如果返回值是一个appletID,则起动后运行;如果是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_EVTpAEEDeviceNotify

当屏幕切换时,OEM要发送AEE_SEND_SCRROTATE_EVT(pAEEDeviceNotify)

当耳机插入或移走时,OEM要发送AEE_SEND_HEADSET_EVT(pAEEDeviceNotify)

发送画笔事件

发送游戏操纵杆事件

3 实现显示支持

具体步骤

1)        选择一个适合屏幕颜色位的OEMBitmap实现

2)        使用OEMDisplayDev.c作为模板,实现IdisplayDev接口

3)        实现EECLSID_DEVBITMAPnEECLSID_DEVBITMAPn_CHILD类用来显示第一步中选的图

4)        使用OEMAppFrame.c为例子,实现IappFrame接口.链接到OEM mod.作用AEECLSID_APPFRAMEn, 其实n表为1-4,表示显示器号

5)        实现AEE_DEVICEITEM_SYS_COLORS_DISPnAEE_DEVICEITEM_DISPINFOn设备,OEM_GetDeviceInfoEx()(OEMCconfig.c文件中)

6)        对于主显示,修改OEM_GetDeviceInfo(),实现AEEDeviceInfo结构类,实现屏幕高度、宽度和颜色深度等信息。

7)        实现OEM_Disp_Annunciators

3.1 核心显示信息

通过三个接口IbitmapIbitmapDevIbitmapCtl Ibitmap由所有的bitmaps暴露。而IbitmapDevIbitmapCtl由设备bitmaps暴露。

每一个显示需要一个bitmap缓冲。可能通过AEECLSID_DEVBITMAPn来获得全局的设备bitmap

AEECLSID_DEVBITMAPn_CHILD来创建设备bitmap的子设备bitmap

OEMBitmap实现中,保存了一个无效矩形区,存储改变的屏幕

对不同的显示,显示的访问权限授予方式是不同的。对于主显示,是由当前活动的BREW应用控制。OEM层要得到访问权限,则要调用AEE_Suspend()先挂起当前应用,使用完后,再用AEE_Resume继续应用,将权限返回。但现在不建议这么做,现在建议使用一个临时的BREW应用接管shim applicationOEMshim 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.1BREW 3.0的变化。

6 实现BREW特征

与实际operator相关,各用不同。

7 实现BREW应用程序管理和OTA下载

实现BREWAppManger

link是要包含BrewAppMgr库文件

拷贝相应的颜色度的brewappmgr.mif文件到../brew/mifs目录

7.1 BREW文件类型和动态应用安装

文件类型:

MIF:包含了模块信息。每一个模块可以包含以下信息:

l         应用类id,应用名,图片和设置

l         通用模块信息,公司,版权等

l         权限信息

l         暴露的idmime

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 性能测试