一种插件加载方法、装置及计算机可读存储介质与流程

文档序号:15346542发布日期:2018-09-04 22:49阅读:131来源:国知局

本发明涉及通讯技术领域,尤其涉及一种插件加载方法、装置及计算机可读存储介质。



背景技术:

随着移动应用的普及以及产品新功能的不断添加,业务逻辑越来越复杂,需要对应用程序(application,app)不断的进行功能扩展,每次app功能扩展都需要发布新版本,此时,所有的模块必须同步开发,重新打包app、测试,然后在各大市场发布,这种传统的开发模式已经不能适应快速迭代的移动互联网行业,因此,现有技术大多采用插件实现对app功能的扩展。但是,客户端为了如果要加载插件,仍然需要重新下载app安装包将app升级到最新版本,用户体验不好。

因此,有必要提供一种插件加载方法、装置及计算机可读存储介质。



技术实现要素:

有鉴于此,本发明的目的在于提供一种插件加载方法、装置及计算机可读存储介质,以解决现有客户端加载插件时需要重新下载app安装包将app升级到最新版本,用户体验不好的问题。

本发明解决上述技术问题所采用的技术方案如下:

根据本发明的第一个方面,提供一种插件加载方法,所述插件加载方法包括以下步骤:

a、从服务器下载应用程序app的插件安装包;

b、为所述插件安装包构建类加载器,所述类加载器与已存在的类加载器相互独立;

c、加载所述插件安装包。

可选的,所述步骤b,包括:

指定所述插件安装包的路径并构建loadapk对象,所述loadapk对象中包含所述类加载器;

将所述loadapk对象插入到与所述app对应的系统程序中。

可选的,所述将所述loadapk对象插入到与所述app对应的系统程序中,包括:

通过hook技术,将所述loadapk对象插入到与所述app对应的系统程序中。

可选的,所述步骤c包括:

导入所述插件安装包的路径,获得所述插件安装包的资源信息;

根据所述资源信息运行所述插件。

可选的,所述从服务器下载应用程序app的插件安装包之前,所述方法还包括:

向所述服务器发起请求,所述请求包括本地所述app的版本信息和插件安装包的版本信息;

当所述服务器存在对应的插件安装包时,下载所述插件安装包;

可选的,所述加载所述插件安装包之后,所述方法还包括:

向所述服务器上报所述插件安装包的功能扩展状态。

可选的,执行步骤b之前,所述方法还包括:

对所述插件安装包进行安全性检测;

若所述插件安装包通过了所述安全性检测,则执行步骤b。

根据本发明的第二个方面,提供一种插件加载装置,所述插件加载装置包括:存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如第一方面所述的方法的步骤。

根据本发明的第三个方面,提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面所述的插件加载方法的步骤。

本发明实施例的插件加载方法、装置及计算机可读存储介质,在下载了插件安装后,为下载的插件安装包构建一个完全独立于本地宿主应用apk的类加载器,即使不同的插件使用了同一个库的不同版本,插件之间也互不影响,因此无需升级app就能实现快速扩展app功能的目的,提升了用户体验。

附图说明

图1为本发明实施例中插件化功能扩展的总体架构图;

图2为本地宿主应用apk的模块结构示意图;

图3为本发明实施例一提供的一种插件加载方法的流程图;

图4为各个类加载器之间的数据结构示意图;

图5为loadapk对象的构建结构示意图;

图6为利用hook技术将插件的loadapk对象插入到activitythread的结构示意图;

图7为本发明实施例二提供的一种插件加载装置的模块结构示意图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

在后续的描述中,使用用于表示元件的诸如“模块”、“部件”或“单元”的后缀仅为了有利于本发明的说明,其本身没有特定的意义。因此,“模块”、“部件”或“单元”可以混合地使用。

实际应用中,插件安装包的加载涉及客户端和服务器两部分,如图1所示,客户端负责下载、更新插件安装包pluginapk,并动态加载pluginapk以实现功能的动态增加;服务器则需要对pluginapk进行管理和分发。

客户端通过本地宿主应用apk(host)实现下载、更新插件安装包pluginapk,并动态加载pluginapk以实现功能的动态增加。请参阅图2,(host)结构分为3大部分:本地宿主应用apk、插件开发包(softwaredevelopmentkit,sdk)、pluginapk。其中,本地宿主应用apk负责与服务器的通信、管理pluginapk,动态加载pluginapk等;pluginapk为独立的app,一般实现相对独立简单的小功能;插件sdk是本地宿主应用apk动态加载pluginapk所依赖的库。

本发明本实施例主要对客户端的插件加载方法进行说明。

