应用安装、运行方法及装置转让专利

申请号 : CN201510150236.8

文献号 : CN104714828B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 许澎湃郑相振

申请人 : 北京奇虎科技有限公司奇智软件(北京)有限公司

摘要 :

本发明提供了一种应用安装、运行方法及装置。其中,应用安装方法,包括:根据需求确定需实现的多类功能,其中,所述多类功能包括主功能和辅助功能;为所述主功能生成主应用,以及,为各类辅助功能生成独立的插件;安装所述主应用,其中,所述主应用能够根据需求调用不同的插件,以实现不同的辅助功能。采用本发明能够将主应用与辅助应用的插件独立出来,从而缩小安装包,加速安装速度,减小对系统空间的占用。

权利要求 :

1.一种应用安装方法,包括:

根据需求确定需实现的多类功能,其中,所述多类功能包括主功能和辅助功能;

为所述主功能生成主应用,以及,为各类辅助功能生成独立的插件;

安装所述主应用,其中,所述主应用能够根据需求调用不同的插件,以实现不同的辅助功能;

在所述主应用安装结束之后,还包括:

在前台显示性地加载具备辅助功能的各插件;或者在后台静默加载具备辅助功能的各插件;

所述加载具备辅助功能的各插件,包括:利用所述主应用的类加载器加载各插件的插件代码;

将各插件的所述插件代码加载到内存中,为各插件生成本插件独立的类加载器;

利用各插件的类加载器对应加载各插件资源。

2.根据权利要求1所述的方法,其中,各插件的插件代码和资源被加载后用于在插件被调用时模拟插件运行环境;以及各插件加载结束后,由插件管理器对插件进行统一命名以及管理。

3.一种应用运行方法,包括:

开启具备主功能的主应用,其中,所述主应用能够调用具备除所述主功能外的其他辅助功能的插件;

在所述主应用的界面中根据需求选择辅助功能对应的插件标识;

利用所述主应用调用选择的插件标识所对应的插件,以实现对应的辅助功能;

利用所述主应用调用插件,包括:

在所述主应用中建立托管插件组件,其中,所述托管插件组件能够模拟实现同一辅助功能、且嵌入到主应用中的非独立插件被调用时所产生事件;

当监测到任一事件发生时,所述托管插件组件被触发将发生的事件转至所述非独立插件具备的事件处理函数中进行处理。

4.根据权利要求3所述的方法,其中,当所述插件为活动Activity时,所述托管插件组件为代理Activity,能够模拟Activity生命周期和Activity事件;

当Activity事件发生时,所述代理Activity通过反射调用将Activity事件传递到插件Activity事件对应的处理函数中进行处理。

5.根据权利要求4所述的方法,其中,所述托管插件组件通过如下步骤实现:统一插件架构中同类Activity的父类;

将统一的父类替换为特定的PluginActivity;

当子类被调用时,由所述PluginActivity将子类的调用转发至所述托管插件组件。

6.根据权利要求4至5任一项所述的方法,其中,所述托管插件组件相对于其对应的插件是透明的。

7.根据权利要求3至5任一项所述的方法,其中,利用所述主应用调用插件,还包括:将各插件的资源对象和类加载器强行注入到所述主应用调用各插件所使用的上下文环境中,以供所述主应用调用各插件。

8.根据权利要求7所述的方法,其中,利用所述主应用调用插件,包括:当所述主应用调用一个插件时,利用反射将所述主应用的上下文的资源对象和类加载器替换为该插件的资源对象和类加载器;

利用该插件的资源对象和类加载器分别加载插件的资源和代码,执行插件的辅助功能。

9.根据权利要求3至5任一项所述的方法,其中,利用所述主应用调用插件,包括:所述主应用通过设置各插件上的插件接口与各插件进行通信,以实现对各插件的调用。

10.根据权利要求3至5任一项所述的方法,其中,还包括:当所述主应用同时调用多个插件时,

当其中任一个插件发出命令时,插件管理器接收所述命令并将所述命令分发至所述插件管理器管理的所有插件,其中,对所述命令感兴趣的插件对其进行处理,产生应答结果;

所述插件管理器接收对所述命令的应答结果,并将其返回至发出命令的插件。

11.根据权利要求10所述的方法,其中,所述命令在传递过程中使用系统的Intent类封装。

12.根据权利要求3至5任一项所述的方法,其中,在所述主应用的运行过程中,根据需求可增删插件数量或种类。

13.根据权利要求12所述的方法,其中,增删插件的命令由云端远程控制。

14.根据权利要求3至5任一项所述的方法,其中,所述插件在所述主应用界面中的呈现形式包括下列至少之一:卡片;

弹窗;

滚屏。

15.根据权利要求3至5任一项所述的方法,其中,当所述主应用为搜索应用时,辅助功能包括下列至少之一:小说;

扫码;

音乐;

视频;

新闻;

皮肤。

16.一种应用安装装置,包括:

功能确定模块,适于根据需求确定需实现的多类功能,其中,所述多类功能包括主功能和辅助功能;

分类配置模块,适于为所述主功能生成主应用,以及,为各类辅助功能生成独立的插件;

安装模块,适于安装所述主应用,其中,所述主应用能够根据需求调用不同的插件,以实现不同的辅助功能;

插件加载模块,适于在所述主应用安装结束之后,在前台显示性地加载具备辅助功能的各插件;或者,在后台静默加载具备辅助功能的各插件;

所述插件加载模块还用于:

利用所述主应用的类加载器加载各插件的插件代码;

将各插件的所述插件代码加载到内存中,为各插件生成本插件独立的类加载器;

利用各插件的类加载器对应加载各插件资源。

17.根据权利要求16所述的装置,其中,各插件的插件代码和资源被加载后用于在插件被调用时模拟插件运行环境;以及各插件加载结束后,由插件管理器对插件进行统一命名以及管理。

