动态加载和调用程序的方法及装置制造方法

文档序号:6515699阅读:199来源:国知局
动态加载和调用程序的方法及装置制造方法
【专利摘要】本发明公开了一种动态加载和调用程序的方法及装置。其中方法包括:由主系统发起对调用程序的调用请求;所述调用程序加载被调用程序生成相关句柄及文件,并得到所述调用程序的实例;所述调用程序将所述调用程序的实例赋值给所述被调用程序的实例;由所述调用程序发起对所述被调用程序的调用请求;由所述主系统根据程序的生命周期调用所述调用程序对应的方法,由所述调用程序根据程序的生命周期调用所述被调用程序对应的方法。利用本发明提供的方案,只需下载程序包即可加载和调用,简化了用户使用程序的方式。
【专利说明】动态加载和调用程序的方法及装置
【技术领域】
[0001]本发明涉及插件处理【技术领域】,具体涉及一种动态加载和调用程序的方法及装置。
【背景技术】
[0002]类加载器(class loader)是Java?中的一个很重要的概念。类加载器负责加载Java类的字节代码到Java虚拟机(Virtual Machine)中。同时,类加载器是Java语言的一个创新,也是Java语言流行的重要原因之一。它使得Java类可以被动态加载到Java虚拟机中并执行。类加载器从JDK1.0就出现了,最初是为了满足在Web容器和OSGI中得到了广泛的使用。
[0003]Java虚拟机使用Java类的方式如下:Java源程序(.java文件)在经过Java编译器编译之后被转换成Java字节代码(.class文件)。类加载器负责读取Java字节代码,并转换成java.lang.Class类的一个实例。每个这样的实例用来表示一个Java类。通过此实例的newlnstance()方法就可以创建出该类的一个对象。
[0004]Java中的类加载器大致分为两类,一类是系统提供的,另一类是由Java应用开发人员编写的。系统提供的类加载器主要有下面三个:
[0005]?引导加载器(Bootstrap class loader):用来加载Java核心库,它是由原生代码来实现的,并不继承于Java.lang.ClassLoader0
[0006]?扩展加载器(Extensions class loader):用来加载 Java 扩展库。Java VM 的实现会提供一个扩展库目录。该类加载器在此目录中查找并加载相关的Java类。
[0007]?系统加载器(System class loader):根据设定的环境变量来加载Java类。Java应用的类都是由它完成加载的。
[0008]除了系统提供的类加载器以外,开发人员可以通过继承java.lang.ClassLoader类的方式实现自己的类加载器,以满足特殊的需求。
[0009]以在智能手机的安卓(Android)平台上加载APK (Android Package)格式的程序包为例。在加载APK之前,系统必须先安装APK,具体安装过程包括:首先要把该APK下载到本地,然后调用系统安装程序,用户逐步确认后系统复制该APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik_cache目录下,并在data/data目录下创建对应的应用数据目录。上述安装APK的步骤繁琐复杂,用户需要反复点击和确认后才能实现APK的加载,不利于APK的推广。

【发明内容】

[0010]鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的动态加载和调用程序的方法和相应的动态加载和调用程序的装置。
[0011]根据本发明的一个方面,提供了一种动态加载和调用程序的方法,其包括:由主系统发起对调用程序的调用请求;所述调用程序加载被调用程序生成相关句柄及文件,并得到所述调用程序的实例;所述调用程序将所述调用程序的实例赋值给所述被调用程序的实例;由所述调用程序发起对所述被调用程序的调用请求;由所述主系统根据程序的生命周期调用所述调用程序对应的方法,由所述调用程序根据程序的生命周期调用所述被调用程序对应的方法。
[0012]根据本发明的另一方面,提供了一种动态加载和调用程序的装置,其包括:主系统、调用程序运行模块以及被调用程序运行模块;其中,所述主系统包括:第一调用请求发起单元和第一调用单元;所述调用程序运行模块包括:加载单元、赋值单元、第二调用请求发起单元以及第二调用单元;
[0013]所述第一调用请求发起单元适于发起对调用程序的调用请求;所述加载单元适于加载被调用程序生成相关句柄及文件,并得到所述调用程序的实例;所述赋值单元适于将所述调用程序的实例赋值给所述被调用程序的实例;所述第二调用请求发起单元适于发起对所述被调用程序的调用请求;所述第一调用单元适于根据程序的生命周期调用所述调用程序对应的方法;所述第二调用单元适于根据程序的生命周期调用所述被调用程序对应的方法。
[0014]根据本发明提供的动态加载和调用程序的方法及装置,主系统利用调用程序作为媒介实现对被调用程序的加载和调用,具体地,在主系统发起对调用程序的调用请求之后,调用程序加载被调用程序;在加载过程中,将调用程序的实例赋值给被调用程序的实例;之后调用程序能够发起对被调用程序的调用请求;进而通过主系统调用调用程序对应的方法,调用程序调用被调用程序对应的方法,实现了被调用程序的加载和调用。利用本发明提供的方案,跳过上述繁琐复杂的安装步骤,只需下载程序包即可加载和调用。
[0015]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的【具体实施方式】。
【专利附图】

