具体实施方式
虽然本申请的概念易于进行各种修改和替代形式,但是其具体实施例已经通过附图中的示例示出并且将在本文中详细描述。然而,应当理解,没有意图将本申请的概念限制为所公开的特定形式,而是相反,意图是覆盖与本申请以及所附权利要求一致的所有修改、等同物和替代物。
说明书中对“一个实施例”、“实施例”、“说明性实施例”等的引用,指示所描述的实施例可包括特定特征、结构或特性,但是每个实施例可以或可以不必包括特定特征、结构或特性。此外,这样的短语不一定指的是相同的实施例。进一步地,认为在本领域技术人员的知识范围内,当结合实施例描述特定特征、结构或特性时,结合无论是否明确描述的其它实施例影响这样的特征,结构或特性。另外,应当理解,以“A,B和C中的至少一个”的形式包括在列表中的项目可以表示(A);(B);(C);(A和B);(A和C);(B和C);或(A,B和C)。类似地,以“A,B或C中的至少一个”的形式列出的项目可以表示(A);(B);(C);(A和B);(A和C);(B和C)或(A,B和C)。
在一些情况下,所公开的实施例可以在硬件、固件、软件或其任何组合中实现。所公开的实施例还可以被实现为由一个或多个暂时性或非暂时性机器可读(例如,计算机可读)存储介质携带或存储的指令,其可以由一个或多个处理器读取和执行。机器可读存储介质可以体现为用于以机器可读形式(例如,易失性或非易失性存储器、介质盘或其他介质)存储或传输信息的任何存储设备,机制或其他物理结构的设备)。
在附图中,一些结构或方法特征可以以特定布置和/或顺序示出。然而,应当理解,可能不需要这样的具体布置和/或排序。相反,在一些实施例中,这些特征可以以与说明性附图中所示不同的方式和/或顺序来布置。另外,在特定图中包括结构或方法特征并不意味着暗示这种特征在所有实施例中都是需要的,并且在一些实施例中可以不包括或可以与其他特征组合。
操作系统用于向用户应用提供操作系统的基础能力,可基于动态语言应用运行平台实现,从而为动态语言应用提供运行环境。其中,Node.js即为JavaScript的运行环境或运行平台。动态语言应用运行平台中预加载有多种模块,称为公共模,用于提供特定功能,比如系统服务功能。
其中,动态语言是计算机编程语言中的一个语言类别,是一类在运行时可以动态地改变类型、结构的语言,在运行时函数和属性可以被增加、修改和删除。例如JavaScript、Python、Ruby等都属于动态语言。动态语言不需要编译即可运行,在运行时需要运行环境的支撑,这个环境叫做运行时环境,它包含动态语言运行所需要的所有要素,例如Java虚拟机、JavaScript引擎等。
以云操作系统(云OS)中的Host系统为例,它可基于Node.js实现。Node.js是JavaScript的运行环境,是建立在Chrome上的JavaScript引擎的Web应用程序框架,也就是说,操作系统基于Node.js向用户应用提供操作系统的基础能力。Node.js中包括多种模块,称为公共模块,这些模块可通过将用于实现特定功能的代码(比如实现操作系统级服务功能的代码)进行封装得到,比如可封装为组件形式,例如这些模块中可包括实现全球定位系统(Global Positioning System,简称GPS)定位功能的组件、实现电源管理功能的组件等。这些模块的接口被暴露给应用层,应用层中的应用程序可通过调用这些模块的接口,通过JavaScript引擎解析模块中的代码,执行这些模块提供的方法,从而实现这些模块提供的功能。
目前,后台服务器应用一般运行于Node.js。后台服务器应用的用户界面使用渲染引擎进行渲染。而渲染引擎大多专注于图形界面渲染,忽略了编程所需的其他公共模块的集成。使用这样的渲染引擎进行用户界面开发,需要编写或集成大量的公共模块,效率低下。Node.js虽然提供了丰富的JavaScript API,开发者可以利用它提供的模块快速开发功能,但缺失了用户界面渲染能力。
对此,本申请实施例提供了一种将渲染引擎与Node.js相融合的方案。下面结合附图对本申请实施例进行详细描述。
图1示例性地示出了一种操作系统架构100。架构100包括应用层10、应用框架层20和操作系统层30。应用层10中包括一个或多个应用。应用框架层20包括动态语言应用运行平台(比如Node.js)。操作系统层30主要用于提供操作系统级别的代码库以及基本的系统服务,比如提供的系统服务可包括设备驱动服务、事件管理服务等。
本申请实施例基于上述架构,使渲染引擎可以访问到如Node.js等的动态语言应用运行平台提供的能力。下面结合附图对本申请实施例进行详细描述。
动态语言应用运行平台启动时可预加载各种公共模块,并可进一步地将渲染引擎作为动态语言应用运行平台的标准模块进行预加载。
以动态语言应用运行平台为Node.js为例,Node.js启动过程中,Node.js进程被创建。Node.js进程预加载各种能力,这里所说的“能力”也可称为资源,可包括前述所描述的用于实现特定功能的模块(比如组件),还可以包括一些配置信息和/或资源等,比如上下文、事件队列等。Node.js所预加载的能力中至少包括渲染引擎,进一步还可包括Node.js提供的能力。其中,Node.js提供的能力可包括:Node.js中的公共模块(比如用于提供特定功能或服务的组件)和/或JavaScript运行环境相关信息。Node.js中的公共模块可通过对用于实现特定功能的JavaScript代码封装得到。每个模块均具有接口(比如API),可提供给应用层供应用程序调用。JavaScript运行环境相关信息可包括但不限于JavaScript引擎的上下文、事件循环相关配置中的一种或多种。其中,上下文用于描述引擎内部的各种对象、状态和功能。JavaScript引擎的上下文中可包括由Node.js进程所预加载的模块的接口(如API)。事件循环相关配置具体可包括Node.js的事件队列的配置,比如事件队列所在的内存区域位置、队列大小等。
在一些实施例中,Node.js进程可将预加载的能力(比如渲染引擎)封装为Node.js中的标准模块,作为Node.js的一个标准模块预加载的Node.js中,图2示例性地示出了预加载有渲染引擎的Node.js的示意图。
在一些实施例中,渲染引擎可由动态语言(如JavaScript语言)实现,即,渲染引擎中包含的函数由动态语言(如JavaScript语言)编写。在另外一些实施例中,渲染引擎的实现可分为两部分,其中为了性能考虑和多线程的利用,部分采用c/c++等自然语言实现,而另外的部分则采用动态语言,比如JavaScript语言实现。当然,渲染引擎也可以全部由c/c++等自然语言实现。
对于全部或部分由c/c++等自然语言实现的渲染引擎,渲染引擎可提供该自然语言的API(该API用于调用渲染引擎提供的基于该自然语言实现的用户界面渲染功能,即,调用渲染引擎中包含的该自然语言编写的函数),而动态语言应用运行平台支持动态语言,比如Node.js支持JavaScript语言,因此需要将渲染引擎提供的自然语言API(如c/c++API)映射为动态语言应用运行平台(如Node.js)支持的动态语言API(如JavaScript API),并将映射得到的API提供给应用层,动态语言应用运行平台(如Node.js)中保存该API的映射关系。图3示例性地示出了渲染引擎的API映射关系示意图。其中,渲染引擎中可包括多种组件,比如Window system组件(窗口系统组件)、UI Elements组件(用户界面部件组件)、Layout组件(布局组件)、Event Handling组件(事件处理组件)等,这些符合c/c++标准的组件的API被一一映射为对应的符合JavaScript标准的API。
对于全部由动态语言(如JavaScript语言)实现的渲染引擎,由于渲染引擎可提供动态语言API(该API用于调用渲染引擎提供的基于该自然语言实现的用户界面渲染功能,即,调用渲染引擎中包含的该自然语言编写的函数),而动态语言运行平台(如Node.js)支持动态语言,比如JavaScript语言,因此无需进行API映射。
在一些实施例中,进一步地,动态语言应用运行平台中预加载的能力还可包括但不限于以下中的一种或多种组合:
-操作系统提供的能力
操作系统提供的能力可包括:操作系统层提供的系统服务等。操作系统层中可包括用于提供系统服务的模块,这些模块可由用于实现特定能力的代码封装得到。每个模块均具有接口(比如API)。本申请实施例中,可通过将操作系统层中的模块的API添加到动态语言引擎(如JavaScript引擎)的上下文中,实现对操作系统能力的预加载。
-用户自定义的能力
用户自定义的能力,即用户自定义的用于实现特定功能的代码,可被封装为模块,每个模块均具有接口(如API)。本申请实施例中,可通过将用户自定义的模块的API添加到动态语言引擎(如JavaScript引擎)的上下文中,实现对用户自定义能力的预加载。
图4以动态语言应用运行平台为Node.js为例,示例性地示出了预加载渲染引擎后应用进程中的相关资源的示意图。如图所示,应用进程中包括Node.js线程,Node.js线程基于Node.js的事件循环机制进行用户界面渲染等事件的处理。Node.js线程可基于渲染引擎实现用户界面渲染。作为一个例子,Node.js线程可通过调用渲染引擎提供的接口实现应用程序用户界面渲染,通过调用公共模块1提供的接口实现网络连接功能,通过调用公共模块2提供的接口实现设备能力查询功能,通过调用公共模块3提供的接口实现事件管理功能。
图5示例性地示出了渲染引擎的结构示意图。渲染引擎的实现可分为两部分。为了性能考虑和多线程的利用等,一部分可使用自然语言实现(如c/c++等语言),另一部分使用动态语言实现(如JavaScript)。以自然语言为c/c++、动态语言为JavaScript为例,如果Node.js线程需要调用渲染引擎中由JavaScript实现的部分,则基于JavaScript API调用该部分中对应的函数;如果Node.js线程需要调用渲染线程中由c/c++实现的部分,则向JavaScript虚拟机发送调用指令,该调用指令中包括JavaScript API,JavaScript虚拟机将该JavaScript API映射为对应的c/c++API,并基于映射得到的c/c++API调用渲染引擎中由c/c++的实现部分中的相应函数,以实现用户界面渲染功能。
图6以Node.js为例,示例性地示出了本申请实施例提供的Node.js资源加载过程。该过程示例性地描述了Node.js启动过程。如图所示,在S610中,Node.js进程启动(比如启动JavaScript应用程序时则启动对应的Node.js进程)。在S611~S613中,Node.js进程执行初始化过程,在该过程中,Node.js进程预加载渲染引擎以及公共模块,所述公共模块可包括网络模块、系统模块等。具体预加载过程可参见前述实施例的描述。
图7示例性地示出了本申请实施例提供的用户界面渲染流程。如图所示,在S701中,第一线程获取待处理的用户界面渲染事件;在S702中,第一线程根据所述事件对应的用于调用渲染引擎的接口,调用所述渲染引擎提供的相应用户界面渲染功能。其中,第一线程可以是Node.js线程。作为一个示例,用户界面渲染事件可在以下情况下生成:由用户操作行为引起的需要刷新用户界面的情况(比如,用户通过触摸操作进行应用程序的切换,因此需要刷新屏幕显示内容,以显示切换到的目标应用程序的用户界面);再例如,用户点击用户界面中的一个功能按键来打开一个页面时,可生成用户界面渲染事件。
进一步地,如果第一线程对应的应用还基于公共模块接口调用了公共模块提供的功能,则在S703中,第一线程根据所述事件对应的用于调用公共模块的接口,调用所述公共模块提供的相应公共功能。
可选地,如前所述,渲染引擎提供的接口包括自然语言接口,该自然语言接口被映射为动态语言接口,该自然语言接口用于调用渲染引擎中基于该自然语言提供的用户界面渲染功能,动态语言为Node.js支持的动态语言,则在S702中,Node.js线程可获取所述事件对应的用于调用渲染引擎的动态语言接口,将获取到的动态语言接口映射为对应的自然语言接口,根据映射得到的自然语言接口调用渲染引擎提供的相应用户界面渲染功能。在一些例子中,具体过程可参见图5所示。
Node.js采用事件循环(Event loop)机制。本申请实施例中,渲染引擎被预加载到Node.js中,因此渲染引擎的事件与Node.js的事件可基于Node.js的事件队列进行事件循环。在没有事件发生的情况下,事件循环处于等待状态并阻塞,当Node.js或者渲染引擎有事件发生时,会将事件循环唤醒。比如,当渲染引擎有事件发生时,可通过异步方式唤醒事件循环,该渲染引擎的事件被存储于事件队列。该事件队列通常采用先进先出的机制。
图8以Node.js为例,示例性地示出了本申请实施例的事件循环机制。如图所示,Node.js的事件和渲染引擎的事件按照发生的先后顺序被存储在事件队列中。Node.js线程从事件队列中读取事件进行响应时,如果当前读取到的是用户界面渲染事件,则根据该用户界面渲染事件对应的用于调用渲染引擎的接口,调用渲染线程中相应的功能,以实现用户界面渲染功能,如果当前读取的是其他Node.js事件,则根据读取到的Node.js事件所对应的用于调用公共模块的接口,调用相应的功能模块,从而实现了将渲染引擎中的事件处理融入到了Node的事件循环中。
可选地,可采用异步处理机制对事件进行处理。具体地,可向Node.js线程注册回调函数,该回调函数用于在有用户界面渲染事件发生时通知Node.js线程。这样,当有用户界面渲染事件进入队列时,可通过该回调函数通知Node.js进程,Node.js进程可在接收到该回调函数的通知后,从Node.js事件队列中获取待处理的用户界面渲染事件。
可选地,可由另外的线程对Node.js事件队列进行管理。为描述方便,此处将用于管理Node.js事件队列的线程称为事件线程。事件线程可与操作系统对接,从操作系统接收操作系统相关事件,并将该操作系统相关事件存储在Node.js事件队列。其中,所述操作系统相关事件可包括但不限于:按键事件(key event)、触摸事件(touch event)、渲染事件(render event)。
通过以上描述可以看出,本申请的上述实施例中,Node.js中包括公共模块和渲染引擎,Node.js线程获取到待处理的用户界面渲染事件后,一方面可获取所述事件对应的用于调用渲染引擎的接口,根据获取到的用于调用渲染引擎的接口调用所述渲染引擎提供的相应用户界面渲染功能,另一方面可获取所述事件对应的用于调用公共模块的接口,根据获取到的用于调用公共模块的接口调用所述公共模块提供的相应公共功能。由此可见,由于Node.js中包括渲染引擎,因此一方面可在Node.js中基于渲染引擎实现用户界面渲染,另一方面,由于Node.js中还包括公共模块,因此第一线程还可在Node.js中基于公共模块实现公共功能,从而在Node.js中集成了用户界面渲染能力,为开发者进行程序开发提供了方便,即开发者仅需开发可在Node.js中运行的应用程序,该应用程序即可使用Node.js中的公共模块提供的公共功能,还可以使用Node.js中的渲染引擎提供的用户界面渲染功能。
本申请的上述实施例可应用于移动终端,比如手机、智能穿戴设备、车载设备、PDA等。以应用于基于云操作系统的手机为例,采用本申请实施例,可由Node.js线程基于渲染引擎实现用户界面渲染,从而使得用户界面渲染操作可使用Node.js所提供的能力,实现了Node.js与渲染引擎的融合。
基于相同的技术构思,本申请实施例还提供了一种用户界面渲染装置,可实现前述实施例描述的用户界面渲染流程。
图9示例性地示出了本申请实施例提供的用户界面渲染装置的结构示意图。该装置可包括:获取单元901、第一处理单元902,可选地,还可包括第二处理单元903,其中:
获取单元901,用于获取待处理的用户界面渲染事件,所述第一线程为动态语言应用运行平台中的线程;其中,所述动态语言应用运行平台中预加载有渲染引擎;
第一处理单元902,用于获取所述事件对应的用于调用渲染引擎的接口,根据获取到的用于调用渲染引擎的接口调用所述渲染引擎提供的相应用户界面渲染功能。
可选地,所述动态语言应用运行平台中还预加载有公共模块,第二处理单元903用于获取所述事件对应的用于调用公共模块的接口,根据获取到的用于调用公共模块的接口调用所述公共模块提供的相应公共功能。
可选地,所述渲染引擎提供的接口包括第一语言接口,所述第一语言接口被映射为第二语言接口,所述第一语言接口用于调用所述渲染引擎中基于所述第一语言提供的用户界面渲染功能,所述第二语言为所述动态语言应用运行平台支持的动态语言。第一处理单元902具体用于:获取所述事件对应的用于调用渲染引擎的第二语言接口,将获取到的第二语言接口映射为对应的第一语言接口,根据映射得到的第一语言接口调用所述渲染引擎提供的相应用户界面渲染功能。
可选地,第一处理单元902具体用于:向第二语言虚拟机发送调用指令,所述调用指令中包括用于调用渲染引擎的第二语言接口,所述调用指令用于触发所述第二语言虚拟机将所述第二语言接口映射为对应的第一语言接口,并基于映射得到的第一语言接口调用所述渲染引擎提供的相应用户界面渲染功能。
可选地,获取单元901具体用于:在接收到回调函数的通知后,从所述动态语言应用运行平台事件队列中获取待处理的用户界面渲染事件;其中,所述回调函数用于在有用户界面渲染事件进入所述事件队列时通知所述第一线程。
可选地,所述动态语言应用运行平台包括Node.js,所述第二语言包括JavaScript语言。
基于相同的技术构思,本申请实施例还提供了一种装置1000,该装置1000可实现前述实施例描述的流程。
图10示例性地示出了根据各种实施例的示例装置1000。装置1000可包括一个或多个处理器1002,系统控制逻辑1001耦合于至少一个处理器1002,非易失性存储器(non-volatile memory,NMV)/存储器1004耦合于系统控制逻辑1001,网络接口1006耦合于系统控制逻辑1001。
处理器1002可包括一个或多个单核处理器或多核处理器。处理器1002可包括任何一般用途处理器或专用处理器(如图像处理器、应用处理器基带处理器等)的组合。
一个实施例中的系统控制逻辑1001,可包括任何适当的接口控制器,以提供到处理器1002中的至少一个的任何合适的接口,和/或提供到与系统控制逻辑1001通信的任何合适的设备或组件的任何合适的接口。
一个实施例中的系统控制逻辑1001,可包括一个或多个内存控制器,以提供到系统内存1003的接口。系统内存1003用来加载以及存储数据和/或指令。例如,对应装置1000,在一个实施例中,系统内存1003可包括任何合适的易失性存储器。
NVM/存储器1004可包括一个或多个有形的非暂时的计算机可读介质,用于存储数据和/或指令。例如,NVM/存储器1004可包括任何合适的非易失性存储装置,如一个或多个硬盘(hard disk device,HDD),一个或多个光盘(compact disk,CD),和/或一个或多个数字通用盘(digital versatile disk,DVD)。
NVM/存储器1004可包括存储资源,该存储资源物理上是该系统所安装的或者可以被访问的设备的一部分,但不一定是设备的一部分。例如,NVM/存储器1004可经由网络接口1006被网络访问。
系统内存1003以及NVM/存储器1004可分别包括临时的或持久的指令1010的副本。指令1010可包括当由处理器1002中的至少一个执行时导致装置1000实现6描述的方法之一或组合的指令。各实施例中,指令1010或硬件、固件,和/或软件组件可另外地/可替换地被置于系统控制逻辑1001,网络接口1006和/或处理器1002。
网络接口1006可包括一个接收器来为装置1000提供无线接口来与一个或多个网络和/或任何合适的设备进行通信。网络接口1006可包括任何合适的硬件和/或固件。网络接口1006可包括多个天线来提供多输入多输出无线接口。在一个实施例中,网络接口1006可包括一个网络适配器、一个无线网络适配器、一个电话调制解调器,和/或无线调制解调器。
在一个实施例中,处理器1002中的至少一个可以与用于系统控制逻辑的一个或多个控制器的逻辑一起封装。在一个实施例中,处理器中的至少一个可以与用于系统控制逻辑的一个或多个控制器的逻辑一起封装以形成系统级封装。在一个实施例中,处理器中的至少一个可以与用于系统控制逻辑的一个或多个控制器的逻辑集成在相同的管芯上。在一个实施例中,处理器中的至少一个可以与用于系统控制逻辑的一个或多个控制器的逻辑集成在相同的管芯上以形成系统芯片。
装置1000可进一步包括输入/输出装置1005。输入/输出装置1005可包括用户接口旨在使用户与装置1000进行交互,可包括外围组件接口,其被设计为使得外围组件能够与系统交互,和/或,可包括传感器,旨在确定环境条件和/或有关装置1000的位置信息。