18.一种应用运行装置,包括:

启动模块,适于开启具备主功能的主应用,其中,所述主应用能够调用具备除所述主功能外的其他辅助功能的插件;

选择模块,适于在所述主应用的界面中根据需求选择辅助功能对应的插件标识;

调用模块,适于利用所述主应用调用选择的插件标识所对应的插件,以实现对应的辅助功能;

所述调用模块还用于:

在所述主应用中建立托管插件组件,其中,所述托管插件组件能够模拟实现同一辅助功能、且嵌入到主应用中的非独立插件被调用时所产生事件;

当监测到任一事件发生时,所述托管插件组件被触发将发生的事件转至所述非独立插件具备的事件处理函数中进行处理。

19.根据权利要求18所述的装置,其中,当所述插件为活动Activity时,所述托管插件组件为代理Activity,能够模拟Activity生命周期和Activity事件;

当Activity事件发生时,所述代理Activity通过反射调用将Activity事件传递到插件Activity事件对应的处理函数中进行处理。

20.根据权利要求19所述的装置,其中,所述托管插件组件通过如下步骤实现:统一插件架构中同类Activity的父类;

将统一的父类替换为特定的PluginActivity;

当子类被调用时,由所述PluginActivity将子类的调用转发至所述托管插件组件。

21.根据权利要求18至20任一项所述的装置,其中,所述托管插件组件相对于其对应的插件是透明的。

22.根据权利要求18至20任一项所述的装置,其中,所述调用模块还用于:将各插件的资源对象和类加载器强行注入到所述主应用调用各插件所使用的上下文环境中,以供所述主应用调用各插件。

23.根据权利要求22所述的装置,其中,所述调用模块还用于:当所述主应用调用一个插件时,利用反射将所述主应用的上下文的资源对象和类加载器替换为该插件的资源对象和类加载器;

利用该插件的资源对象和类加载器分别加载插件的资源和代码,执行插件的辅助功能。

说明书 :

应用安装、运行方法及装置

技术领域

[0001] 本发明涉及互联网应用领域,特别是涉及一种应用安装方法及装置,以及一种应用运行方法及装置。

背景技术

[0002] 安卓(Android)系统因其开放性、兼容性等特性已经成为目前智能终端最常用的操作系统之一。Android系统的组织架构因其拥有很好的组件间以及应用间通信的机制,可以很方便的将应用插件化、功能独立化。但是,这些机制仅限于已安装的应用。
[0003] 目前,Android系统中传统的插件化技术规定,每个插件都需要以独立应用的形式安装在用户的操作系统中。但是,如果每个插件都需要安装才能使用,随着用户需求的增加以及网络本身的发展,操作系统需要安装的插件越来越多,随着插件的增长,应用数会逐渐增多,占用大量的资源,容易造成操作系统运行缓慢甚至过载。

发明内容