本发明实施例一提供了一种插件加载方法,适用于客户端,请参阅图3,该插件加载方法包括以下步骤:

s301、从服务器下载应用程序app的插件安装包;

s302、为该插件安装包构建类加载器,该类加载器与已存在的类加载器相互独立,该已存在的类加载器包括本地宿主应用apk(host)的类加载器和/或其他已下载的插件安装包的类加载器;

s303、加载该插件安装包。

实际应用中,为了实现对pluginapk的动态加载,需要解决类的加载和资源的加载的问题。因此本实施例中,为每个pluginapk构建独立的类加载器classloader和资源加载器。

在一个可行的方案中,该步骤s302,包括:

指定该插件安装包的路径并构建loadapk对象,该loadapk对象中包含该类加载器;

将该loadapk对象插入到与该app对应的系统程序中。

实际应用中,通过dexclassloader加载插件的代码,需要传入插件apk的路径dexclassloader(dex文件路径列表dexpath,dexoutputpath,mnativelibdir,mcontext.getclassloader())。

在加载与app对应的系统应用程序的组件activity的时候,有一个很重要的类:loadedapk.java,这个类是负责加载一个apk程序,其内部包含一个classloader成员变量,用来加载.class文件。同时还有一个类主线程activitythread.java,activitythread里面有个静态的成员变量scurrentactivitythread,同时还需要一个arraymap存放apk包名和loadedapk映射关系的数据结构,各个类加载器之间的数据结构如图4所示。

因此,本实施例中,首先指定插件apk路径构建loadapk对象,构建结果如图5所示,在loadapk对象中,包含了上述信息内容。

再通过钩子hook技术将插件的loadapk对象插入到activitythread中,得到如图6所示的结构。从图6可以看出,各个loadapk对象的classsloader可以不相同,既相互独立。

这样,就可以通过hook为插件构造一个完全独立于host的classsloader,每一个插件都有一个自己的classloader,因此类的隔离性非常好,如果不同的插件使用了同一个库的不同版本,它们相安无事,可以完成代码的热加载。

在一个可行的方案中,步骤s303包括:

导入该插件安装包的路径,获得该插件安装包的资源信息;

根据该资源信息运行该插件。

实际应用中,为了获得资源文件就需要得到一个resources对象,要获得插件的资源文件,就需要得到一个插件的resource对象,而assetmanager.java中包含一个私有方法addassetpath。因此,只需要将apk的路径作为参数传入,就可以获得对应的assetsmanager对象,从而创建一个resources对象,然后就可以从resource对象中访问apk中的资源了。

具体的,导入该插件安装包的路径,获得该插件安装包的资源信息时,将插件的路径作为参数传入,就获得assetmanager对象,可以采用如下程序代码:

具体的,获得插件的resources,可采用如下程序代码:

这样,就可以通过资源名字/类型/插件包名获取资源并加载了。

在一个可行的方案中,从服务器下载应用程序app的插件安装包之前,该方法还包括:

向该服务器发起请求,该请求包括本地该app的版本信息和插件安装包的版本信息;

当该服务器存在对应的插件安装包时,下载该插件安装包。

实际应用中,宿主应用apk启动时,会向服务器查询是否有存在pluginapk,如果存在则下载,为了让服务器端区分是哪个app请求下载pluginapk,并且确定是否下发最新的pluginapk,客户端app需要将自己的app的版本信息和pluginapk的版本信息上报给服务器,数据定义可参阅表1:

表1

实际应用中,下载完成后,需要确保pluginapk的有效性,未被篡改也未被伪造,可以在pluginapk通过安全性检测后,再进行加载。

在一个可行的方案中,加载该插件安装包之后,该方法还包括:

向该服务器上报该插件安装包的功能扩展状态。

实际应用中,本实施例也可应用于大团队功能的协作开发,当有新功能的扩展时,不需要各个团队全部开发完毕才发布app,只需要各个团队将自己的插件apk开发完毕后,由宿主应用apk来动态加载。此方案满足了无需升级app快速扩展app功能的需求,具有较高实用价值,提高了用户体验。

本实施例的插件加载方法,在下载了插件安装后,为下载的插件安装包构建一个完全独立于本地宿主应用apk的类加载器,即使不同的插件使用了同一个库的不同版本,插件之间也互不影响,因此无需升级app就能实现快速扩展app功能的目的,提升了用户体验。

在前述实施例的基础上,本发明实施例二提供了一种插件加载装置,适用于客户端,请参阅图7,该插件加载装置包括:存储器701、处理器702以及存储在该存储器701上并可在该处理器702上运行的计算机程序,该计算机程序被该处理器执行时实现如第一实施例所述的方法的步骤,包括:

