[收录]dynamic app(module) access oem layer的机制介

dynamic app(module) access oem layer的机制介绍         作者:东方欲晓


brew采用分层机制,主要为aee层,oem层以及再底下的驱动,系统服务层,分别针对不同的brew运用者.
aee层主要面向brew developer,在这一层高通利用com style实现了一套interface(class)集,每个interface具有特定的一些接口api函数,brew上层应用开发者就是通过创建这些interface(class)的实例并利用他们的接口api函数来实现一系列的应用.简而言之,aee层就是大家都能下载到的brew sdk.
oem层是面向手机oem厂商的,是用来进行brew porting的.aee层虽然定义并实现了一套标准的interface,但是在aee层的这些interface接口函数的具体实现中最终会调用oem层的函数.因为brew类似于一个中间件,与底层平台无关. 但是这种无关性是通过oem厂商的"相关"的操作来实现的.即brew在aee层定义了标准的接口行为,而在oem层由厂商各自通过不同的方式来实现同样的外在表现. 一旦oem层的这些函数厂商都实现了(平台相关性),那么标准的brew aee层就可以顺利调用这些oemXXX的函数来达到规定的行为了(表现出平台无关性).

所有,不同层面向不同的用户.对于brew上层开发者而言,本质上只需要,也只可以access到aee层,即只能运用aee层中的interface,接口函数以及一些aee层的特殊函数. 而oem厂商则同时可以access这两层,在oem层需要access aee层,这是因为有些oem层的函数中大量用到了aee层的一些control.
由上可见,brew上层应用开发的dynamic app(module)只能,也只需要access aee层.
但是,在brew中存在一个独特的interface,IOEMBRIDGE,其vtbl表很特别,正好是oem厂商实现的所有oem层函数的指针表,它的class中(除了vtbl外)唯一的数据成员是引用计数m_nRef,并且该class在oem层被定义为static,初始值为0,这样将保证每次创建的都是同一个实例(即编译期分配的static对象). 这里为什么只用single instance的方式那,理由很简单,它的class不存在其他的数据成员,而vtbl本来就是对象共用的,m_nRef只是用来判读是否首次创建对象,如果是首次创建,则实例化vtbl表(即将vtbl表和oem厂商实现的所有oem层函数关联起来,注意,并不创建对象,因为对象是static的,编译时已经产生,并且一直存在),否则不多此一举.  

既然存在这样一个interface,那在程序中那里用到了它那,我试着在整个brew源码工程中查找哪里createinstance了这个interface(通过查找特定该interface的clsid的ishell_createinstance是否被调用),结果根本没有找到.

我困惑了,既然它存在,又这么特殊(vtbl正好是所有oem层函数的集合),为什么又没有用到它那.

后来我请求高人,结果让我恍然大悟!
答案是该interface(class)是作为aee层通向oem层的bridge,即,brew 开发者的dynamic app(module)可以通过创建该interface(class)从而直接access oem层并直接调用oem层的函数.

但是,你几乎(或者说根本)没有看到过有dynamic app(module)这样去作过.
除了OAT.

OAT听过把, 曾经是那么神秘, 它凭什么可以来测试我们底层对接口的实现到底正不正确那?
就是凭这个!

大家如果可以看到OAT源码的话,就真相大白了.
每一个测试的OAT module都会通过创建IOEMBRIDGE的实例来access oem层,从而来测试oem层的实现的正确与否.
比如OATTEXT专门用来测试oem厂商对输入法的实现是否正确, 具体而言,OATTEXT MODULE首先创建IOEMBRIDGE INTERface,从而取得了access oem layer的钥匙,接着调用它感兴趣的那些IOEMBRIDG的接口函数,比如那些和Itextctl有关的oem层的函数(因为该模块只负责测试text input), 从而来完成测试(测试分为自动的和交互的,比如当调用创建text的oem层函数后,会友好的提示,你是否看到了一个编辑框出现在屏幕上那? 按pass 确认,按retry重试.....)

当然,除了OAT外,其他的dynamic app好像真的没有什么理由需要用到这个interface,至少现在是.

