用于向软件应用程序动态地添加特征的系统和方法 【技术领域】
本发明涉及向设备添加软件应用程序特征。
背景技术
允许终端制造商创造应用程序驱动的电话机的终端软件产品是可获得的。可从芬兰诺基亚公司获得的60系列平台是一种能够被终端制造商许可的终端软件产品的例子。
期望使用终端软件产品制造电话机(或其它相似设备)的制造商将各种相关的应用程序包括到终端软件产品。制造商也能够包括已经由制造商定制的用户界面(UI)元件,以及添加新的应用程序或删除旧的应用程序。另外,购买这种电话机的用户可以在该电话机上安装第三方软件。
典型地,应用程序为在预定义外壳应用程序中对于终端用户而言可见的一个特征提供功能。应用程序菜单以及其它用户界面元件、例如软键按扭或者选择列表提供了每一特征可用的多组选择或数据。然而,制造商、终端用户以及第三方开发商并不能按照对于无缝终端用户经历来说看起来象是集成的方式用他们自己的特征容易地扩展终端软件产品应用程序。特征特定的菜单项(或者其它用户界面元件)不能看起来和工作起来好像它们就是终端软件产品应用程序的一部分。按照惯例,在电话机中增加新的特征意味着增加新的应用程序,这通常将导致许多执行同类事务并且不一定彼此一致的应用程序。
试图解决这些问题的现有尝试都已经失败了。例如,现有尝试包括为每个特征实现应用编程接口(API)。在这样的系统中,为每个特征指定一个API。向需要这些特征地客户端应用程序提供对对应于该特征的API的依赖性。向客户端添加特征特定的UI元件。另外,能够添加特征特定的UI元件。解决上述问题的另一尝试包括预先添加特征特定的UI元件以及使用该等元件的运行时间变体。这样的系统预先包含所有特征,并且取决于产品配置对特征进行激活/去激活。
然而,这些技术通常导致了软件结构中的静态依赖性,会产生电话机开发程序中的集成问题。
在任何软件开发(包括用于诸如上述那些终端软件产品之类的终端软件产品的编程)中,开发者创建软件结构,将需求映射到子系统和部件,并且定义对于所创建的结构的功能性及非功能性软件需求。这些结构的关键部件是应用编程接口(API),它表示被称为调用程度的另一部件经由其利用或者调用另一被称为被调用程序的部件的接口。
为了向现有软件中添加一个功能,将一个新的部件通过被调用程序为其它方使用而提供的API集成到现有应用程序中。通常,API包括多组声明和定义,例如,常量声明、类型定义、类定义以及函数(过程)定义。每个函数定义有一个唯一的签名,它包括返回类型、函数名称以及函数变元列表。每个变元定义一段传递给函数或程序的数据。变元能够保持的数据类型可以是简单的,例如字符串、字节、整数、实数、双精度,或者可以是对结构或类定义的结构引用。
在软件开发中需要有标准的多用途API,它们在软件演变中是保持不改变的和足够通用的。开发者想把采用简单数据类型的通用的多用途函数、例如Int genericDoSomething(const char[]objectInformation)实现到这样的API中。然而,实现能够接受多种参数的通用函数是困难的。该函数可以被分成具有独立变体的几段。例如,函数可以被定义如下:
1)Int genericDoSomething(const char[]objectName);
2)Int genericDo Something(const char[]objectId);
2B)Int genericDoSomethingByName(const char[]objectName);
2C)Int genericDoSomethingById(const char[]objectId);
3)Int genericDoSomething(const char[]objectName,const char[]objectUrl);
4)Int genericDoSomething(const char[]objectName,const char[]objectID,char*objectUrl);
5)Int genericDoSomething(const char[]objectName,char[]outObjectInfo);
在所有这些版本中,被调用程序假定每个变元位置的含义或者语义。然而,该被调用程序必须信任调用程度,并且假定第一次输入的参数是正确的,被调用程序没有好的办法对之进行验证。上述选择1)和2)是不可能的,因为函数签名不是唯一的,并且编译器不能分辩函数调用。需要上述函数2B)和2C)来分辩函数调用。
当被调用程序把一个输入参数传递到其它函数时,它向前传送这种信任。在许多层函数调用之后,语义可能丢失,并且有变元被误解的风险。
如果向函数增加一个新的变元,则每次必须改变函数的签名。粗心的改变可能导致二进制或源兼容性破坏。例如,在上述3)和4)的情况中,增加了额外的objectID和objectUrl变元。在5)的情况中,如果被调用程序在输出变元outObjectInfo中返回数据,则调用程度将会面临和输入参数类似的问题。如果将输入变元持续地保存到一个文件中,则丢失变元的含义。如果将输入变元传递过进程边界,则丢失了变元的含义。
如上所述,使用特定的函数变体代替通用形式是可能的。能够向变元、例如“Int genericDoSomething(int objectInfoMeaning,const char[]objectInformation)”中添加语义信息。这适用于在同一次调用中传递的每个额外的变元(例如,“Int genericDoSomething(intobjectInfoMeaning1,const char[]objectInformation1,intobjectInfoMeaning2,const char[]objectInformation2);”。能够对上述结构进行简化(例如,“Int genericDoSomething(struct ObjectInfo1 info,struct ObjectInfo2 info)”)。这里,“struct ObjectInfo1”结构把信息保持作为成员数据。在这样的结构中,编译器检查变元的语义。
作为选择,能够使用类(例如,“Int genericDoSomething(ObjectInfo1 info,ObjectInfo2 info);”),其中Object1和Object2是自动保持语义信息的C++类。同样地,编译器检查变元的语义。然而,需要以类似的方式添加新的变元。另外,能够将genericDoSomething方法作为一个成员函数添加到Object1类中,以便获得object1.genericDo Something(Object2 &info)。
另一种已知技术(例如在Microsoft OLE2中)是使用能够保持几种数据表示的变体数据类型(参见下一部分)。但是这些已知技术仍然缺少语义信息。
为了通过相同的使用者(consumer)API把参数从一个使用者传递到一个或多个匹配的提供者,可以创建一个带有语义和数据信息的通用参数。例如,每个使用者然后可以检查语义含义以及数据类型,并且如果需要就可以进行必需的转换。参数应当是通用的,这是因为难以知道通过API传递何类数据。
因此,需要提供一种用于以受控的和动态的方式将特征添加到现有的一组应用程序中的机制。此外,甚至需要向现有的应用程序中添加特征以扩展终端软件产品应用程序的功能,另外,还需要有通用的函数变元。
【发明内容】
本发明针对向软件应用程序动态添加特征的方法、设备、系统以及计算机程序。这些功能是使用一种用于向任意应用程序添加任意特征的一般不可改变的应用编程接口(API)的框架来添加的。
简而言之,一个示范性实施例涉及这样一种方法,它通过建立一个用于向任意应用程序添加任意特征的一般不可改变的应用编程接口(API)的框架,向软件应用程序动态地添加计算机软件特征。该方法包括:为一个指定预期用户界面元件的使用者应用程序提供使用者应用程序兴趣(interest)资源;将与使用者应用程序兴趣资源相对应的预期用户界面元件存储到一个文件中;将预期用户界面元件传递给一个应用程序互配(interworking)框架;将预期用户界面元件添加到与软件应用程序相关联的用户界面中。
另一个示范性实施例涉及这样一种设备,它向软件应用程序动态地添加特征,以便能够将由一个软件程序提供的任何特征添加到用于该设备的软件平台程序中。该设备包括一个新的使用者应用程序,它公布指示该新的使用者应用程序期望具有何特征的特征兴趣。该新的使用者应用程序基于特征兴趣为所需的用户界面特征提供具有兴趣占位符的用户界面资源。该设备还包括:多个具有特征和可用于特征的用户界面资源的提供者应用程序;以及一个应用程序互配框架,它为该新使用者应用程序和多个提供者应用程序提供一个接口,以便使特征兴趣与可从多个提供者应用程序中获得的特征之一相匹配。将与匹配的特征相对应的用户界面元件从多个提供者应用程序之一中添加到新使用者应用程序中。
另一个示范性实施例涉及一种用于向软件应用程序动态地添加特征的系统。该系统包括:一个使用者应用程序,它公布特征兴趣,并且基于特征兴趣标识需要的用户界面资源;一个提供者应用程序,它公布提供者性能,并且标识对于一个特征可用的用户界面资源;以及一个应用程序互配框架,它为使用者应用程序以及提供者应用程序提供一个接口,以便使特征兴趣和提供者性能相匹配,并且将用户界面元件从提供者应用程序中添加到使用者应用程序中。
另一示范性实施例涉及一种计算机程序产品,它具有用以实现以下功能的计算机代码:为指定预期用户界面元件的使用者应用程序提供使用者应用程序兴趣资源;将与使用者应用程序兴趣资源相对应的预期用户界面元件存储到一个文件中;将预期用户界面元件传递到一个应用程序互配框架;向用户界面添加预期用户界面元件。
对于本领域技术人员来说,通过阅读下面的附图、说细说明以及附加权利要求书,本发明的其它主要特性和优点将变得明显。
【附图说明】
下面将参照附图对示范性实施例加以说明。
图1是依据一个示范性实施例用于向软件应用程序动态地添加特征的软件结构的图形表示。
图2是依据一个示范性实施例的用户界面示例的图形表示。
图3是描述了依据一个示范性实施例用于向软件应用程序动态地添加特征的过程中的操作的流程图。
图4是依据一个示范性实施例的通用参数实现的图形表示。
图5是依据一个示范性实施例的设备的方框图。
【具体实施方式】
图1表示向软件应用程序动态地添加特征的软件结构。使用者应用程序12通过公布使用者兴趣16指示可从特征提供者14获得的、使用者应用程序12感兴趣的特征。使用者应用程序在使用者UI资源文件18中指定用户界面(UI)元件模板,并且特征提供者14在运行时把预期的UI元件添加到UI中。
在存在能够满足使用者应用程序12的公布兴趣的特征提供者14的情况下,特征提供者14在运行时将UI元件添加到UI中。此外,特征提供者14处理相关的业务逻辑。
以相同的特定格式表示使用者兴趣16和特征提供者14公布的提供者性能20。在一个示范性实施例中,这种格式包括:多用途互联网邮件扩展(MIME)或互联网数据、命令以及提供者接口。使用者兴趣16和提供者性能20能够包括为特征提供者14考虑了更灵活的解决方案的通配符模式。
在使用者应用程序12和特征提供者14之间的数据协议允许将参数从使用者传递到提供者和从提供者提供给使用者。数据协议可以是静态的,也可以在运行时进行协商。一个使用者应用程序12可以使用许多特征提供者,并且一个特征提供者14可以满足许多使用者的兴趣。特征提供者14也可以是其他提供者的使用者。使用者应用程序12和特征提供者14彼此之间是尽可能独立的。特征提供者14可以仅从只读存储器(ROM)中或者从用户数据区域(可安装的提供者)加载。
举例来说,下面表1所示的情况是使用参照图1描述的软件结构的例子。每个例子都有一个应用程序、一个使用者、一个兴趣以及一个提供者。
表1应用程序使用者兴趣提供者编辑图像图像浏览器,媒体画廊“编辑命令”+MIME类型(图像/jpeg)图像娱乐“选择要发起的应用程序或功能”软键选择器,语音命令,插接板,活动桌面“选择命令”+MIME类型(应用程序对象)应用程序/应用程序管理器“为文本中找到的项目提供命令选项”浏览器,消息传送,应用程序,日历,记事簿,......“编辑/查看命令”+项目(电话号码,电子邮件地址,URL,......)浏览器,电话,电话簿,SMS编辑器,MMS编辑器,电子邮件编辑器,......获取新的图像、音频、文件MMS编辑器,媒体画廊“新命令”+MIME类型(图像/*,声音,视频,文件)摄像机,CamCorderMedia画廊
因此,如表1所示,应用程序“编辑图像”具有使用者应用程序“图像浏览器”和“媒体画廊”。此外,相应的使用者兴趣是“编辑命令”和MIME类型,并且相应的提供者是“图像娱乐(Image Fun)”。图2表示在编辑图像应用程序的情况中的用户界面。在用户界面34中,将新的图像娱乐特征36添加到用户界面32中的现有应用程序菜单中。以无缝的方式实现新特征36的添加。因此,对于用户而言,看上去该新特征正如图像浏览器应用程序的另一个特征一样。
再次参见图1,使用者应用程序12在使用者UI资源文件18中有一个标准UI元件。使用者UI资源文件18可以包括使用者兴趣。另外,独立的资源文件被用来创建共同兴趣的集合或共同兴趣“库”。能够将期望的兴趣(例如,菜单命令、设置页面)插入到使用者UI资源文件18中的期望的UI元件中。
应用程序互配框架(AIWFW)22确保特征提供者14能够只在UI设计者定义UI元件的位置添加UI元件24。AIWFW 22在使用者应用程序12和特征提供者14之间建立连接。AIWFW 22通过使公布的使用者兴趣16和公布的提供者性能20相匹配来实现这一连接。这些连接可以是从使用者应用程序12对动态加载的提供者动态链接库(DLL)的纯动态链接库函数调用,或者它们能够具有从使用者进程到提供者进程的进程间通信(IPC)连接。在一个示范性实施例中,动态加载的DLL被用来避免进程间的过多的内容切换。
AIWFW 22实现两个API:一个便于使用者使用提供者的使用者API 26和一组实现提供者的提供者API 28。特征提供者14可以仅实现与其UI性能相匹配的API,例如基本接口、菜单服务接口、设置接口等。这组接口设置可以根据需要进行扩展。
在运行时,向AIWFW 22提供兴趣。基于数据协议,如果可行,则使用者应用程序12向特征提供者14提供可选的输入参数,并且希望返回输出参数。在大部分情况下输入参数和输出参数的默认格式便已足够。
每个特征提供者14实现提供者API 28的所支持的接口。AIWFW22为每个接口提供默认的实现方式。特征提供者14的第一个任务是把所需特征的UI元件、利如菜单项从一个提供者资源文件(PUI)30传递给使用者应用程序12中。第二个任务是处理与添加的元件相关的命令,这些指令以集成的方式出现在使用者资源文件18和本地使用者项目中。第三个任务是满足数据协议、利如默认协议。
特征提供者14使用任何现有的操作系统API、UI工具等以有助于实现。AIWFW 22有助于容易地实现特征提供者,以便以特征提供者的形式完成现有的经过测试的软件。从安全性角度来说,可以支持“仅仅从只读存储器中加载(Load-only-from-ROM)”以将主要提供者限制为不可从用户数据区域中修补。
图3表示在向软件应用程序进程动态添加特征的示范性操作。取决于该实施例,可以执行额外的、较少的或者不同的操作。在操作40中,为一个使用者添加一个兴趣资源。兴趣资源描述了使用者应用程序期望何特征。
在操作42中,将兴趣中的用户界面(UI)元件提供给一个资源文件。菜单命令和设置页面是由资源文件的内容所规定的UI元件的例子。在操作44中,使用者应用编程接口(API)向AIWFW提供使用者兴趣。AIWFW是使用者和特征提供者之间的接口。在操作46中,特征提供者在运行时将需要的兴趣UI元件从AIWFW中添加到使用者应用程序UI中。
参照图1至图3描述的示范实施例在已经将电话机投放到市场中之后以集成的方式扩展应用程序。能够维持本地平台应用程序的UI一致性,同时规定可以进行UI元件添加的位置。整个平台变得更加有趣并且是可定制的。
因此,能够支持平台配置,同时基于特征提供者创建不同的销售组合。同时,本地应用程序可以接受以后由运营商或第三方开发商实现的提供者。
从软件结构的角度来讲,可以看到许多优点。例如,特征的维护和扩展更加容易。可以定制一个特征提供者,而且它以类似的方式影响所有感兴趣的使用者。因此,降低了开发成本。而且,结构上的静态依赖性能够被替换为动态依赖性。这使软件配置更加容易,例如,实现共同的内核映象和变化的映象概念。另外,由于基于特征的集成增加模型,示范性实施例允许用于电话机开发的更容易的设备集成。这应当节约集成负担和成本。此外,甚至能够在不改变使用者应用程序(编辑其代码)的情况下将新的特征添加到使用者应用程序中。这极大地减少了所需的测试工作。AIWFW实现了具有很多好的属性的面向对象的软件设计的打开/关闭原理。
利用示范性实施例,特征改变更加容易。制造商可以把需要的提供者选择到ROM中,并且使用者UI中的可见性/非可见性是一致的。此外,运营商和第三方开发者能够在以后增加他们自已的提供者,但是电话机制造商可以控制进行添加的位置。
图4表示依据一个示范性实施例的通用参数实现。在这个实现中,一个称为SemanticID的变量用来描述由用例需要的数据,例如FILENAME、URL、MESSAGEID、CONTACTID、IMAGEFILE、IMAGEDATA和IMAGEHANDLE。ID具有唯一的值。可以将密切相关的SemanticID集合在一起以形成备选表示组。例如,可以将上述的IMAGEFILE、IMAGEBUFFER、IMAGEDBHANDLE集合在一起以形成IMAGE。
一个称为VariantTypeId的变量用来表示基本数据类型,例如整数、日期/时间、唯一ID、字符串、实数,双精度和数据缓冲。TVariant可以保持所有由VariantTypeId指定的数据类型。一个通用参数GenericParam拥有下列数据属性:SemanticID、TVariant、SemanticIDGroup、ParameterStatus(它保持用于数据检查的状态代码)、以及其它用于该通用参数的工具(utility)成员、例如初始者应用程序UID、版本信息以及错误代码。可以包括用于GenericParam的外部和内部支持,以向流中进行写入,以及从流中构造其自身。流可以表示任何操作系统流(存储器、文件、套接字(socket)、串行端口、IPC通道等),它能够是在移动设备内部或移动设备之间所用的通信兴趣。
定义了被称为GenericParamList的通用参数列表,它具有一个或更多GeneicParams。能够包括用于GenericParamList的外部和内部支持以向流中进行写入,以及从流中构造其自身。能够在每一个需要一致方式的函数中使用GenericParamList以传递变元:
Int genericDoSomething(GenericParamList inParams);
Int genericDoSomething(GenericParamList inParams,GenericParamList outParams)
举例来说,能够使用通用参数实现以在使用应用程序嵌入(进程内通信)的终端软件产品应用程序之间传递输入和输出变元。因此,不管调用堆栈有多深都可以理解参数的含义(语义)。该实现还能够在独立的终端软件产品应用程序之间传递输入和输出变元(进程到进程的通信)。因此,保留了变元的语义和来源。
此外,该通用参数实现能够在以上参照图1至图3所述的应用程序互配框架22内部传递变元。AIWFW 22可以利用通用参数来实现数据灵活的协议。例如,一条服务提供者命令可以执行如下:
void ExecuteServiceCmdL(
const TInt aCmdId,
const GenericParamList aInParamList,
GenericParamList aOutParamList);
作为另一个例子,能够将该通用参数实现用于语义相同数据的备选表示。例如,图像容器可以是文件、图像数据库的标识符、或者作为存储器缓存的图像数据。
下面参照图4,CGenericParamList类52包含多个(0..N)CGenericParam项54。每个CGenericParam项54包含TGenericParamID和TVariant,它们是CGenericParam类的一部分。CGenericParam类具有一个TVariantTypeID数据类型类和包含在一个TVariant类56中的多个数据值。CGenericParamList类52和CGenericParam类向包含在操作系统中的一个流58进行写入。应用程序60使用数据工具(Utility)API 62创建CGenericParamList类52,在创建过程中数据工具API 62和数据工具64进行对接。
在创建CGenericParamList类52的示范性实施例中,定义了各种类,并且分配了标识符。例如,定义称为TGenericParamId的类以表示SemanticID。为这个类中使用的标识符分配适当的范围,并且使其是唯一的。定义称为TVariantTypeId的类以表示TVariantTypeId。为这个类中使用的标识符分配适当的值,并且使其是唯一的。也为操作系统类型定义变量,例如TInt32、TUid、TTime、TDesC和HBufC。定义称为TVariant的类,它具有TVariantTypeId和以上述格式的实际数据。此外,将额外的工具属性定义为成员方法或CGenericParamList成员。
定义称为CGenericParam的类,它具有TGenericParamId数据成员(iSemanticId)、TVariant数据成员(iValue)和用于扩展的保留成员。为CGenericParam类提供外部方法和内部方法,以将其自身写入一个流中并且从流中构造其自身。为GenericParamList定义CGenericParamList类。也向列表类提供外部和内部支持。提供基本的迭代程序用于列出和访问CGenericParamList类。为这些类提供一个模块测试程序。
在备选实施例中,为CgenericParamList类提供了高级迭代方法以通过TGenericParamId和TVariantTypeId搜索列表。列表然后可以包含同一参数的备选表示。此外,能够将语义标识符组实现作为TGenericParamIds的范围。可以使用转换工具对语义标识符进行转换。
通用参数实现的示范性实施例使得能够创建通用服务API,它们允许处理几种变元而不需要改变函数签名。该实施例还允许在进程边界内部和外部在调用堆栈内进行与变元检查有关的语义检查。API的框架类型可以基于语义ID进行一致性、安全性等检查,或者甚至用另一个更适合的语义ID代替一个语义ID。
检查可以由SemanticID组成,并且如果需要,则可以将一个语义标识符转换成为另一个语义标识符。如果RAM消耗不成问题的话,则调用程序可以接受/创建用于相同数据的几个备选语义ID(例如IMAGEFILE、IMAGEDATA、IMAGEHANDLE)。变元可以基于额外的工具数据保持上下文信息。
如果使用输入/输出变元,则能够将CGenericParamList用作元数据以描述由被调用程序要求的数据协议。调用程序填入数据的TVariant部分作为实际的输入参数。可以将CGenericParamList保存到任何一种流中,并且它仍然保持语义有效。通用参数实现通过增加新的语义标识符、以及利用早先的实现保持二进制和数据性能,扩展了现有的API。
图5表示一个设备70,它具有中央处理单元(CPU)72、输入74、输出76、存储器78以及用户界面(UI)79。能够依据参照图1至图4所描述的示范性实施例利用新的特征对UI 79进行配置。CPU 72处理包含在应用程序互配框架中的指令,以便将使用者应用程序和提供者应用程序进行对接。设备70可以是电话机、是个人数字助理(PDA)、计算机或者其它任何设备。
该详细说明概括了用于向软件应用程序动态地添加特征的方法、设备、系统以及计算机程序产品。在上述说明中,为了解释的目的,阐述了大量的具体细节以便提供对本发明的深入理解。然而,对于本领域技术人员来说,很明显没有这些具体细节也可以实行这些示范性实施例。在其它情况下,为了便于对示范性实施例进行说明,以方框图的形式显示结构和设备。
虽然图中所示和以上所述的示范性实施例是当前优选的,但是应当认识到仅仅通过举例提供了这些实施例。例如,其它实施例可能包括用于执行相同操作的不同技术。本发明不局限于特定的实施例,而是可以扩展到落在所附权利要求书的范围和实质当中的各种修改、组合和置换。