a、从服务器下载应用程序app的插件安装包;

b、为该插件安装包构建类加载器,该类加载器与已存在的类加载器相互独立,该已存在的类加载器包括本地宿主应用apk(host)的类加载器和/或其他已下载的插件安装包的类加载器;

c、加载该插件安装包。

实际应用中,为了实现对pluginapk的动态加载,需要解决类的加载和资源的加载的问题。因此本实施例中,为每个pluginapk构建独立的类加载器classloader和资源加载器。

在一个可行的方案中,该计算机程序被该处理器执行步骤b时,还实现如下步骤:

指定该插件安装包的路径并构建loadapk对象,该loadapk对象中包含该类加载器;

将该loadapk对象插入到与该app对应的系统程序中。

实际应用中,通过dexclassloader加载插件的代码,需要传入插件apk的路径dexclassloader(dex文件路径列表dexpath,dexoutputpath,mnativelibdir,mcontext.getclassloader())。

在加载与app对应的系统应用程序的组件activity的时候,有一个很重要的类:loadedapk.java,这个类是负责加载一个apk程序,其内部包含一个classloader成员变量,用来加载.class文件。同时还有一个类主线程activitythread.java,activitythread里面有个静态的成员变量scurrentactivitythread,同时还需要一个arraymap存放apk包名和loadedapk映射关系的数据结构,个类加载器之间的数据结构如图4所示。

因此,本实施例中,首先指定插件apk路径构建loadapk对象,构建结果如图5所示,在loadapk对象中,包含了上述信息内容。

再通过钩子hook技术将插件的loadapk对象插入到activitythread中,得到如图6所示的结构。从图6可以看出,各个loadapk对象的classsloader可以不相同,既相互独立。

这样,就可以通过hook为插件构造一个完全独立于host的classsloader,每一个插件都有一个自己的classloader,因此类的隔离性非常好,如果不同的插件使用了同一个库的不同版本,它们相安无事,可以完成代码的热加载。

在一个可行的方案中,该计算机程序被该处理器执行步骤c时,还实现如下步骤:

导入该插件安装包的路径,获得该插件安装包的资源信息;

根据该资源信息运行该插件。

实际应用中,为了获得资源文件就需要得到一个resources对象,要获得插件的资源文件,就需要得到一个插件的resource对象,而assetmanager.java中包含一个私有方法addassetpath。因此,只需要将apk的路径作为参数传入,就可以获得对应的assetsmanager对象,从而创建一个resources对象,然后就可以从resource对象中访问apk中的资源了。

具体的,导入该插件安装包的路径,获得该插件安装包的资源信息时,将插件的路径作为参数传入,就获得assetmanager对象,然后就可以通过资源名字/类型/插件包名获取资源并加载了。

在一个可行的方案中,在执行步骤a之前,该处理器还用于执行该计算机程序,以实现以下步骤:

向该服务器发起请求,该请求包括本地该app的版本信息和插件安装包的版本信息;

当该服务器存在对应的插件安装包时,下载该插件安装包。

实际应用中,宿主应用apk启动时,会向服务器查询是否有存在pluginapk,如果存在则下载,为了让服务器端区分是哪个app请求下载pluginapk,并且确定是否下发最新的pluginapk,客户端app需要将自己的app的版本信息和pluginapk的版本信息上报给服务器,数据定义可参阅表1。

实际应用中,下载完成后,需要确保pluginapk的有效性,未被篡改也未被伪造,可以在pluginapk通过安全性检测后,再进行加载。

在一个可行的方案中,在执行步骤c之后,该处理器还用于执行该计算机程序,以实现以下步骤:

向该服务器上报该插件安装包的功能扩展状态。

实际应用中,本实施例也可应用于大团队功能的协作开发,当有新功能的扩展时,不需要各个团队全部开发完毕才发布app,只需要各个团队将自己的插件apk开发完毕后,由宿主应用apk来动态加载。此方案满足了无需升级app快速扩展app功能的需求,具有较高实用价值,提高了用户体验。

本实施例的插件加载方法,在下载了插件安装后,为下载的插件安装包构建一个完全独立于本地宿主应用apk的类加载器,即使不同的插件使用了同一个库的不同版本,插件之间也互不影响,因此无需升级app就能实现快速扩展app功能的目的,提升了用户体验。

在前述实施例的基础上,本发明实施例三提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器执行时实现如实施例一的插件加载方法的步骤。

需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。

上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,这些均属于本发明的保护之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1