[0004] 鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的应用安装方法、应用运行方法和相应的装置。
[0005] 基于本发明的一个方面,本发明实施例提供了一种应用安装方法,包括:
[0006] 根据需求确定需实现的多类功能,其中,所述多类功能包括主功能和辅助功能;
[0007] 为所述主功能生成主应用,以及,为各类辅助功能生成独立的插件;
[0008] 安装所述主应用,其中,所述主应用能够根据需求调用不同的插件,以实现不同的辅助功能。
[0009] 可选地,在所述主应用安装结束之后,还包括:
[0010] 在前台显示性地加载具备辅助功能的各插件;或者
[0011] 在后台静默加载具备辅助功能的各插件。
[0012] 可选地,所述加载具备辅助功能的各插件,包括:
[0013] 利用所述主应用的类加载器加载各插件的插件代码;
[0014] 将各插件的所述插件代码加载到内存中,为各插件生成本插件独立的类加载器;
[0015] 利用各插件的类加载器对应加载各插件资源。
[0016] 可选地,各插件的插件代码和资源被加载后用于在插件被调用时模拟插件运行环境;以及
[0017] 各插件加载结束后,由插件管理器对插件进行统一命名以及管理。
[0018] 基于本发明的另一个方面,本发明实施例还提供了一种应用运行方法,包括:
[0019] 开启具备主功能的主应用,其中,所述主应用能够调用具备除所述主功能外的其他辅助功能的插件;
[0020] 在所述主应用的界面中根据需求选择辅助功能对应的插件标识;
[0021] 利用所述主应用调用选择的插件标识所对应的插件,以实现对应的辅助功能。
[0022] 可选地,利用所述主应用调用插件,包括:
[0023] 在所述主应用中建立托管插件组件,其中,所述托管插件组件能够模拟实现同一辅助功能、且嵌入到主应用中的非独立插件被调用时所产生事件;
[0024] 当监测到任一事件发生时,所述托管插件组件被触发将发生的事件转至所述非独立插件具备的事件处理函数中进行处理。
[0025] 可选地,当所述插件为活动Activity时,
[0026] 所述托管插件组件为代理Activity,能够模拟Activity生命周期和Activity事件;
[0027] 当Activity事件发生时,所述代理Activity通过反射调用将Activity事件传递到插件Activity事件对应的处理函数中进行处理。
[0028] 可选地,所述托管插件组件通过如下步骤实现:
[0029] 统一插件架构中同类Activity的父类;
[0030] 将统一的父类替换为特定的PluginActivity;
[0031] 当子类被调用时,由所述PluginActivity将子类的调用转发至所述托管插件组件。
[0032] 可选地,所述托管插件组件相对于其对应的插件是透明的。
[0033] 可选地,利用所述主应用调用插件,还包括:
[0034] 将各插件的资源对象和类加载器强行注入到所述主应用调用各插件所使用的上下文环境中,以供所述主应用调用各插件。
[0035] 可选地,利用所述主应用调用插件,包括:
[0036] 当所述主应用调用一个插件时,利用反射将所述主应用的上下文的资源对象和类加载器替换为该插件的资源对象和类加载器;
[0037] 利用该插件的资源对象和类加载器分别加载插件的资源和代码,执行插件的辅助功能。
[0038] 可选地,利用所述主应用调用插件,包括:
[0039] 所述主应用通过设置各插件上的插件接口与各插件进行通信,以实现对各插件的调用。
[0040] 可选地,应用运行方法还包括:
[0041] 当所述主应用同时调用多个插件时,
[0042] 当其中任一个插件发出命令时,所述插件管理器接收所述命令并将所述命令分发至所述插件管理器管理的所有插件,其中,对所述命令感兴趣的插件对其进行处理,产生应答结果;
[0043] 所述插件管理器接收对所述命令的应答结果,并将其返回至发出命令的插件。
[0044] 可选地,所述命令在传递过程中使用系统的Intent类封装。
[0045] 可选地,在所述主应用的运行过程中,根据需求可增删插件数量或种类。
[0046] 可选地,增删插件的命令由云端远程控制。
[0047] 可选地,所述插件在所述主应用界面中的呈现形式包括下列至少之一:
[0048] 卡片;
[0049] 弹窗;
[0050] 滚屏。
[0051] 可选地,当所述主应用为搜索应用时,
[0052] 辅助功能包括下列至少之一:
[0053] 小说;
[0054] 扫码;
[0055] 音乐;
[0056] 视频;
[0057] 新闻;
[0058] 皮肤。
[0059] 基于本发明的又一个方面,本发明实施例还提供了一种应用安装装置,包括:
[0060] 功能确定模块,适于根据需求确定需实现的多类功能,其中,所述多类功能包括主功能和辅助功能;
[0061] 分类配置模块,适于为所述主功能生成主应用,以及,为各类辅助功能生成独立的插件;
[0062] 安装模块,适于安装所述主应用,其中,所述主应用能够根据需求调用不同的插件,以实现不同的辅助功能。
[0063] 可选地,应用安装装置还包括:
[0064] 插件加载模块,适于在所述主应用安装结束之后,在前台显示性地加载具备辅助功能的各插件;或者,在后台静默加载具备辅助功能的各插件。
[0065] 可选地,所述插件加载模块还用于:
[0066] 利用所述主应用的类加载器加载各插件的插件代码;
[0067] 将各插件的所述插件代码加载到内存中,为各插件生成本插件独立的类加载器;
[0068] 利用各插件的类加载器对应加载各插件资源。
[0069] 可选地,各插件的插件代码和资源被加载后用于在插件被调用时模拟插件运行环境;以及
[0070] 各插件加载结束后,由插件管理器对插件进行统一命名以及管理。
[0071] 基于本发明的又一个方面,本发明实施例还提供了一种应用运行装置,包括:
[0072] 启动模块,适于开启具备主功能的主应用,其中,所述主应用能够调用具备除所述主功能外的其他辅助功能的插件;
[0073] 选择模块,适于在所述主应用的界面中根据需求选择辅助功能对应的插件标识;
[0074] 调用模块,适于利用所述主应用调用选择的插件标识所对应的插件,以实现对应的辅助功能。
[0075] 可选地,所述调用模块还用于:
[0076] 在所述主应用中建立托管插件组件,其中,所述托管插件组件能够模拟实现同一辅助功能、且嵌入到主应用中的非独立插件被调用时所产生事件;
[0077] 当监测到任一事件发生时,所述托管插件组件被触发将发生的事件转至所述非独立插件具备的事件处理函数中进行处理。
[0078] 可选地,当所述插件为活动Activity时,
[0079] 所述托管插件组件为代理Activity,能够模拟Activity生命周期和Activity事件;
[0080] 当Activity事件发生时,所述代理Activity通过反射调用将Activity事件传递到插件Activity事件对应的处理函数中进行处理。
[0081] 可选地,所述托管插件组件通过如下步骤实现:
[0082] 统一插件架构中同类Activity的父类;
[0083] 将统一的父类替换为特定的PluginActivity;
[0084] 当子类被调用时,由所述PluginActivity将子类的调用转发至所述托管插件组件。
[0085] 可选地,所述托管插件组件相对于其对应的插件是透明的。
[0086] 可选地,所述调用模块还用于:
[0087] 将各插件的资源对象和类加载器强行注入到所述主应用调用各插件所使用的上下文环境中,以供所述主应用调用各插件。
[0088] 可选地,所述调用模块还用于:
[0089] 当所述主应用调用一个插件时,利用反射将所述主应用的上下文的资源对象和类加载器替换为该插件的资源对象和类加载器;
[0090] 利用该插件的资源对象和类加载器分别加载插件的资源和代码,执行插件的辅助功能。
[0091] 在本发明实施例中,将需求对应的功能分为两类,一类是由主应用实现的主功能,另一类是通过插件实现的辅助功能。在本发明实施例中,只需要安装主应用,若需要其他辅助功能,则可以通过主应用根据需求实时调用不同的插件,以实现不同的辅助功能。即,在本发明实施例中,仅主应用需要以独立应用的形式安装的操作系统中,其余插件并不需要安装才能够使用。在实施时,主应用通过一定的通信方式调用插件即能实现相应的功能。另外,本发明实施例将需求对应的功能进行划分,使得各需求可以分散同步进行开发,每个辅助功能以插件功能实现,可直接作为其他产品的插件,重复使用,进一步提高了插件的实用性。另外,在主应用的安装过程中,因此仅仅安装主应用,其对应的安装包仅需要包含其应用所必须的代码和资源即可,大幅度缩小了应用安装数据包,能够加快应用安装数据包的下载过程,避免用户因看到应用太大直接放弃下载,或者因下载过慢而中途放弃下载,提高了用户的感受体验。进一步,因插件与主应用分隔开,那么插件可以根据控制命令动态地添加、更新、删除,可以充分利用系统空间。且其与主应用的更新过程是独立的,且每个插件的更新过程均是独立的,因此使得更新过程更为独立化,与其他插件或主应用的更新互不干扰。
[0092] 上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
[0093] 根据下文结合附图对本发明具体实施例的详细描述,本领域技术人员将会更加明了本发明的上述以及其他目的、优点和特征。