不过毕竟brew中是存在这样一个沟通aee层与oem层的bridge. 不过它可是控制在oem厂商的手里哦,一旦通过高通oat测试后,完全可以将该interface kill掉. 或者,对外的访问宏定义(即类似IXXX_XXX()的这种能访问vtbl函数的宏定义)只向高通开放,这样developer将不知道如何调用这些函数,即便创建了该interface也是白忙一场压.

读者大概要问了,那你写本文的目的是什么那?

本文的目的只是想说明几个概念: brew分层的概念,class机制的概念,以及层与层之间是有联系的,并且是存在这样一座bridge的
--
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可能是因为您的项目不是一个动态Web项目,或者您的Eclipse版本不支持动态Web模块。请确保您的项目类型正确,并检查您的Eclipse版本是否支持动态Web模块。如果问题仍然存在,请尝试重新安装Eclipse或使用其他IDE。 ### 回答2: 当我们在Eclipse或其他集成开发环境中创建Web项目时,经常会遇到需要设置Dynamic Web Module版本号的情况。Dynamic Web Module是JavaEE规范中定义的一种Web应用程序规范,它定义了一些Web项目的基本结构和特性。 在Eclipse中,我们可以通过右键单击项目,选择“Properties”来打开项目属性窗口。然后在该窗口中,我们可以找到“Project Facets”选项。在这个选项卡中,我们可以勾选或取消勾选Dynamic Web Module。 但是有时候我们可能会遇到无法勾选Dynamic Web Module的情况。这可以是由于几个原因导致的: 1. 该项目可能不是一个Web项目:Dynamic Web Module只能应用于Web项目,因此如果当前项目不是一个Web项目,我们就无法勾选这个选项。 2. 项目可能已经被设置为其他类型的模块:有时候我们可能已经将项目设置为其他类型的项目模块,如EAR或JAR模块,这就导致无法再设置为Dynamic Web Module。 3. 缺少必需的插件或软件:在一些特殊情况下,我们可能需要安装或更新一些插件或软件,以确保我们能够正常使用Dynamic Web Module的功能。 解决这个问题的方法通常是确保我们满足了上述的要求。首先,我们需要确保当前项目是一个Web项目,如果不是,我们需要创建一个新的Web项目。其次,我们需要确保没有将项目设置为其他类型的模块。最后,我们可能需要更新一些插件或软件,以确保我们能够正确使用Dynamic Web Module的功能。 总之,无法勾选Dynamic Web Module可能是由于项目不是Web项目,被设置为其他类型的模块或者缺少必需的插件等原因所致。我们需要确保满足上述条件,以便能够正常地使用Dynamic Web Module的功能。 ### 回答3: dynamic web module 是一个用于开发 Web 应用程序的模块,它是 Java EE 规范的一部分。动态 Web 模块提供了许多功能,例如 Servlet、JSP 和动态资源等,这些可以让我们构建灵活而且具有交互性的 Web 应用程序。 动态 Web 模块无法勾选的原因可能有几种可能性,以下是可能的解决方法: 1. 检查项目是否已经被定义为动态 Web 项目。可以右键单击项目,选择 Properties(属性),然后选择 Project Facets(项目结构)选项卡。在这里,确保 Dynamic Web Module(动态 Web 模块)选项已被勾选,并且设置了正确的版本号。 2. 检查项目是否已经被关联到正确的服务器。在 Project Facets(项目结构)选项卡中,确保已选中正确的运行时(服务器)和目标运行时。如果没有可用的运行时,请点击 New Runtime...(新建运行时)按钮来添加。 3. 如果项目使用了 Maven 或其他构建工具,请检查项目的配置文件中是否正确配置了动态 Web 模块和相关依赖。您可以参考相应的文档或构建工具的指南来进行配置。 4. 确保项目的构建路径正确配置了所有必需的 JAR 文件和资源。在 Eclipse 中,您可以通过右键单击项目,选择 Build Path(构建路径)-> Configure Build Path(配置构建路径)来检查和配置构建路径。 如果尝试了以上方法仍然无法勾选 dynamic web module,可能是由于其他原因导致的问题。此时建议您在开发工具的相关论坛或官方文档中寻求更详细的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值