【附图说明】
[0016]通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0017]图1示出了根据本发明一个实施例的动态加载和调用程序的方法的流程图;
[0018]图2示出了本发明实施例一个应用场景的方法流程图;
[0019]图3示出了本发明实施例的调用程序的抽象父类的定义示意图;
[0020]图4示出了本发明实施例的APK包(插件)的抽象父类的定义示意图;
[0021]图5示出了本发明实施例中调用程序以插件形式调用APK包的生命周期时序图;
[0022]图6示出了本发明实施例中调用程序以插件形式调用APK资源加载时序图;
[0023]图7示出了根据本发明一个实施例的动态加载和调用程序的装置的结构框图。
【具体实施方式】
[0024]下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0025]为了解决现有技术中在加载和调用程序包之前必须先安装程序包的技术问题,本发明提供了一种动态加载和调用程序的方法,跳过上述繁琐复杂的安装步骤,通过相应的机制只需下载程序包即可加载和调用。图1示出了根据本发明一个实施例的动态加载和调用程序的方法的流程图。如图1所示,本实施例包括如下步骤:
[0026]步骤S101,由主系统发起对调用程序的调用请求。
[0027]其中,主系统指的是系统平台,例如手机平台;调用程序可以为已安装的用于调用插件的应用,例如手机卫士等软件都可以作为调用程序。由于调用程序为已安装的应用,所以在主系统的Manifest, xml中已经注册过,因此主系统可以先发起对调用程序的调用请求。
[0028]步骤S102,调用程序加载被调用程序生成相关句柄及文件,并得到调用程序的实例。
[0029]调用程序使用Java中的类加载器加载被调用程序,在加载过程中会在相应的目录下生成句柄及文件,并得到加载后的对象以及调用程序的实例。
[0030]步骤S103,调用程序将调用程序的实例赋值给被调用程序的实例。
[0031]调用程序将上述调用程序的实例赋值给被调用程序的实例,以调用者的实例作为被调用者的实例。
[0032]步骤S104,由调用程序发起对被调用程序的调用请求。
[0033]在将调用程序的实例赋值给被调用程序的实例之后,调用程序通过invoke方法发起对被调用程序的调用请求。
[0034]步骤S105,由主系统根据程序的生命周期调用调用程序对应的方法,由调用程序根据程序的生命周期调用被调用程序对应的方法。
[0035]根据本实施例提供的动态加载和调用程序的方法,主系统利用调用程序作为媒介实现对被调用程序的加载和调用,具体地,在主系统发起对调用程序的调用请求之后,调用程序加载被调用程序;在加载过程中,将调用程序的实例赋值给被调用程序的实例;之后调用程序能够发起对被调用程序的调用请求;进而通过主系统调用调用程序对应的方法,调用程序调用被调用程序对应的方法,实现了被调用程序的加载和调用。利用本实施例提供的方法,跳过上述繁琐复杂的安装步骤,只需下载程序包即可加载和调用。
[0036]下面以本发明提供的方法应用于智能手机的安卓平台上加载和调用APK程序包的场景为例,进一步的详述本发明的技术方案。在以下实施例中,被调用程序为未安装的APK包,也可称为APK插件。
[0037]图2示出了本发明实施例一个应用场景的方法流程图。该应用场景是在Android平台上通过对系统运行过程的模拟和优化,实现动态加载APK包及其所有逻辑和资源,动态调用该APK包中的组件(Activity)和服务(Services)等,如此便可实现Android平台的插件化编程。
[0038]如图2所示,该方法包括步骤:
[0039]步骤S201,启动软件,该软件为用于调用插件的调用程序,例如手机卫士等软件。
[0040]步骤S202,收集Android系统平台的信息,包括Android的版本、终端厂商信息、终端型号等。
[0041]由于Android系统的开放性,各家终端厂商所使用的系统基本都经过了 二次开发,使得市场上的Android终端比较繁杂,收集这些信息的意义在于能够准确地获取与其适配的APK包。
[0042]步骤S203,在收集完相关信息后,将这些信息传至云端服务器,由云端服务器返回适配结果。
[0043]这样做的目的是为了使适配规则更加准确、灵活。在云端服务器返回的适配结果集里面会包含APK包的URL地址。
[0044]步骤S204,根据APK包的URL地址下载APK包。
[0045]步骤S205,对下载得到的APK包进行合法性鉴权。
[0046]为了避免APK包被非法篡改,或者在网络传输过程中数据出错,需要对APK包进行合法性鉴权。具体步骤包括:提取APK包的包信息(PackageInfo);根据PackageInfo获取签名(Signature)对象;取得Signature的MD5值;比较其MD5值与合法签名是否一致,如一致,则鉴权通过,继续下面步骤;如不一致,则鉴权错误,返回错误信息,停止加载。
[0047]步骤S206,动态加载和调用APK包。
[0048]为了方便调用APK包提供的功能,规避过多的使用反射机制,本发明将调用APK包提供的功能抽象为两个抽象父类。其中调用程序的抽象父类为CallPluginActivity,APK 包的抽象父类为 PluginActivity。CallPluginActivity 和 PluginActivity 均为抽象类,需要子类实现其相应的方法,因此本文后续描述的CallPluginActivity均也代表CallPluginActivity 的实现类,PluginActivity 均也代表 PluginActivity 的实现类,后面将不再赘述。
[0049]本实施例中,调用程序为已经安装的用于调用插件的应用。APK包(插件)为已经下载,可以作为插件调用,也可以和普通APK —样正常安装的Android应用。
[0050]调用程序的抽象父类CallPluginActivity主要是为了向APK包(插件)中的PluginActivity提供实例,即上下文Context,并完成APK包的合法性鉴权和通过反射机制加载APK包(插件)。在本发明实施例的一个例子中,调用程序的抽象父类的定义如图
3所示。其中,onCreateO方法由Android系统调用,用于发起对调用程序的调用请求。checkApkO方法用于对APK包进行合法性鉴权。LoadAPKO方法用于判断是否需要加载APK并生成DexClassLoader和PackageInfo等句柄及文件,并通过反射方法得到对应的PluginActivity 实例(变量名为:pluginActivity)。getOtherResources O 方法用于通过反射方法加载APK包的资源并生成Resources句柄(变量名为:pluginRes)。为了实现对应的功能,需要在子类中重写父类定义的如下方法:
[0051]重写以下方法替换当前CallPluginActivity的资源、样式为APK包中的资源、样式:
[0052]
@Override
[0053]
【权利要求】
1.一种动态加载和调用程序的方法,其包括: 由主系统发起对调用程序的调用请求; 所述调用程序加载被调用程序生成相关句柄及文件,并得到所述调用程序的实例; 所述调用程序将所述调用程序的实例赋值给所述被调用程序的实例; 由所述调用程序发起对所述被调用程序的调用请求; 由所述主系统根据程序的生命周期调用所述调用程序对应的方法,由所述调用程序根据程序的生命周期调用所述被调用程序对应的方法。
2.根据权利要求1所述的方法,其中,所述调用程序为已安装的用于调用插件的应用,所述被调用程序为未安装的APK插件。
3.根据权利要求1或2所述的方法,其中,所述调用程序通过判断所述调用程序的实例不为空来确定成功加载所述被调用程序。
4.根据权利要求3所述的方法,其中,所述被调用程序通过判断所述被调用程序的实例不为空来确定所述被调用程序以插件的形式被调用。
5.根据权利要求1-4任一项所述的方法,其中,所述由所述主系统根据程序的生命周期调用所述调用程序对应的方法,由所述调用程序根据程序的生命周期调用所述被调用程序对应的方法进一步包括: 由主系统根据程序的生命周期或者调用程序自身调用所述调用程序中的资源加载方法,加载所述调用程序或所述被调用程序的资源; 由所述调用程序根据程`序的生命周期调用所述被调用程序中的资源加载方法,加载所述被调用程序的资源。
6.根据权利要求1-4任一项所述的方法,其中,所述由所述主系统根据程序的生命周期调用所述调用程序对应的方法,由所述调用程序根据程序的生命周期调用所述被调用程序对应的方法进一步包括: 由主系统通过所述调用程序反射调用所述被调用程序中的组件和服务对应的方法;由主系统调用所述调用程序中的除了上述组件和服务以外的其他组件和服务对应的方法; 由所述调用程序调用所述调用程序和所述被调用程序中均不存在的组件和服务对应的方法。
7.根据权利要求1-6任一项所述的方法,其中,在所述调用程序加载被调用程序生成相关句柄及文件之前进一步包括:对所述被调用程序进行合法性鉴权。
8.一种动态加载和调用程序的装置,其包括:主系统、调用程序运行模块以及被调用程序运行模块;其中,所述主系统包括:第一调用请求发起单元和第一调用单元;所述调用程序运行模块包括:加载单元、赋值单元、第二调用请求发起单元以及第二调用单元; 所述第一调用请求发起单元适于发起对调用程序的调用请求; 所述加载单元适于加载被调用程序生成相关句柄及文件,并得到所述调用程序的实例; 所述赋值单元适于将所述调用程序的实例赋值给所述被调用程序的实例; 所述第二调用请求发起单元适于发起对所述被调用程序的调用请求; 所述第一调用单元适于根据程序的生命周期调用所述调用程序对应的方法;所述第二调用单元适于根据程序的生命周期调用所述被调用程序对应的方法。
9.根据权利要求8所述的装置,其中,所述调用程序运行模块为已安装的用于调用插件的应用,所述被调用程序运行模块为未安装的APK插件。
10.根据权利要求8或9所述的装置,其中,所述调用程序运行模块适于通过判断所述调用程序的实例不为空来确`定成功加载所述被调用程序。
【文档编号】G06F9/445GK103530156SQ201310487438
【公开日】2014年1月22日 申请日期:2013年10月17日 优先权日:2013年10月17日
【发明者】荣涛 申请人:北京奇虎科技有限公司, 奇智软件(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1