附图说明

[0094] 通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0095] 图1示出了根据本发明一个实施例的应用安装方法的处理流程图;
[0096] 图2示出了根据本发明一个实施例的主应用与插件间的架构的具体实例的示意图;
[0097] 图3示出了根据本发明一个实施例的插件显示的界面示意图;
[0098] 图4示出了根据本发明一个实施例的应用运行方式的处理流程图;
[0099] 图5示出了根据本发明一个实施例的主应用调用多个插件的示意图;
[0100] 图6示出了根据本发明一个实施例的插件实现流程的示意图;
[0101] 图7示出了根据本发明一个实施例的应用安装装置的一种结构示意图;
[0102] 图8示出了根据本发明一个实施例的应用安装装置的另一种结构示意图;以及[0103] 图9示出了根据本发明一个实施例的应用运行装置的一种结构示意图。

具体实施方式

[0104] 下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0105] 为解决上述技术问题,本发明实施例提供了一种新的应用安装方法。图1示出了根据本发明一个实施例的应用安装方法的处理流程图。参见图1,该应用安装方法至少包括步骤S102至步骤S106:
[0106] 步骤S102、根据需求确定需实现的多类功能,其中,多类功能包括主功能和辅助功能;
[0107] 步骤S104、为主功能生成主应用,以及,为各类辅助功能生成独立的插件;
[0108] 步骤S106、安装主应用,其中,主应用能够根据需求调用不同的插件,以实现不同的辅助功能。
[0109] 需要说明地是,本发明实施例提及的插件实际上也是一个独立的应用(apk),其内部包括资源和代码,以及相关的android组件定义等。
[0110] 在本发明实施例中,将需求对应的功能分为两类,一类是由主应用实现的主功能,另一类是通过插件实现的辅助功能。在本发明实施例中,只需要安装主应用,若需要其他辅助功能,则可以通过主应用根据需求实时调用不同的插件,以实现不同的辅助功能。即,在本发明实施例中,仅主应用需要以独立应用的形式安装的操作系统中,其余插件并不需要安装才能够使用。在实施时,主应用通过一定的通信方式调用插件即能实现相应的功能。另外,本发明实施例将需求对应的功能进行划分,使得各需求可以分散同步进行开发,每个辅助功能以插件功能实现,可直接作为其他产品的插件,重复使用,进一步提高了插件的实用性。另外,在主应用的安装过程中,因此仅仅安装主应用,其对应的安装包仅需要包含其应用所必须的代码和资源即可,大幅度缩小了应用安装数据包,能够加快应用安装数据包的下载过程,避免用户因看到应用太大直接放弃下载,或者因下载过慢而中途放弃下载,提高了用户的感受体验。进一步,因插件与主应用分隔开,那么插件可以根据控制命令动态地添加、更新、删除,可以充分利用系统空间。且其与主应用的更新过程是独立的,且每个插件的更新过程均是独立的,因此使得更新过程更为独立化,与其他插件或主应用的更新互不干扰。
[0111] 在本发明实施例中,当步骤S106执行之后,即在主应用安装结束之后,可以选择性地对插件进行区别于主应用的安装方式,例如,可以在前台显示性地加载具备辅助功能的各插件,或者,也可以在后台静默加载具备辅助功能的各插件。将各辅助功能插件化后,主应用只需要安装运行其应用所必须的代码和资源即可,其他功能可以在主应用安装之后动态下载静默安装,使得应用数据包可大幅度的缩小,从而实现了应用瘦身这一目的,提高了应用的下载量,使得应用能够更广泛地被用户接受。
[0112] 进一步,将辅助功能插件化之后,主应用将拥有完全的本地化体验(例如音乐、视频、小说、新闻、扫码等等)。图2示出了根据本发明一个实施例的主应用与插件间的架构的具体实例的示意图。参见图2,主应用为搜索app,其对应的多种辅助功能包括小说、音乐、影视、新闻、皮肤等等,各辅助功能以单独的插件形式存在,搜索app可通过具体调用实现插件的动态加载。图3示出了根据本发明一个实施例的插件显示的界面示意图。参见图3,在搜索应用中,可动态加载拍题、新闻、视频、小说、图片、地图、应用、音乐等多种辅助功能。举个例子,当用户搜索小说(包括与小说相关的关键字,如书名、作者等)时,搜索app可调用小说插件,从而变身小说app,具有阅读器、书架、书库等功能。其中,插件在主应用界面中的呈现形式包括下列至少之一:卡片;弹窗;滚屏。
[0113] 因插件的独立性,各插件的更新也是独立的,更新各插件的资源无须更新主应用。例如,应用的皮肤可通过插件动态切换,每个皮肤主题可作为一个独立的插件动态加载和更新,更新皮肤库不需要更新主应用,可灵活的制作各种明星版、节日版,甚至用户可以自定义皮肤、分享皮肤等等。
[0114] 值得说明地是,采用本发明实施例提供的应用安装方法,插件可与主应用分别存储在不同的存储空间,插件可单独存储在扩展空间中(例如扩展卡,SD卡、TF卡),并且可在扩展空间中实现动态加载、删除或更新。其中,增删插件的命令由云端远程控制,进一步保证了插件的灵活性。
[0115] 其中,加载具备辅助功能的各插件,包括两部分,一部分是加载插件代码,另一部分是加载插件资源。在本发明实施例中,利用主应用的类加载器加载各插件的插件代码,进而将各插件的插件代码加载到内存中,为各插件生成本插件独立的类加载器。随后,利用利用各插件的类加载器对应加载各插件资源。
[0116] 通常情况下,一个app只能拥有一个资源对象(Resource)和一个加载app代码的类加载器(ClassLoader),所以在app各处使用的资源和代码都是主app的。如果要在不限定条件不破坏插件原有代码结构和逻辑的情况下调用插件里面的资源和代码,那么就必须将主应用的资源对象和类加载器(mResource、mClassLoader)等对象替换为插件的资源和类加载器,这样,插件就可以直接使用自己的资源和代码了。
[0117] 要让主app调起插件,则需要模拟一个app运行的环境提供给插件运行,因此,各插件的插件代码和资源被加载后用于在插件被调用时模拟插件运行环境;以及,各插件加载结束后,由插件管理器对插件进行统一命名以及管理。
[0118] 基于同一发明构思,本发明实施例还提供了一种应用运行方法,应用于采用上述应用安装方法安装的应用。图4示出了根据本发明一个实施例的应用运行方式的处理流程图。参见图4,应用运行方法至少包括:
[0119] 步骤S402、开启具备主功能的主应用,其中,主应用能够调用具备除主功能外的其他辅助功能的插件;
[0120] 步骤S404、在主应用的界面中根据需求选择辅助功能对应的插件标识;
[0121] 步骤S406、利用主应用调用选择的插件标识所对应的插件,以实现对应的辅助功能。
[0122] 在本发明实施例中,将需求对应的功能分为两类,一类是由主应用实现的主功能,另一类是通过插件实现的辅助功能。在本发明实施例中,仅主应用需要以独立应用的形式安装的操作系统中,其余插件并不需要安装才能够使用。在实施时,主应用通过一定的通信方式调用插件即能实现相应的功能。另外,本发明实施例将需求对应的功能进行划分,使得各需求可以分散同步进行开发,每个辅助功能以插件功能实现,可直接作为其他产品的插件,重复使用,进一步提高了插件的实用性。进一步,因插件与主应用分隔开,那么插件可以根据控制命令动态地添加、更新、删除,可以充分利用系统空间。且其与主应用的更新过程是独立的,且每个插件的更新过程均是独立的,因此使得更新过程更为独立化,与其他插件或主应用的更新互不干扰。
[0123] 插件实际上是一个独立的应用,它内部包含资源和代码以及相关的android组件定义等,要让主app调起插件,则需要模拟一个app运行的环境提供给插件运行,其中重点包括:插件代码和资源的加载、插件资源注入、组件托管和代理。另外为让插件保持原有的结构和代码逻辑,我们需要处理他们的特定调用:如this、super调用、系统组件属性模拟(launch_mode、intent-filter等)。
[0124] 首先,利用主应用调用插件。Android中大部分组件是需要注册在apk的Androidmanifest.xml中才能被系统正常调用的(如Activity、Service等),而本发明实施例中的插件并没有安装,此时它的组件是没有向系统注册的,app无法像使用传统的组件那样调起它。要使用插件中的组件,就必须解决这个问题。为解决这一问题,本发明实施例采用在主应用中建立托管插件组件的处理方法,其中,托管插件组件能够模拟实现同一辅助功能、且嵌入到主应用中的非独立插件被调用时所产生事件。当监测到任一事件发生时,托管插件组件被触发将发生的事件转至非独立插件具备的事件处理函数中进行处理。
[0125] 以活动(Activity)为例,当插件为活动Activity时,托管插件组件为代理Activity,能够模拟Activity生命周期和Activity事件;。当Activity事件发生时,代理Activity通过反射调用将Activity事件传递到插件Activity事件对应的处理函数中进行处理。即,在主app中定义一个专用的代理Activity(ProxyActivity),该Activity专门用来代理插件的Activity,模拟实现插件Activity的生命周期(onCreate、onStart等)和各种事件,插件Activity作为一个普通的java对象创建,事件通过反射调用传递到插件Activity对于的处理函数中,该过程对于插件来说是透明,它还是照常实现Activity的逻辑。
[0126] ProxyActivity不是真正的Activity,它没有插件的类加载器和资源,代理Activity能解决的只是模拟系统主动发起,组件被动接收的事件,当插件Activity使用例如this或者super等主动调用系统提供的方法时(如setContentView等),必然会出现问题。
[0127] 为了解决此问题,本发明实施例定义了一个非常简单的插件实现规范:插件中使用的所有Activity必须继承自插件sdk中一个特定的PluginActivity。在插件架构良好,大部分同类Activity都有统一的父类的情况下,只需要将这些父类的父类替换为PluginActivity即可。PluginActivity会重写系统的关键方法,将子类的调用直接转发给ProxyActiviy,这样,插件Activity使用this或者super调用的比较关键的方法,都将被ProxyActivity所处理,就像它自己就是一个真实的Activity一样。
[0128] 通常情况下,一个app只能拥有一个资源对象和一个加载app代码的类加载器,所以在app各处使用的资源和代码都是主app的。如果要在不限定条件不破坏插件原有代码结构和逻辑的情况下调用插件里面的资源和代码,那么就必须将插件的资源和类加载器强行注入到主应用调用各插件所使用的上下文环境中,以供主应用调用各插件。
[0129] 具体地,当主应用调用一个插件时,利用反射将主应用的上下文的资源对象和类加载器替换为该插件的资源对象和类加载器;利用该插件的资源对象和类加载器分别加载插件的资源和代码,执行插件的辅助功能。当呼起一个插件时,一般情况下是调起一个插件的组件(Activity、Service等),前面提到过,本发明是主应用调用插件的组件,这时提供给插件使用的是主应用的上下文(context),如果插件直接使用它必然出错,因此,本实施例在使用之前强行的利用反射将该context中的资源对象和类加载器(mResource、mClassLoader)等对象替换为插件的资源和类加载器,这样,插件就可以直接使用自己的资源和代码了。
[0130] 因主应用同时与多个插件存在互动关系,因此,主应用通过设置各插件上的插件接口与各插件进行通信,以实现对各插件的调用。例如,插件组件给插件提供了一个插件接口(IPlugin),可以帮助插件与宿主通信。关键方法为onLoad()、onCommand(),onLoad()在插件被加载时调用,插件可在该函数中进行一些初始化工作,onCommand()在插件接收到命令时被调用,插件可以在该函数中实现命令的处理。
[0131] 当主应用同时调用多个插件时,当其中任一个插件发出命令时,插件管理器接收命令并将命令分发至插件管理器管理的所有插件,其中,对命令感兴趣的插件对其进行处理,产生应答结果;插件管理器接收对命令的应答结果,并将其返回至发出命令的插件。即可以在插件中定义一个统一的规范,当插件发出一个命令时,插件管理器将命令分发给所有的插件,插件只需在接口类的应答(onCommand)中处理自己感兴趣的命令即可,命令的传递使用系统的Intent类封装,这样即保证了插件间不存在依赖性,又避免了插件代码的依赖。图5示出了根据本发明一个实施例的主应用调用多个插件的示意图。
[0132] 根据上文的描述可知,本发明实施例可使应用的功能插件化,如应用卡片、应用模块、应用皮肤等均可插件化独立化,从而使得应用的开发可以分散的同步进行,提高了现有产品的价值,并解决了应用体积大的问题,以及某些小的更新也需要更新整个app的问题,提高用户体验,缩短用户流程。具体地,
[0133] 1、插件资源和代码动态加载解决了插件动态更新的问题,这样插件不需要包含在主app的安装包中。
[0134] 2、组件代理和托管,解决了插件中组件定义的问题,降低插件与宿主的耦合性。
[0135] 3、插件资源和类加载器的注入,保证了插件原有逻辑和资源,使插件无需做大改动就可作为插件运行。
[0136] 4、插件中this、super的调用处理,保证插件代码完整的运行。
[0137] 5、插件间的互相调用实现,可以让插件间无依赖性,并可互相调起。
[0138] 6、插件接口的实现给插件提供了一种与宿主通信的机制。
[0139] 图6示出了根据本发明一个实施例的插件实现流程的示意图。参见图6,插件管理器对插件进行管理,进行初始化操作和预加载等预处理。该处理过程与主app的启动过程是独立的、异步的。当主app初始化结束后,通过app功能界面发起插件调用,到插件管理器处调用需要的插件。随后,插件启动,并在app功能界面上加载并显示新的插件功能界面。
[0140] 基于同一发明构思,本发明实施例还提供了一种应用安装装置。图7示出了根据本发明一个实施例的应用安装装置的一种结构示意图。参见图7,该装置至少包括:
[0141] 功能确定模块710,适于根据需求确定需实现的多类功能,其中,多类功能包括主功能和辅助功能;
[0142] 分类配置模块720,与功能确定模块710耦合,适于为主功能生成主应用,以及,为各类辅助功能生成独立的插件;
[0143] 安装模块730,与分类配置模块720耦合,适于安装主应用,其中,主应用能够根据需求调用不同的插件,以实现不同的辅助功能。
[0144] 图8示出了根据本发明一个实施例的应用安装装置的另一种结构示意图。在一个优选的实施例中,参见图7,应用安装装置还可以包括:
[0145] 插件加载模块740,分别分类配置模块720以及安装模块730耦合,适于在主应用安装结束之后,在前台显示性地加载具备辅助功能的各插件;或者,在后台静默加载具备辅助功能的各插件。
[0146] 在一个优选的实施例中,插件加载模块740还用于:
[0147] 利用主应用的类加载器加载各插件的插件代码;
[0148] 将各插件的插件代码加载到内存中,为各插件生成本插件独立的类加载器;
[0149] 利用各插件的类加载器对应加载各插件资源。
[0150] 在一个优选的实施例中,
[0151] 各插件的插件代码和资源被加载后用于在插件被调用时模拟插件运行环境;以及[0152] 各插件加载结束后,由插件管理器对插件进行统一命名以及管理。
[0153] 基于同一发明构思,本发明实施例还提供了一种应用运行装置。图9示出了根据本发明一个实施例的应用运行装置的一种结构示意图。参见图9,该装置至少包括:
[0154] 启动模块910,适于开启具备主功能的主应用,其中,主应用能够调用具备除主功能外的其他辅助功能的插件;
[0155] 选择模块920,与启动模块910耦合,适于在主应用的界面中根据需求选择辅助功能对应的插件标识;
[0156] 调用模块930,与选择模块920耦合,适于利用主应用调用选择的插件标识所对应的插件,以实现对应的辅助功能。
[0157] 在一个优选的实施例中,调用模块930还用于:
[0158] 在主应用中建立托管插件组件,其中,托管插件组件能够模拟实现同一辅助功能、且嵌入到主应用中的非独立插件被调用时所产生事件;
[0159] 当监测到任一事件发生时,托管插件组件被触发将发生的事件转至非独立插件具备的事件处理函数中进行处理。
[0160] 在一个优选的实施例中,当插件为活动Activity时,
[0161] 托管插件组件为代理Activity,能够模拟Activity生命周期和Activity事件;
[0162] 当Activity事件发生时,代理Activity通过反射调用将Activity事件传递到插件Activity事件对应的处理函数中进行处理。
[0163] 在一个优选的实施例中,托管插件组件通过如下步骤实现:
[0164] 统一插件架构中同类Activity的父类;
[0165] 将统一的父类替换为特定的PluginActivity;
[0166] 当子类被调用时,由PluginActivity将子类的调用转发至托管插件组件。
[0167] 在一个优选的实施例中,托管插件组件相对于其对应的插件是透明的。
[0168] 在一个优选的实施例中,调用模块930还用于:
[0169] 将各插件的资源对象和类加载器强行注入到主应用调用各插件所使用的上下文环境中,以供主应用调用各插件。
[0170] 在一个优选的实施例中,调用模块930还用于:
[0171] 当主应用调用一个插件时,利用反射将主应用的上下文的资源对象和类加载器替换为该插件的资源对象和类加载器;
[0172] 利用该插件的资源对象和类加载器分别加载插件的资源和代码,执行插件的辅助功能。
[0173] 采用本发明实施例提供的方法及装置,能够达到如下区别技术特征:
[0174] 在本发明实施例中,将需求对应的功能分为两类,一类是由主应用实现的主功能,另一类是通过插件实现的辅助功能。在本发明实施例中,只需要安装主应用,若需要其他辅助功能,则可以通过主应用根据需求实时调用不同的插件,以实现不同的辅助功能。即,在本发明实施例中,仅主应用需要以独立应用的形式安装的操作系统中,其余插件并不需要安装才能够使用。在实施时,主应用通过一定的通信方式调用插件即能实现相应的功能。另外,本发明实施例将需求对应的功能进行划分,使得各需求可以分散同步进行开发,每个辅助功能以插件功能实现,可直接作为其他产品的插件,重复使用,进一步提高了插件的实用性。另外,在主应用的安装过程中,因此仅仅安装主应用,其对应的安装包仅需要包含其应用所必须的代码和资源即可,大幅度缩小了应用安装数据包,能够加快应用安装数据包的下载过程,避免用户因看到应用太大直接放弃下载,或者因下载过慢而中途放弃下载,提高了用户的感受体验。进一步,因插件与主应用分隔开,那么插件可以根据控制命令动态地添加、更新、删除,可以充分利用系统空间。且其与主应用的更新过程是独立的,且每个插件的更新过程均是独立的,因此使得更新过程更为独立化,与其他插件或主应用的更新互不干扰。
[0175] 在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
[0176] 类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
[0177] 本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
[0178] 此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
[0179] 本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的各装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
[0180] 应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
[0181] 至此,本领域技术人员应认识到,虽然本文已详尽示出和描述了本发明的多个示例性实施例,但是,在不脱离本发明精神和范围的情况下,仍可根据本发明公开的内容直接确定或推导出符合本发明原理的许多其他变型或修改。因此,本发明的范围应被理解和认定为覆盖了所有这些其他变型或修改。
[0182] 本发明公开了A1、一种应用安装方法,包括:
[0183] 根据需求确定需实现的多类功能,其中,所述多类功能包括主功能和辅助功能;
[0184] 为所述主功能生成主应用,以及,为各类辅助功能生成独立的插件;
[0185] 安装所述主应用,其中,所述主应用能够根据需求调用不同的插件,以实现不同的辅助功能。
[0186] A2、根据权利要求A1所述的方法,其中,在所述主应用安装结束之后,还包括:
[0187] 在前台显示性地加载具备辅助功能的各插件;或者
[0188] 在后台静默加载具备辅助功能的各插件。
[0189] A3、根据权利要求A2所述的方法,其中,所述加载具备辅助功能的各插件,包括:
[0190] 利用所述主应用的类加载器加载各插件的插件代码;
[0191] 将各插件的所述插件代码加载到内存中,为各插件生成本插件独立的类加载器;
[0192] 利用各插件的类加载器对应加载各插件资源。
[0193] A4、根据权利要求A3所述的方法,其中,
[0194] 各插件的插件代码和资源被加载后用于在插件被调用时模拟插件运行环境;以及[0195] 各插件加载结束后,由插件管理器对插件进行统一命名以及管理。
[0196] 本发明还公开了B5、一种应用运行方法,包括:
[0197] 开启具备主功能的主应用,其中,所述主应用能够调用具备除所述主功能外的其他辅助功能的插件;
[0198] 在所述主应用的界面中根据需求选择辅助功能对应的插件标识;
[0199] 利用所述主应用调用选择的插件标识所对应的插件,以实现对应的辅助功能。
[0200] B6、根据权利要求B5所述的方法,其中,利用所述主应用调用插件,包括:
[0201] 在所述主应用中建立托管插件组件,其中,所述托管插件组件能够模拟实现同一辅助功能、且嵌入到主应用中的非独立插件被调用时所产生事件;
[0202] 当监测到任一事件发生时,所述托管插件组件被触发将发生的事件转至所述非独立插件具备的事件处理函数中进行处理。
[0203] B7、根据权利要求B6所述的方法,其中,当所述插件为活动Activity时,[0204] 所述托管插件组件为代理Activity,能够模拟Activity生命周期和Activity事件;
[0205] 当Activity事件发生时,所述代理Activity通过反射调用将Activity事件传递到插件Activity事件对应的处理函数中进行处理。
[0206] B8、根据权利要求B7所述的方法,其中,所述托管插件组件通过如下步骤实现:
[0207] 统一插件架构中同类Activity的父类;
[0208] 将统一的父类替换为特定的PluginActivity;
[0209] 当子类被调用时,由所述PluginActivity将子类的调用转发至所述托管插件组件。
[0210] B9、根据权利要求B6至B8任一项所述的方法,其中,所述托管插件组件相对于其对应的插件是透明的。
[0211] B10、根据权利要求B5至B9任一项所述的方法,其中,利用所述主应用调用插件,还包括:
[0212] 将各插件的资源对象和类加载器强行注入到所述主应用调用各插件所使用的上下文环境中,以供所述主应用调用各插件。
[0213] B11、根据权利要求B10所述的方法,其中,利用所述主应用调用插件,包括:
[0214] 当所述主应用调用一个插件时,利用反射将所述主应用的上下文的资源对象和类加载器替换为该插件的资源对象和类加载器;
[0215] 利用该插件的资源对象和类加载器分别加载插件的资源和代码,执行插件的辅助功能。
[0216] B12、根据权利要求B5至B11任一项所述的方法,其中,利用所述主应用调用插件,包括:
[0217] 所述主应用通过设置各插件上的插件接口与各插件进行通信,以实现对各插件的调用。
[0218] B13、根据权利要求B5至B11任一项所述的方法,其中,还包括:
[0219] 当所述主应用同时调用多个插件时,
[0220] 当其中任一个插件发出命令时,所述插件管理器接收所述命令并将所述命令分发至所述插件管理器管理的所有插件,其中,对所述命令感兴趣的插件对其进行处理,产生应答结果;
[0221] 所述插件管理器接收对所述命令的应答结果,并将其返回至发出命令的插件。
[0222] B14、根据权利要求B13所述的方法,其中,所述命令在传递过程中使用系统的Intent类封装。
[0223] B15、根据权利要求B5至B14任一项所述的方法,其中,在所述主应用的运行过程中,根据需求可增删插件数量或种类。
[0224] B16、根据权利要求B15所述的方法,其中,增删插件的命令由云端远程控制。
[0225] B17、根据权利要求B1至B16任一项所述的方法,其中,所述插件在所述主应用界面中的呈现形式包括下列至少之一:
[0226] 卡片;
[0227] 弹窗;
[0228] 滚屏。
[0229] B18、根据权利要求B1至B17任一项所述的方法,其中,当所述主应用为搜索应用时,
[0230] 辅助功能包括下列至少之一:
[0231] 小说;
[0232] 扫码;
[0233] 音乐;
[0234] 视频;
[0235] 新闻;
[0236] 皮肤。
[0237] 本发明还公开了C19、一种应用安装装置,包括:
[0238] 功能确定模块,适于根据需求确定需实现的多类功能,其中,所述多类功能包括主功能和辅助功能;
[0239] 分类配置模块,适于为所述主功能生成主应用,以及,为各类辅助功能生成独立的插件;
[0240] 安装模块,适于安装所述主应用,其中,所述主应用能够根据需求调用不同的插件,以实现不同的辅助功能。
[0241] C20、根据权利要求C19所述的装置,其中,还包括:
[0242] 插件加载模块,适于在所述主应用安装结束之后,在前台显示性地加载具备辅助功能的各插件;或者,在后台静默加载具备辅助功能的各插件。
[0243] C21、根据权利要求C20所述的装置,其中,所述插件加载模块还用于:
[0244] 利用所述主应用的类加载器加载各插件的插件代码;
[0245] 将各插件的所述插件代码加载到内存中,为各插件生成本插件独立的类加载器;
[0246] 利用各插件的类加载器对应加载各插件资源。
[0247] C22、根据权利要求21所述的装置,其中,
[0248] 各插件的插件代码和资源被加载后用于在插件被调用时模拟插件运行环境;以及[0249] 各插件加载结束后,由插件管理器对插件进行统一命名以及管理。
[0250] 本发明还公开了D23、一种应用运行装置,包括:
[0251] 启动模块,适于开启具备主功能的主应用,其中,所述主应用能够调用具备除所述主功能外的其他辅助功能的插件;
[0252] 选择模块,适于在所述主应用的界面中根据需求选择辅助功能对应的插件标识;
[0253] 调用模块,适于利用所述主应用调用选择的插件标识所对应的插件,以实现对应的辅助功能。
[0254] D24、根据权利要求D23所述的装置,其中,所述调用模块还用于:
[0255] 在所述主应用中建立托管插件组件,其中,所述托管插件组件能够模拟实现同一辅助功能、且嵌入到主应用中的非独立插件被调用时所产生事件;
[0256] 当监测到任一事件发生时,所述托管插件组件被触发将发生的事件转至所述非独立插件具备的事件处理函数中进行处理。
[0257] D25、根据权利要求D24所述的装置,其中,当所述插件为活动Activity时,[0258] 所述托管插件组件为代理Activity,能够模拟Activity生命周期和Activity事件;
[0259] 当Activity事件发生时,所述代理Activity通过反射调用将Activity事件传递到插件Activity事件对应的处理函数中进行处理。
[0260] D26、根据权利要求D25所述的装置,其中,所述托管插件组件通过如下步骤实现:
[0261] 统一插件架构中同类Activity的父类;
[0262] 将统一的父类替换为特定的PluginActivity;
[0263] 当子类被调用时,由所述PluginActivity将子类的调用转发至所述托管插件组件。
[0264] D27、根据权利要求D24至D26任一项所述的装置,其中,所述托管插件组件相对于其对应的插件是透明的。
[0265] D28、根据权利要求D23至D27任一项所述的装置,其中,所述调用模块还用于:
[0266] 将各插件的资源对象和类加载器强行注入到所述主应用调用各插件所使用的上下文环境中,以供所述主应用调用各插件。
[0267] D29、根据权利要求D28所述的装置,其中,所述调用模块还用于:
[0268] 当所述主应用调用一个插件时,利用反射将所述主应用的上下文的资源对象和类加载器替换为该插件的资源对象和类加载器;
[0269] 利用该插件的资源对象和类加载器分别加载插件的资源和代码,执行插件的辅助功能。