插件加载方法及装置的制造方法

文档序号:10724656阅读:165来源:国知局
插件加载方法及装置的制造方法
【专利摘要】本发明提供了一种插件加载方法及装置。该方法包括:将插件加载事件拆分为独立的至少一个加载阶段,其中,各个加载阶段对应不同的插件内容;当接收到插件加载的请求时,确定所述请求对应的目标加载阶段;加载所述目标加载阶段对应的插件内容。本发明实施例通过对插件的加载做分阶段处理,能够实现按需加载,即只需加载目标加载阶段的那部分插件内容,其余的均无需加载,可以节省大量无用内容的加载时间,减小内存占用。
【专利说明】
插件加载方法及装置
技术领域
[0001 ]本发明涉及计算机处理技术领域,特别是一种插件加载方法及装置。
【背景技术】
[0002] 在软件开发中,为了方便对软件进行功能扩展,可以采用插件方式进行开发,将软 件所要实现的一个一个功能封装在插件中,最后将各个插件集成在软件主程序包中一同发 布。
[0003] 相关技术中,在加载插件时,需要加载插件的所有内容,即使获取插件部分信息, 也需要将所有内容加载进来,对性能、内存占用等影响较大,亟待解决这一技术问题。

【发明内容】

[0004] 鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上 述问题的插件加载方法及相应的装置。
[0005] 依据本发明的一方面,提供了一种插件加载方法,包括:
[0006] 将插件加载事件拆分为独立的至少一个加载阶段,其中,各个加载阶段对应不同 的插件内容;
[0007] 当接收到插件加载的请求时,确定所述请求对应的目标加载阶段;
[0008] 加载所述目标加载阶段对应的插件内容。
[0009] 可选地,所述至少一个加载阶段包括下列至少之一:
[0010] 插件信息的获取、插件资源的加载、插件代码的加载。
[0011] 可选地,当所述目标加载阶段为插件信息的获取时,加载所述目标加载阶段对应 的插件内容,包括:
[0012] 在第一缓存中查找所述目标加载阶段对应的插件信息;
[0013] 若查找到,则从所述第一缓存中获取所述插件信息。
[0014] 可选地,在第一缓存中查找所述目标加载阶段对应的插件信息,包括:
[0015] 在第一缓存中获取Packagelnfo对象,查找是否存在所述目标加载阶段对应的插 件信息。
[0016] 可选地,所述方法还包括:
[0017] 在第一缓存中查找所述目标加载阶段对应的插件信息时,若未查找到,则从插件 安装包处获取所述插件信息。
[0018] 可选地,从插件安装包处获取所述插件信息,包括:
[0019] 调用PackageManager .getPackageArchivelnfo方法,等待操作系统生成并返回给 Packagelnfo对象,其中,所述方法中包括用于获取所述插件信息的参数;
[0020] 从返回的所述Package Info对象中获取所述插件信息。
[0021] 可选地,所述方法还包括:
[0022] 修改所述Package Info对象中安装包和/或资源的路径。
[0023] 可选地,所述方法还包括:
[0024]将修改后的所述Packagelnfo对象缓存至所述第一缓存。
[0025]可选地,将修改后的所述Packagelnfo对象缓存至所述第一缓存,包括:
[0026] 新建 ComponentList 对象;
[0027] 利用所述ComponentLi s t对象缓存修改后的所述Package Inf 〇对象。
[0028] 可选地,修改后的所述Packagelnfo对象包括下列至少之一:
[0029] Activity 组件、Service 组件、Provider 组件、Receiver 组件;
[0030] Applicationlnfo 对象;
[0031 ] metaData 字段。
[0032] 可选地,当所述目标加载阶段为插件资源的加载时,加载所述目标加载阶段对应 的插件内容,包括:
[0033] 在第二缓存中查找所述目标加载阶段对应的插件资源;
[0034] 若查找到,则从所述第二缓存中加载所述插件资源。
[0035] 可选地,在第二缓存中查找所述目标加载阶段对应的插件资源,包括:
[0036]在第二缓存中获取Resources对象,查找是否存在所述目标加载阶段对应的插件 资源。
[0037] 可选地,所述方法还包括:
[0038]若在第二缓存中查找所述目标加载阶段对应的插件资源时,若未查找到,则从 ?已。1<386]\^11&861'.86七1^80111^6 8卩0^口口1;^&1:;[011方法中获取1^80111^68对象,其中,所述方 法中包括 mPackage Info · app 1 i cat i on Info 参数;
[0039] 从所述Resources对象中加载所述插件资源。
[0040] 可选地,当所述目标加载阶段为插件代码的加载时,加载所述目标加载阶段对应 的插件内容,包括:
[0041] 在第三缓存中查找所述目标加载阶段对应的插件代码;
[0042] 若查找到,则从所述第三缓存中获取所述插件代码。
[0043]可选地,在第三缓存中查找所述目标加载阶段对应的插件代码,包括:
[0044] 在第三缓存中获取DexClassLoader对象,查找是否存在所述目标加载阶段对应的 插件代码。
[0045] 可选地,所述方法还包括:
[0046] 若在第三缓存中查找所述目标加载阶段对应的插件代码时,若未查找到,则创建 并缓存DexClassLoader对象;
[0047] 利用所述DexClassLoader对象,加载所述目标加载阶段对应的插件代码。
[0048] 可选地,所述DexClassLoader对象的第一个参数是安装包的路径,第二个参数是 Dex优化后文件的存放位置,第三个参数是指向ClassLoader的父类加载器。
[0049] 可选地,所述方法还包括:
[0050] 若在第三缓存中查找所述目标加载阶段对应的插件代码时,若未查找到,则创建 并缓存PluginContext对象;
[0051]利用所述PluginContext对象,加载所述目标加载阶段对应的插件代码。
[0052] 可选地,所述PluginContext对象的第一个参数为主程序的Context对象,第二个 参数是插件默认主题,第三个参数是插件的ClassLoader,第四个参数是插件的资源对象, 第五个参数是插件名。
[0053]依据本发明的另一方面,还提供了一种插件加载装置,包括:
[0054] 拆分模块,适于将插件加载事件拆分为独立的至少一个加载阶段,其中,各个加载 阶段对应不同的插件内容;
[0055] 确定模块,适于当接收到插件加载的请求时,确定所述请求对应的目标加载阶段;
[0056] 加载模块,适于加载所述目标加载阶段对应的插件内容。
[0057] 可选地,所述至少一个加载阶段包括下列至少之一:
[0058]插件信息的获取、插件资源的加载、插件代码的加载。
[0059] 可选地,所述加载模块还适于:
[0060] 当所述目标加载阶段为插件信息的获取时,在第一缓存中查找所述目标加载阶段 对应的插件信息;
[0061] 若查找到,则从所述第一缓存中获取所述插件信息。
[0062] 可选地,所述加载模块还适于:
[0063]在第一缓存中获取Packagelnfo对象,查找是否存在所述目标加载阶段对应的插 件信息。
[0064] 可选地,所述加载模块还适于:
[0065]在第一缓存中查找所述目标加载阶段对应的插件信息时,若未查找到,则从插件 安装包处获取所述插件信息。
[0066] 可选地,所述加载模块还适于:
[0067] 调用PackageManager .getPackageArchivelnfo方法,等待操作系统生成并返回给 Packagelnfo对象,其中,所述方法中包括用于获取所述插件信息的参数;
[0068] 从返回的所述Package Inf 〇对象中获取所述插件信息。
[0069] 可选地,所述装置还包括:
[0070] 修改模块,适于修改所述Package Info对象中安装包和/或资源的路径。
[0071] 可选地,所述装置还包括:
[0072]缓存模块,适于将修改后的所述Packagelnfo对象缓存至所述第一缓存。
[0073] 可选地,所述缓存模块还适于:
[0074] 新建 ComponentList 对象;
[0075] 利用所述ComponentList对象缓存修改后的所述Package Info对象。
[0076] 可选地,修改后的所述Package Info对象包括下列至少之一:
[0077] Activity 组件、Service 组件、Provider 组件、Receiver 组件;
[0078] Applicationlnfo 对象;
[0079] metaData 字段。
[0080] 可选地,所述加载模块还适于:
[0081 ]当所述目标加载阶段为插件资源的加载时,在第二缓存中查找所述目标加载阶段 对应的插件资源;
[0082]若查找到,则从所述第二缓存中加载所述插件资源。
[0083] 可选地,所述加载模块还适于:
[0084]在第二缓存中获取Resources对象,查找是否存在所述目标加载阶段对应的插件 资源。
[0085] 可选地,所述加载模块还适于:
[0086]若在第二缓存中查找所述目标加载阶段对应的插件资源时,若未查找到,则从 ?已。1<386]\^11&861'.86七1^80111^6 8卩0^口口1;^&1:;[011方法中获取1^80111^68对象,其中,所述方 法中包括 mPackage Info · app 1 i cat i on Info 参数;
[0087] 从所述Resources对象中加载所述插件资源。
[0088] 可选地,所述加载模块还适于:
[0089] 当所述目标加载阶段为插件代码的加载时,在第三缓存中查找所述目标加载阶段 对应的插件代码;
[0090] 若查找到,则从所述第三缓存中获取所述插件代码。
[0091] 可选地,所述加载模块还适于:
[0092]在第三缓存中获取DexClassLoader对象,查找是否存在所述目标加载阶段对应的 插件代码。
[0093] 可选地,所述加载模块还适于:
[0094]若在第三缓存中查找所述目标加载阶段对应的插件代码时,若未查找到,则创建 并缓存DexClassLoader对象;
[0095] 利用所述DexClassLoader对象,加载所述目标加载阶段对应的插件代码。
[0096] 可选地,所述DexClassLoader对象的第一个参数是安装包的路径,第二个参数是 Dex优化后文件的存放位置,第三个参数是指向ClassLoader的父类加载器。
[0097]可选地,所述加载模块还适于:
[0098]若在第三缓存中查找所述目标加载阶段对应的插件代码时,若未查找到,则创建 并缓存PluginContext对象;
[0099]利用所述PluginContext对象,加载所述目标加载阶段对应的插件代码。
[0100] 可选地,所述PluginContext对象的第一个参数为主程序的Context对象,第二个 参数是插件默认主题,第三个参数是插件的ClassLoader,第四个参数是插件的资源对象, 第五个参数是插件名。
[0101]在本发明实施例中,将插件加载事件拆分为独立的至少一个加载阶段,且各个加 载阶段对应不同的插件内容;当接收到插件加载的请求时,确定请求对应的目标加载阶段, 随后加载目标加载阶段对应的插件内容。由此可见,本发明实施例通过对插件的加载做分 阶段处理,能够实现按需加载,即只需加载目标加载阶段的那部分插件内容,其余的均无需 加载,可以节省大量无用内容的加载时间,减小内存占用。
[0102]进一步地,本发明实施例还对各个加载阶段的插件内容做了缓存处理,在下一次 加载插件内容时,可以首先从缓存中获取插件内容,提高加载效率。
[0103]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段, 而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够 更明显易懂,以下特举本发明的【具体实施方式】。
[0104]根据下文结合附图对本发明具体实施例的详细描述,本领域技术人员将会更加明 了本发明的上述以及其他目的、优点和特征。
【附图说明】
[0105] 通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通 技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明 的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0106] 图1示出了根据本发明一个实施例的插件加载方法的流程图;
[0107] 图2示出了根据本发明另一个实施例的插件加载方法的流程图;
[0108] 图3示出了根据本发明又一个实施例的插件加载方法的流程图;
[0109] 图4示出了根据本发明再一个实施例的插件加载方法的流程图;
[0110] 图5示出了根据本发明一个实施例的插件加载装置的结构示意图;以及
[0111] 图6示出了根据本发明另一个实施例的插件加载装置的结构示意图。
【具体实施方式】
[0112] 下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开 的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例 所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围 完整的传达给本领域的技术人员。
[0113] 为解决上述技术问题,本发明提供了一种插件加载方法,该方法可以应用在手机 卫士等产品的插件加载中。图1示出了根据本发明一个实施例的插件加载方法的流程图。如 图1所示,该方法至少包括以下步骤S102至步骤S106:
[0114]步骤S102,将插件加载事件拆分为独立的至少一个加载阶段,其中,各个加载阶段 对应不同的插件内容;
[0115]步骤S104,当接收到插件加载的请求时,确定该请求对应的目标加载阶段;
[0116]步骤S106,加载目标加载阶段对应的插件内容。
[0117]在本发明实施例中,将插件加载事件拆分为独立的至少一个加载阶段,且各个加 载阶段对应不同的插件内容;当接收到插件加载的请求时,确定请求对应的目标加载阶段, 随后加载目标加载阶段对应的插件内容。由此可见,本发明实施例通过对插件的加载做分 阶段处理,能够实现按需加载,即只需加载目标加载阶段的那部分插件内容,其余的均无需 加载,可以节省大量无用内容的加载时间,减小内存占用。
[0118]上文步骤S102中提及的至少一个加载阶段可以包括插件信息的获取(即Info)、插 件资源的加载(即Res)、插件代码的加载(即Dex)。在实际应用中,Info是最小单元,若要加 载Res,则必须先加载Info;若要加载Dex,则必须先依次加载Info和Res。举例来说,外界调 用load进行插件加载,TYPE表示要加载到哪个阶段(Info、Res和Dex)。同时调用loadlnfo先 进行Info的加载。loadlnfo成功且TYPE为Info,表示只为加载Info,返回;loadRes成功且 TYPE为Res,表示只为加载Inf〇和Res,返回;loadDex成功且TYPE为Dex,表示需全部加载,直 接返回。
[0119] 在上文步骤S104中,目标加载阶段不同,步骤S106中加载目标加载阶段对应的插 件内容的方式也有所不同,下面将分别进行详细介绍。
[0120] 情况一,当目标加载阶段为插件信息的获取时,步骤S106中加载目标加载阶段对 应的插件内容可以实施为:在第一缓存中查找目标加载阶段对应的插件信息,若查找到,则 从第一缓存中获取插件信息;若未查找到,则从插件安装包处获取所述插件信息。
[0121] 具体地,在第一缓存中查找目标加载阶段对应的插件信息时,可以在第一缓存中 获取Packagelnfo对象,查找是否存在目标加载阶段对应的插件信息。例如,在第一缓存 sMap中获取Package Info对象,查找是否存在,若存在,才去尝试加载Info,即,r = sMap. get (mPath);若不存在,则从插件安装包处获取插件信息。
[0122] 在本发明一可选的实施例中,在从插件安装包处获取插件信息时,可以调用 PackageManager · getPackageArchive Info 方法,等待操作系统生成并返回给Package Info 对象,其中,该方法中包括用于获取插件信息的参数;进而从返回的Package Info对象中获 取插件信息。具体地,调用上述方法,等待操作系统生成并返回给Packagelnfo对象的代码 如下:
[0123] //Packagelnfo
[0124] mPackageInfo = pm.getPackageArchiveInfo(mPath,
[0125] PackageManager.GET_ACTIVITIES|PackageManager.GET_SERVICES
[0126] PackageManager.GET_PR0VIDERS|PackageManager.GET_RECEIVERS
[0127] PackageManager.GET_META_DATA);
[0128] if (mPackageInfo= =null | |mPackageInfo.applicationInfo= =null) {
[0129] if(PLUGIN_L0GD_ENABLED){
[0130] LogUtils·logDebug(PLUGIN_TAG,"get package archive info null");}
[0131] mPackageInfo = null ;
[0132] return false;}
[0133 ]其中,上述方法中的第一个参数为mPath,可以指定插件Jar包所在位置。第二个参 数用来获取未经过整理的插件相关信息,具体有四大组件和META_DATA,从而可以从 Packagelnfo对象处获取该插件的所有信息。当然,若获取失败,则表示Info的第一个处理 过程就出问题了,直接返回即可。
[0134] 在本发明的可选实施例中,还可以修改Packagelnfo对象中安装包的路径(即 80111^6〇;[1'),或者修改?&01^86111;1^0对象中资源(即口11131;[03011;1^60;[1')的路径,或者修改 Packagelnfo对象中安装包和资源的路径。具体地,可以将Package Info对象中安装包的路 径修改为指定路径,以备后续调取使用。
[0135] 在本发明的可选实施例中,还可以将修改后的Packagelnfo对象缓存至第一缓存, 以备下一次加载时直接从第一缓存中加载插件信息。
[0136]为了提升检索的速度,本发明实施例还可以生成并缓存ComponentList对象。即, 新建ComponentList对象,利用ComponentList对象缓存修改后的Package Info对象。这里, 修改后的Package Info对象可以包括Activity组件、Service组件、Provider组件、Receiver 组件、4口口1;[031:;[011111;1^0对象、1116丨303丨3字段,等等,本发明不限于此。
[0137] 具体地,可以将Activity组件、Service组件、Provider组件、Receiver组件这四个 组件依次加入到各自的表中,其代码如下:
[0140]除了这四个组件外,本发明实施例还可以缓存Applicationlnfo对象,该对象是插 件Androi (Manifest · xml中的〈appli cation〉标签的解析后结果。
[0141 ]此外,本发明实施例还可以缓存metaData字段,并读取其中的信息。例如,在手机 卫士里,可能同时还需要一个"插件框架版本号",则可以将最终结果缓存给 mComponentLis,其代码如下:
[0142] mApplication = pi .applicationlnfo;
[0143] mBundle =mAppl i cat ion .metaData ;
[0144] if (mBundle! =null) {
[0145] mFrameworkVer=mBundle ·getInt(''corn.qihoo360·framework. ver〃,1);}
[0146] 至此,Inf o加载阶段已经完成。
[0147] 情况二,当目标加载阶段为插件资源的加载时,步骤S106中加载目标加载阶段对 应的插件内容可以实施为:在第二缓存中查找目标加载阶段对应的插件资源,若查找到,则 从第二缓存中加载插件资源。
[0148] 具体地,在第二缓存中查找目标加载阶段对应的插件资源时,可以在第二缓存中 获取Resources对象,查找是否存在目标加载阶段对应的插件资源。例如,在第二缓存 sResMap中获取Resources对象,查找是否存在,若存在,才去尝试加载资源Res,即,r = sResMap·get(mPath)〇
[0149] 若在第二缓存中查找目标加载阶段对应的插件资源时,若未查找到,则从 ?已。1<386]\^11&861'.86七1^80111^6 8卩0^口口1;^&1:;[011方法中获取1^80111^68对象,其中,该方法 中包括mPackagelnfo. applicationlnf 0参数,进而从Resources对象中加载插件资源。
[0150] 从 PackageManager · getResourcesForApplication()中获取 Resources 对象,其代 码如下:
[0151] mResources =
[0152] pm.getResourcesForApplication(mPackageInfo.applicationlnfo);
[0153] 其中,第一个参数就是上文提及的情况一的"插件信息的获取"阶段拿到的 111?&〇1^86111;1^0的&。。1;^&1:;[011111;1^0字段。当然,若1111^80111^68拿到的是111111,则表不获取插 件资源失败,则直接返回。
[0154] 情况三,当目标加载阶段为插件代码的加载时,步骤S106中加载目标加载阶段对 应的插件内容可以实施为:在第三缓存中查找目标加载阶段对应的插件代码,若查找到,则 从第三缓存中获取插件代码。
[0155] 具体地,在第三缓存中查找目标加载阶段对应的插件代码时,可以在第三缓存中 获取DexClassLoader对象,查找是否存在目标加载阶段对应的插件代码。
[0156] 在本发明的可选实施例中,若在第三缓存中查找目标加载阶段对应的插件代码 时,若未查找到,则创建并缓存DexClassLoader对象,进而利用该DexClassLoader对象,加 载目标加载阶段对应的插件代码。在新建一个DexClassLoader对象时,操作系统会在新建 阶段读取或构建优化后的Dex文件。这里,DexClassLoader对象的第一个参数是安装包的路 径,第二个参数是Dex优化后文件的存放位置(可以根据需求改变),第三个参数是指向 ClassLoader的父类加载器,通常是BootClassLoader。主要代码如下:
[0157] String out=
[0158] mContext.getDir(Constant.L0CAL_PLUGIN_0DEX_SUB_DIR,0).getPath();
[0159] mClassLoader = new DexClassLoader(mPath,out,
[0160] mPackagelnfo.applicationlnfo.nativeLibraryDir,
[0161] getClass().getClassLoader());
[0162] 通常,这个新建出来的DexClassLoader和主程序的DexClassLoader是"平行类加 载器"关系,他们的父类加载器均为BootClassLoader。
[0163] 在本发明的另一可选实施例中,若在第三缓存中查找目标加载阶段对应的插件代 码时,若未查找到,则创建并缓存PluginContext对象,进而利用该PluginContext对象,加 载目标加载阶段对应的插件代码。
[0164] 具体地,新建一个声明的PluginContext对象,并缓存为mPkgContext。传递的参数 比较多。第一个参数为主程序的Context对象,用来在必要时调用回去;第二个参数是插件 默认主题,第三个参数是插件的ClassLoader,第四个参数是插件的资源对象;第五个参数 是插件名,将这个PluginLoader传递进去,为后面所用。主要代码如下:
[0165] mPkgContext = new PluginContext(mContext,android.R.style.Theme , mClassLoader,mPkgResources,mName, this);
[0166] 至此,插件代码加载已全部完成。
[0167] 以上介绍了图1所示的实施例中各环节的多种实现方式,下面通过几个具体实施 例来详细介绍本发明的插件加载方法的实现过程。在这些实施例中,将插件加载事件拆分 为独立的至少一个加载阶段,即,插件信息的获取Info、插件资源的加载Res以及插件代码 的加载Dex。
[0168] 图2示出了根据本发明另一个实施例的插件加载方法的流程图。如图2所示,该方 法至少包括以下步骤S202至步骤S210。
[0169] 步骤S202,接收插件加载的请求,确定该请求对应的目标加载阶段为插件信息的 获取。
[0170] 步骤S204,在缓存sMap中获取Package Info对象,查找是否存在目标加载阶段对应 的插件信息,若是,则继续执行步骤S206;若否,则继续执行步骤S208。
[0171] 步骤S206,从缓存sMap中加载插件信息。
[0172] 步骤 S208,调用PackageManager · getPackageArchivelnfo 方法,等待操作系统生 成并返回给Packagelnfo对象,其中,该方法中包括用于获取插件信息的参数。
[0173] 在该步骤中,调用上述方法,等待操作系统生成并返回给Packagelnfo对象的代码 可以参见上文介绍,此处不再赘述。
[0174] 步骤S210,从返回的Package Info对象中获取插件信息。
[0175] 在拿到的Packagelnfo对象代表了此插件的所有信息,本发明实施例还可以修改 Package Info对象中安装包的路径(即sourceDir),或者修改Package Info对象中资源(即 publ icSourceDir)的路径,或者修改Packagelnfo对象中安装包和资源的路径。具体地,可 以将Packagelnfo对象中安装包的路径修改为指定路径,以备后续调取使用。
[0176] 此外,本发明实施例还可以将修改后的Packagelnfo对象缓存至第一缓存,以备下 一次加载时直接从第一缓存中加载插件信息。
[0177] 为了提升检索的速度,本发明实施例还可以生成并缓存ComponentLi st对象。即, 新建ComponentList对象,利用ComponentList对象缓存修改后的Package Info对象。这里, 修改后的Package Info对象可以包括Activity组件、Service组件、Provider组件、Receiver 组件、Applicationlnfo对象、metaData字段,等等,本发明不限于此。缓存方式可以参见上 文介绍,此处不再赘述。至此,Info加载阶段已经完成。
[0178] 图3示出了根据本发明又一个实施例的插件加载方法的流程图。如图3所示,该方 法至少包括以下步骤S302至步骤S310。
[0179] 步骤S302,接收插件加载的请求,确定该请求对应的目标加载阶段为插件资源的 加载。
[0180] 步骤S304,在缓存sResMap中获取Resources对象,查找是否存在目标加载阶段对 应的插件资源,若是,则继续执行步骤S306;若否,则继续执行步骤S308。
[0181] 步骤S306,从缓存sResMap中加载插件资源。
[0182] 步骤S308,从PackageManager · getRe sourcesForAppl i cat ion方法中获取 Resources 对象,其中,该方法中包括 mPackage Info · application Info 参数。
[0183] 在该步骤中,从上述方法中获取Resources对象,其代码可以参见上文介绍,此处 不再赘述。
[0184] 步骤S310,从Resources对象中加载插件资源。
[0185] 本发明实施例能够实现增量加载,即之前获取到插件信息,则当外部需要加载插 件资源时,会跳过信息的获取,而直接加载插件资源。
[0186] 图4示出了根据本发明再一个实施例的插件加载方法的流程图。如图4所示,该方 法至少包括以下步骤S402至步骤S410。
[0187]步骤S402,接收插件加载的请求,确定该请求对应的目标加载阶段为插件代码的 加载。
[0188] 步骤S404,在缓存sDexMap中获取DexClassLoader对象,查找是否存在目标加载阶 段对应的插件代码,若是,则继续执行步骤S406;若否,则继续执行步骤S408。
[0189] 步骤S406,从缓存sDexMap中加载插件代码。
[0190] 步骤S408,创建并缓存DexClassLoader对象。
[0?91 ] 步骤S410,利用该DexClassLoader对象,加载目标加载阶段对应的插件代码。
[0192]在该步骤中,新建一个DexClassLoader对象时,操作系统会在新建阶段读取或构 建优化后的Dex文件。这里,DexClassLoader对象的第一个参数是安装包的路径,第二个参 数是Dex优化后文件的存放位置(可以根据需求改变),第三个参数是指向ClassLoader的父 类加载器,通常是BootClassLoader。
[0193] 上文步骤S408和步骤S410还可以实施为:仓ij建并缓存PluginContext对象,进而利 用该PluginContext对象,加载目标加载阶段对应的插件代码。即,新建一个声明的 PluginContext对象,并缓存为mPkgContext。传递的参数比较多。第一个参数为主程序的 Context对象,用来在必要时调用回去;第二个参数是插件默认主题,第三个参数是插件的 ClassLoader,第四个参数是插件的资源对象;第五个参数是插件名,将这个PluginLoader 传递进去,为后面所用。至此,插件代码加载已全部完成。
[0194] 需要说明的是,实际应用中,上述所有可选实施方式可以采用结合的方式任意组 合,形成本发明的可选实施例,在此不再一一赘述。
[0195] 基于同一发明构思,本发明实施例还提供了一种插件加载装置,应用在手机卫士 等产品的插件加载中。图5示出了根据本发明一个实施例的插件加载装置的结构示意图。如 图5所示,该装置至少可以包括:拆分模块510、确定模块520以及加载模块530。
[0196] 现介绍本发明实施例的插件加载装置的各组成或器件的功能以及各部分间的连 接关系:
[0197] 拆分模块510,适于将插件加载事件拆分为独立的至少一个加载阶段,其中,各个 加载阶段对应不同的插件内容;
[0198] 确定模块520,与拆分模块510相親合,适于当接收到插件加载的请求时,确定所述 请求对应的目标加载阶段;
[0199] 加载模块530,与确定模块520相耦合,适于加载所述目标加载阶段对应的插件内 容。
[0200] 在本发明一实施例中,所述至少一个加载阶段包括下列至少之一:
[0201] 插件信息的获取、插件资源的加载、插件代码的加载。
[0202]在本发明一实施例中,上述加载模块530还适于:
[0203] 当所述目标加载阶段为插件信息的获取时,在第一缓存中查找所述目标加载阶段 对应的插件信息;
[0204] 若查找到,则从所述第一缓存中获取所述插件信息。
[0205]在本发明一实施例中,上述加载模块530还适于:
[0206]在第一缓存中获取Packagelnfo对象,查找是否存在所述目标加载阶段对应的插 件信息。
[0207]在本发明一实施例中,上述加载模块530还适于:
[0208]在第一缓存中查找所述目标加载阶段对应的插件信息时,若未查找到,则从插件 安装包处获取所述插件信息。
[0209]在本发明一实施例中,上述加载模块530还适于:
[0210] 调用PackageManager .getPackageArchivelnfo方法,等待操作系统生成并返回给 Packagelnfo对象,其中,所述方法中包括用于获取所述插件信息的参数;
[0211 ]从返回的所述Package Info对象中获取所述插件信息。
[0212] 在本发明一实施例中,如图6所示,上文图5展示的装置还可以包括:
[0213] 修改模块610,与加载模块530相親合,适于修改所述Package Info对象中安装包 和/或资源的路径。
[0214] 在本发明一实施例中,如图6所示,上文图5展示的装置还可以包括:
[0215]缓存模块620,与修改模块610相耦合,适于将修改后的所述Packagelnfo对象缓存 至所述第一缓存。
[0216] 在本发明一实施例中,上述缓存模块620还适于:
[0217] 新建 ComponentList 对象;
[0218] 利用所述ComponentList对象缓存修改后的所述Package Info对象。
[0219] 在本发明一实施例中,修改后的所述Packagelnfo对象包括下列至少之一:
[0220] Activity 组件、Service 组件、Provider 组件、Receiver 组件;
[0221] Applicationlnfo 对象;
[0222] metaData 字段。
[0223] 在本发明一实施例中,上述加载模块530还适于:
[0224] 当所述目标加载阶段为插件资源的加载时,在第二缓存中查找所述目标加载阶段 对应的插件资源;
[0225] 若查找到,则从所述第二缓存中加载所述插件资源。
[0226] 在本发明一实施例中,上述加载模块530还适于:
[0227] 在第二缓存中获取Resources对象,查找是否存在所述目标加载阶段对应的插件 资源。
[0228] 在本发明一实施例中,上述加载模块530还适于:
[0229] 若在第二缓存中查找所述目标加载阶段对应的插件资源时,若未查找到,则从 PackageManager · getResourcesFor Appli cat ion 方法中获取 Re sources对象,其中,所述方 法中包括 mPackage Info · app 1 i cat i on Info 参数;
[0230] 从所述Resources对象中加载所述插件资源。
[0231 ]在本发明一实施例中,上述加载模块530还适于:
[0232] 当所述目标加载阶段为插件代码的加载时,在第三缓存中查找所述目标加载阶段 对应的插件代码;
[0233] 若查找到,则从所述第三缓存中获取所述插件代码。
[0234] 在本发明一实施例中,上述加载模块530还适于:
[0235] 在第三缓存中获取DexClassLoader对象,查找是否存在所述目标加载阶段对应的 插件代码。
[0236] 在本发明一实施例中,上述加载模块530还适于:
[0237] 若在第三缓存中查找所述目标加载阶段对应的插件代码时,若未查找到,则创建 并缓存DexClassLoader对象;
[0238] 利用所述DexClassLoader对象,加载所述目标加载阶段对应的插件代码。
[0239] 在本发明一实施例中,所述DexClassLoader对象的第一个参数是安装包的路径, 第二个参数是Dex优化后文件的存放位置,第三个参数是指向ClassLoader的父类加载器。 [0240]在本发明一实施例中,上述加载模块530还适于:
[0241 ]若在第三缓存中查找所述目标加载阶段对应的插件代码时,若未查找到,则创建 并缓存PluginContext对象;
[0242]利用所述PluginContext对象,加载所述目标加载阶段对应的插件代码。
[0243] 在本发明一实施例中,所述PluginContext对象的第一个参数为主程序的Context 对象,第二个参数是插件默认主题,第三个参数是插件的ClassLoader,第四个参数是插件 的资源对象,第五个参数是插件名。
[0244] 根据上述任意一个优选实施例或多个优选实施例的组合,本发明实施例能够达到 如下有益效果:
[0245] 在本发明实施例中,将插件加载事件拆分为独立的至少一个加载阶段,且各个加 载阶段对应不同的插件内容;当接收到插件加载的请求时,确定请求对应的目标加载阶段, 随后加载目标加载阶段对应的插件内容。由此可见,本发明实施例通过对插件的加载做分 阶段处理,能够实现按需加载,即只需加载目标加载阶段的那部分插件内容,其余的均无需 加载,可以节省大量无用内容的加载时间,减小内存占用。
[0246] 进一步地,本发明实施例还对各个加载阶段的插件内容做了缓存处理,在下一次 加载插件内容时,可以首先从缓存中获取插件内容,提高加载效率。
[0247] 在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施 例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构 和技术,以便不模糊对本说明书的理解。
[0248]类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在 上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施 例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保 护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面 的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此, 遵循【具体实施方式】的权利要求书由此明确地并入该【具体实施方式】,其中每个权利要求本身 都作为本发明的单独实施例。
[0249] 本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地 改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单 元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或 子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何 组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任 何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权 利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代 替。
[0250] 此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例 中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的 范围之内并且形成不同的实施例。例如,在权利要求书中,所要求保护的实施例的任意之一 都可以以任意的组合方式来使用。
[0251] 本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行 的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用 微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的插件加载装置中的一些或 者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部 分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发 明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的 信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
[0252] 应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领 域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中, 不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词"包含"不排除存在未 列在权利要求中的元件或步骤。位于元件之前的单词"一"或"一个"不排除存在多个这样的 元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实 现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项 来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名 称。
[0253] 至此,本领域技术人员应认识到,虽然本文已详尽示出和描述了本发明的多个示 例性实施例,但是,在不脱离本发明精神和范围的情况下,仍可根据本发明公开的内容直接 确定或推导出符合本发明原理的许多其他变型或修改。因此,本发明的范围应被理解和认 定为覆盖了所有这些其他变型或修改。
[0254]本发明实施例的一方面,提供了 A1、一种插件加载方法,包括:
[0255] 将插件加载事件拆分为独立的至少一个加载阶段,其中,各个加载阶段对应不同 的插件内容;
[0256] 当接收到插件加载的请求时,确定所述请求对应的目标加载阶段;
[0257] 加载所述目标加载阶段对应的插件内容。
[0258] A2、根据A1所述的方法,其中,所述至少一个加载阶段包括下列至少之一:
[0259] 插件信息的获取、插件资源的加载、插件代码的加载。
[0260] A3、根据A2所述的方法,其中,当所述目标加载阶段为插件信息的获取时,加载所 述目标加载阶段对应的插件内容,包括:
[0261 ]在第一缓存中查找所述目标加载阶段对应的插件信息;
[0262] 若查找到,则从所述第一缓存中获取所述插件信息。
[0263] A4、根据A3所述的方法,其中,在第一缓存中查找所述目标加载阶段对应的插件信 息,包括:
[0264] 在第一缓存中获取Packagelnfo对象,查找是否存在所述目标加载阶段对应的插 件信息。
[0265] A5、根据A3或A4所述的方法,其中,还包括:
[0266] 在第一缓存中查找所述目标加载阶段对应的插件信息时,若未查找到,则从插件 安装包处获取所述插件信息。
[0267] A6、根据A5所述的方法,其中,从插件安装包处获取所述插件信息,包括:
[0268] 调用PackageManager .getPackageArchivelnfo方法,等待操作系统生成并返回给 Packagelnfo对象,其中,所述方法中包括用于获取所述插件信息的参数;
[0269 ]从返回的所述Package Inf 〇对象中获取所述插件信息。
[0270] A7、根据A6所述的方法,其中,还包括:
[0271 ] 修改所述Packagelnfo对象中安装包和/或资源的路径。
[0272] A8、根据A7所述的方法,其中,还包括:
[0273] 将修改后的所述Packagelnfo对象缓存至所述第一缓存。
[0274] A9、根据A8所述的方法,其中,将修改后的所述Package Info对象缓存至所述第一 缓存,包括:
[0275] 新建 ComponentList 对象;
[0276] 利用所述ComponentList对象缓存修改后的所述Package Info对象。
[0277] A10、根据A9所述的方法,其中,修改后的所述Packagelnfo对象包括下列至少之
[0278] Activity 组件、Service 组件、Provider 组件、Receiver 组件;
[0279] Applicationlnfo 对象;
[0280] metaData 字段。
[0281 ] A11、根据A2所述的方法,其中,当所述目标加载阶段为插件资源的加载时,加载所 述目标加载阶段对应的插件内容,包括:
[0282] 在第二缓存中查找所述目标加载阶段对应的插件资源;
[0283] 若查找到,则从所述第二缓存中加载所述插件资源。
[0284] A12、根据All所述的方法,其中,在第二缓存中查找所述目标加载阶段对应的插件 资源,包括:
[0285] 在第二缓存中获取Resources对象,查找是否存在所述目标加载阶段对应的插件 资源。
[0286] A13、根据All或A12所述的方法,其中,还包括:
[0287] 若在第二缓存中查找所述目标加载阶段对应的插件资源时,若未查找到,则从 PackageManager · getResourcesFor Appli cat ion 方法中获取 Re sources对象,其中,所述方 法中包括 mPackage Info · app 1 i cat i on Info 参数;
[0288] 从所述Resources对象中加载所述插件资源。
[0289] A14、根据A2所述的方法,其中,当所述目标加载阶段为插件代码的加载时,加载所 述目标加载阶段对应的插件内容,包括:
[0290] 在第三缓存中查找所述目标加载阶段对应的插件代码;
[0291] 若查找到,则从所述第三缓存中获取所述插件代码。
[0292] A15、根据A14所述的方法,其中,在第三缓存中查找所述目标加载阶段对应的插件 代码,包括:
[0293]在第三缓存中获取DexClassLoader对象,查找是否存在所述目标加载阶段对应的 插件代码。
[0294] A16、根据A14或A15所述的方法,其中,还包括:
[0295]若在第三缓存中查找所述目标加载阶段对应的插件代码时,若未查找到,则创建 并缓存DexClassLoader对象;
[0296] 利用所述DexClassLoader对象,加载所述目标加载阶段对应的插件代码。
[0297] A17、根据A16所述的方法,其中,所述DexClassLoader对象的第一个参数是安装包 的路径,第二个参数是Dex优化后文件的存放位置,第三个参数是指向ClassLoader的父类 加载器。
[0298] A18、根据A14或A15所述的方法,其中,还包括:
[0299] 若在第三缓存中查找所述目标加载阶段对应的插件代码时,若未查找到,则创建 并缓存PluginContext对象;
[0300] 利用所述PluginContext对象,加载所述目标加载阶段对应的插件代码。
[0301 ] A19、根据A18所述的方法,其中,所述PluginContext对象的第一个参数为主程序 的Context对象,第二个参数是插件默认主题,第三个参数是插件的ClassLoader,第四个参 数是插件的资源对象,第五个参数是插件名。
[0302]本发明实施例的另一方面,还提供了 B20、一种插件加载装置,包括:
[0303] 拆分模块,适于将插件加载事件拆分为独立的至少一个加载阶段,其中,各个加载 阶段对应不同的插件内容;
[0304] 确定模块,适于当接收到插件加载的请求时,确定所述请求对应的目标加载阶段;
[0305] 加载模块,适于加载所述目标加载阶段对应的插件内容。
[0306] B21、根据B20所述的装置,其中,所述至少一个加载阶段包括下列至少之一:
[0307]插件信息的获取、插件资源的加载、插件代码的加载。
[0308] B22、根据B21所述的装置,其中,所述加载模块还适于:
[0309]当所述目标加载阶段为插件信息的获取时,在第一缓存中查找所述目标加载阶段 对应的插件信息;
[0310]若查找到,则从所述第一缓存中获取所述插件信息。
[0311] B23、根据B22所述的装置,其中,所述加载模块还适于:
[0312]在第一缓存中获取Packagelnfo对象,查找是否存在所述目标加载阶段对应的插 件信息。
[0313] B24、根据B22或B23所述的装置,其中,所述加载模块还适于:
[0314]在第一缓存中查找所述目标加载阶段对应的插件信息时,若未查找到,则从插件 安装包处获取所述插件信息。
[0315] B25、根据B24所述的装置,其中,所述加载模块还适于:
[0316] 调用PackageManager .getPackageArchivelnfo方法,等待操作系统生成并返回给 Packagelnfo对象,其中,所述方法中包括用于获取所述插件信息的参数;
[0317]从返回的所述Package Inf 〇对象中获取所述插件信息。
[0318] B26、根据B25所述的装置,其中,还包括:
[0319] 修改模块,适于修改所述Package Info对象中安装包和/或资源的路径。
[0320] B27、根据B26所述的装置,其中,还包括:
[0321]缓存模块,适于将修改后的所述Packagelnfo对象缓存至所述第一缓存。
[0322] B28、根据B27所述的装置,其中,所述缓存模块还适于:
[0323] 新建 ComponentList 对象;
[0324] 利用所述ComponentList对象缓存修改后的所述Package Inf 〇对象。
[0325] Β29、根据Β28所述的装置,其中,修改后的所述Packagelnfo对象包括下列至少之
[0326] Activity 组件、Service 组件、Provider 组件、Receiver 组件;
[0327] Applicationlnfo 对象;
[0328] metaData 字段。
[0329] B30、根据B21所述的装置,其中,所述加载模块还适于:
[0330] 当所述目标加载阶段为插件资源的加载时,在第二缓存中查找所述目标加载阶段 对应的插件资源;
[0331] 若查找到,则从所述第二缓存中加载所述插件资源。
[0332] B31、根据B30所述的装置,其中,所述加载模块还适于:
[0333]在第二缓存中获取Resources对象,查找是否存在所述目标加载阶段对应的插件 资源。
[0334] B32、根据B30或B31所述的装置,其中,所述加载模块还适于:
[0335]若在第二缓存中查找所述目标加载阶段对应的插件资源时,若未查找到,则从 ?已。1<386]\^11&861'.86七1^80111^6 8卩0^口口1;^&1:;[011方法中获取1^80111^68对象,其中,所述方 法中包括 mPackage Info · app 1 i cat i on Info 参数;
[0336] 从所述Resources对象中加载所述插件资源。
[0337] B33、根据B21所述的装置,其中,所述加载模块还适于:
[0338] 当所述目标加载阶段为插件代码的加载时,在第三缓存中查找所述目标加载阶段 对应的插件代码;
[0339]若查找到,则从所述第三缓存中获取所述插件代码。
[0340] B34、根据B33所述的装置,其中,所述加载模块还适于:
[0341]在第三缓存中获取DexClassLoader对象,查找是否存在所述目标加载阶段对应的 插件代码。
[0342] B35、根据B33或B34所述的装置,其中,所述加载模块还适于:
[0343] 若在第三缓存中查找所述目标加载阶段对应的插件代码时,若未查找到,则创建 并缓存DexClassLoader对象;
[0344] 利用所述DexClassLoader对象,加载所述目标加载阶段对应的插件代码。
[0345] B36、根据B35所述的装置,其中,所述DexClassLoader对象的第一个参数是安装包 的路径,第二个参数是Dex优化后文件的存放位置,第三个参数是指向ClassLoader的父类 加载器。
[0346] B37、根据B33或B34所述的装置,其中,所述加载模块还适于:
[0347] 若在第三缓存中查找所述目标加载阶段对应的插件代码时,若未查找到,则创建 并缓存PluginContext对象;
[0348]利用所述PluginContext对象,加载所述目标加载阶段对应的插件代码。
[0349] B38、根据B37所述的装置,其中,所述PluginContext对象的第一个参数为主程序 的Context对象,第二个参数是插件默认主题,第三个参数是插件的ClassLoader,第四个参 数是插件的资源对象,第五个参数是插件名。
【主权项】
1. 一种插件加载方法,包括: 将插件加载事件拆分为独立的至少一个加载阶段,其中,各个加载阶段对应不同的插 件内容; 当接收到插件加载的请求时,确定所述请求对应的目标加载阶段; 加载所述目标加载阶段对应的插件内容。2. 根据权利要求1所述的方法,其中,所述至少一个加载阶段包括下列至少之一: 插件信息的获取、插件资源的加载、插件代码的加载。3. 根据权利要求2所述的方法,其中,当所述目标加载阶段为插件信息的获取时,加载 所述目标加载阶段对应的插件内容,包括: 在第一缓存中查找所述目标加载阶段对应的插件信息; 若查找到,则从所述第一缓存中获取所述插件信息。4. 根据权利要求3所述的方法,其中,在第一缓存中查找所述目标加载阶段对应的插件 信息,包括: 在第一缓存中获取Packagelnfo对象,查找是否存在所述目标加载阶段对应的插件信 息。5. 根据权利要求3或4所述的方法,其中,还包括: 在第一缓存中查找所述目标加载阶段对应的插件信息时,若未查找到,则从插件安装 包处获取所述插件信息。6. 根据权利要求5所述的方法,其中,从插件安装包处获取所述插件信息,包括: 调用PackageManager · getPackageArchivelnfo方法,等待操作系统生成并返回给 Packagelnfo对象,其中,所述方法中包括用于获取所述插件信息的参数; 从返回的所述Package Inf 〇对象中获取所述插件信息。7. 根据权利要求2所述的方法,其中,当所述目标加载阶段为插件资源的加载时,加载 所述目标加载阶段对应的插件内容,包括: 在第二缓存中查找所述目标加载阶段对应的插件资源; 若查找到,则从所述第二缓存中加载所述插件资源。8. 根据权利要求7所述的方法,其中,在第二缓存中查找所述目标加载阶段对应的插件 资源,包括: 在第二缓存中获取Resources对象,查找是否存在所述目标加载阶段对应的插件资源。9. 根据权利要求2所述的方法,其中,当所述目标加载阶段为插件代码的加载时,加载 所述目标加载阶段对应的插件内容,包括: 在第三缓存中查找所述目标加载阶段对应的插件代码; 若查找到,则从所述第三缓存中获取所述插件代码。10. -种插件加载装置,包括: 拆分模块,适于将插件加载事件拆分为独立的至少一个加载阶段,其中,各个加载阶段 对应不同的插件内容; 确定模块,适于当接收到插件加载的请求时,确定所述请求对应的目标加载阶段; 加载模块,适于加载所述目标加载阶段对应的插件内容。
【文档编号】G06F9/445GK106095521SQ201610625607
【公开日】2016年11月9日
【申请日】2016年8月2日 公开号201610625607.8, CN 106095521 A, CN 106095521A, CN 201610625607, CN-A-106095521, CN106095521 A, CN106095521A, CN201610625607, CN201610625607.8
【发明人】张炅轩, 宋照春, 姚彤
【申请人】北京奇虎科技有限公司, 奇智软件(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1