本发明涉及计算机技术领域,尤其涉及一种加载库文件的方法及装置。
背景技术:
应用程序(例如androidapp)在执行时,由于需要实现多个功能,因此需要依赖多个与各个功能对应的库文件。但为了使应用程序的安装包数据量不会变得过大,因此对于一些不常使用的功能对应的库文件,并不会被打包到安装包中,而只有在应用程序执行过程中运行响应的功能模块时,才会动态地去指定的地址下载该功能模块对应的库文件。在应用执行过程中动态地加载库文件也叫库文件的热更新。
然而,目前热更新的方案的成功率较低,主要表现在下载的库文件可能被劫持,或由于网络波动造成下载不全,在拷贝库文件到app的加载路径目录的过程中拷贝失败造成库文件不全,造成加载文件失败以及因失败造成的重复下载等问题。因此,传统技术中应用的库文件的热更新的方案的可靠性不足。
技术实现要素:
基于此,为解决传统的应用库文件的热更新的方案的可靠性不足的技术问题,特提出了一种加载库文件的方法,包括:
检测业务调用过程,根据业务调用过程确定目标库文件;
在缓存目录中查找所述目标库文件,在未查找到时,确定与所述目标库文件对应的库文件服务器;向所述库文件服务器发起与所述目标库文件对应的下载请求;
访问所述库文件服务器,将所述目标库文件由所述库文件服务器下载到所述缓存目录中;
校验所述缓存目录中的目标库文件是否与库文件服务器上存储的文件版本一致,若是,则通过将所述目标库文件添加到类加载路径中加载所述目标库文件。
此外,为解决传统的应用库文件的热更新的方案的可靠性不足的技术问题,特提出了一种加载库文件的装置,包括:
目标库文件确定模块,用于检测业务调用过程,根据业务调用过程确定目标库文件;
目标库文件查找模块,用于在缓存目录中查找所述目标库文件,在未查找到时,确定与所述目标库文件对应的库文件服务器;向所述库文件服务器发起与所述目标库文件对应的下载请求;
目标库文件缓存模块,用于访问所述库文件服务器,将所述目标库文件由所述库文件服务器下载到所述缓存目录中;
第一校验模块,用于校验所述缓存目录中的目标库文件是否与库文件服务器上存储的文件版本一致;
目标库文件加载模块,用于在所述校验模块的结果为是时,通过将所述目标库文件添加到类加载路径中加载所述目标库文件。
实施本发明实施例,将具有如下有益效果:
采用了上述加载库文件的方法和装置之后,在业务调用过程需要调用安装包外部的库文件时,先将确定库文件,再将库文件从服务器下载到新增的缓存目录中,然后对库文件进行校验,在校验无误后,才会通过类加载器加载库文件,这样就使的库文件下载失败或库文件被恶意替换时,能够阻止加载过程,从而提高了安全性和可靠性。
另外,后续业务调用再次需要加载该库文件时,可直接在缓存目录中查找库文件,并对缓存目录中的库文件进行校验,校验通过后直接加载缓存目录中的库文件,而不需要再次由服务器下载文件,因此还节省了网络流量。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
其中:
图1为一个实施例中一种加载库文件的方法的流程示意图;
图2为一个实施例中应用程序运行时的文件目录架构图;
图3为一个实施例中一种加载库文件的方法的流程示意图;
图4为一个实施例中一种加载库文件的装置的结构示意图;
图5为一个实施例中运行前述加载库文件的方法的计算机设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为了实现热加载库文件的功能,本发明实施例特提出了一种加载库文件的方法。该方法的实现可依赖于计算机程序,该计算机程序可运行于基于冯诺依曼体系的计算机系统之上,该计算机程序可基于应用程序的类加载模块或类加载器,例如android系统中的classloader类极其扩展类等;或者也可以是基于应用程序本身实现的文件管理功能,例如基于python语言、javascript语言的应用程序。本发明实施例中热加载的库文件在编译型编程语言的运行时环境下,库文件可以是动态链接库文件),其类型可以是.so(linux系统中的库文件)、.jar(android系统或java系统的库文件)或.dll(windows系统的库文件);而在解释型编程语言的运行时环境下,可以是编程语言相应的class文件或脚本文件,例如python编程语言中的.py文件或javascript编程语言中的.js文件。
具体的,如图1所示,该加载库文件的方法,包括如下步骤:
步骤s102:检测业务调用过程,根据业务调用过程确定目标库文件。
在本实施例中,应用程序的开发人员在开发应用程序产品并打包应用程序的安装包时,可在安装包中仅加入基础的功能,而可将不常用的功能打包成库文件。
例如,某个p图应用,包括多种功能,开发人员可将一部分常用的p图算法和分享功能打包在安装包中,而将一些不常用的p图算法封装在多个相应的库文件中。当用户安装了该p图应用后,可正常使用那些常用的p图算法对照片进行修饰,并可直接调用安装包中的分享功能分享处理过后的照片。因为这部分功能对应的类文件或程序代码在应用启动时已经加载到内存中。但当该用户需要使用不常用的p图算法时,则需要应用自动访问服务器下载相应的p图算法的库文件并进行热加载。
如上所述,在本实施例中,对于库文件的热加载,应用可通过检测业务调用过程的进行来确定需要加载的目标库文件。
具体的,在一种实施方式中,应用可通过异常处理机制来监测业务调用过程(该实施方式需要应用的开发语言支持异常处理机制)。异常处理机制即为try-catch机制,应用程序在执行某个业务逻辑时,会调用该业务模块对应的接口函数。
如前例中,p图应用在使用某一种p图算法进行图像处理时,总是通过调用该p图算法对应的类文件或库文件的接口函数。可在try的代码空间中执行该接口函数,当内存中已加载了该p图算法对应的类文件或库文件时,或者该p图算法对应的类文件或库文件存在于该应用运行时的类加载路径classpath中是,则可正常调用该接口函数而不会抛出异常。但若该p图算法为前述不常用的算法,则其应用的安装包或安装目录下,或者说该应用的类加载路径classpath中不存在该算法对应的库文件时,则由于调用相应的接口函数会找不到相应的引用关系或指针关系,会抛出相应的异常exception(例如,在android系统中会抛出nullpointexception类型的异常),此时应用即可根据异常的类型确定在调用该业务模块的接口函数时缺少相应的库文件,然后根据异常的类型确定目标库文件的包名。
在另一种实施方式中,应用可通过类加载器来监测业务调用过程(需要应用的开发语言支持运行时的类加载功能,例如java、android)。例如,在android系统中,业务逻辑通过相应的类文件和库文件定义,在调用业务模块的接口函数时,先将需要加载的类文件或库文件的包名(packagename)传递给classloader组件,然后使用classloader在classpath中读取相应的类文件和库文件进行加载。但若classloader在classpath中未找到与包名对应的类文件或库文件,则应用即可确定该包名为需要进行热加载的目标库文件。
需要说明的是,本发明实施例中确定目标库文件的方式不限于上述两种,例如,在其他实施方式中,应用程序也可通过在业务调用过程中增加逻辑判断来确定目标库文件,还可预先将业务模块与库文件的映射关系添加在配置文件中,通过在业务调用时查询配置文件来确定目标库文件。
步骤s104:在缓存目录中查找目标库文件,在未查找到时,确定与目标库文件对应的库文件服务器;向库文件服务器发起与目标库文件对应的下载请求。
步骤s106:访问所述库文件服务器,将所述目标库文件由所述库文件服务器下载到所述缓存目录中。
在本实施例中,为实现库文件的热加载,还设置了缓存目录。如图2所示,应用程序运行时会将硬盘中的程序文件加载到内存中。运行时的应用程序在本实施例中,可访问至少两种类型的存储区域,即类加载路径目录和本实施例中新设置的缓存目录,缓存目录用于缓存下载的库文件。
在本实施例中,当classpath中不存在目标库文件时,则优先在缓存目录中查找是否有与包名对应的目标库文件,若找到,则使用缓存目录中的版本的目标库文件进行热加载,若为找到,则访问库文件服务器下载目标库文件到缓存目录中。
需要说明的是,库文件服务器可以是存储多个库文件的单一服务器也可以是第三方提供的与各个库文件各自对应的多个服务器。
例如,在一个单一服务器的实施例中,库文件服务器可以是应用市场的服务器,应用开发商在应用市场上发布应用时,可将部分功能单独封装在库文件中,使得应用市场服务器上存储了该应用的安装包和相应的库文件,执行本方法的终端将业务调用过程中确定的目标库文件的包名发送给应用市场的服务器,即可将目标库文件下载到缓存目录中。
需要说明的是,为提高安全性,库文件服务器与终端之间的连接可基于https协议,这样可防止目标库文件在下载过程中不会被篡改。
而在一个多服务器的实施例中,库文件服务器是发布该库文件的开源组织自己的服务器,例如,某开源组织发布了一种特定的图像处理算法的库文件,终端需要加载该库文件时,可先在预先存储的映射表中查找与包名对应的库文件服务器地址,然后访问该地址下载目标库文件到缓存目录中。
步骤s108:校验缓存目录中的目标库文件是否与库文件服务器上存储的文件版本一致,若是,则通过将目标库文件添加到类加载路径中加载目标库文件。
由于目标库文件由库文件服务器下载到缓存目录中的过程中,可能被恶意篡改,或替换为添加了恶意代码的库文件。特别是在使用http协议下载的过程中,目标库文件极易被替换为包含了木马、病毒的库文件,若该库文件被应用加载,可能就会使应用在执行时执行恶意代码而造成文件损坏或隐私泄露。
为此,可在下载完毕后,校验缓存目录中的目标库文件是否与库文件服务器上存储的文件版本一致,校验的方式可以是通过比对版本号、文件大小或哈希值(比对md5码、sha码等)中的至少一种来进行校验。
若校验结果为匹配,即缓存目录中的目标库文件与库文件服务器上的文件版本的版本号、文件大小和哈希值均一致,则可对缓存目录中的目标库文件进行热加载;而若校验结果为不匹配,则可删除所述缓存目录和所述类加载路径目录中的目标库文件,执行确定与目标库文件对应的库文件服务器的步骤,重新访问库文件服务器下载目标库文件。若多次下载失败,则应用可提示报错,提示相应的业务模块无法调用。
在本实施例中,加载目标库文件的方式包括至少两种:
在第一种实施方式中,通过将所述目标库文件添加到类加载路径中加载所述目标库文件可具体为:将目标库文件由缓存目录拷贝到与类加载路径对应的类加载路径目录中,由与类加载路径目录对应的系统类加载器加载目标库文件。
请参考图2所示,在该实施方式中,校验无误的目标库文件存储在缓存目录中,可将其拷贝到应用的classpath对应的相应的目录中,例如,应用的安装目录、系统环境变量中path属性定义的目录或其他方式定义的目录中,然后通过程序编译器或解释器默认的系统类加载器加载拷贝后的目标库文件。但若默认的系统类加载器加载失败,则删除缓存目录和类加载路径目录中的目标库文件。
该实施方式适合大多数编译型和解释型编程语言开发的应用,例如java、android、python、javascript等。
在第二种实施方式中,通过将目标库文件添加到类加载路径中加载目标库文件包括:将目标库文件在缓存目录中的路径作为类加载路径的参数传递给预设的自定义类加载器,由自定义类加载器加载目标库文件。
例如,应用开发人员可预先编写自定义的classloader类来替换系统默认的classloader类,并重载类加载接口函数,使得类加载接口函数具有类加载路径的形参。而在加载目标库文件时,只需要将目标库文件在缓存目录中的路径作为参数传入,即可将该路径添加到类加载路径中,从而实现库文件的热加载。同样的,若加载失败,可删除缓存目录中的目标库文件。
进一步的,在本实施例中,回到步骤s104,若在缓存目录中查找到目标库文件,则可先不访问库文件服务器下载目标库文件,而是执行校验缓存目录中的目标库文件是否与库文件服务器上存储的文件版本一致的步骤。校验方式如前所述的方式。也就是说,对于已经下载到缓存目录中的库文件来说,后续多次调用该库文件时,不需要访问库文件服务器重新下载,若校验无误则可直接加载使用。
进一步的,在缓存目录中查找所述目标库文件之前,在类加载路径目录中存在目标库文件时,还可校验类加载路径目录中的目标库文件是否与库文件服务器上存储的文件版本一致,若否,则执行在缓存目录中查找目标库文件的步骤。
也就是说,即使类加载路径目录中存在目标库文件,也不要直接加载使用,而是先对其进行校验,若校验通过,则表示该库文件没有在拷贝过程中或应用执行过程中被篡改,为安全的库文件,可直接加载使用;若校验不通过,则执行上述在缓存目录中查找目标库文件的步骤,直至获取最安全的版本。
进一步地,为了节省缓存目录的存储空间,在缓存目录的文件大小较大,即大于或等于阈值时,可按照下载的时间先后顺序或加载次数由小到大的顺序删除缓存目录中的库文件,直至文件大小小于阈值。这就使得长期不被调用的库文件可以被快速地清理出缓存目录,从而节省了存储空间。
如图3所示,图3展示了本发明实施例完整的热加载库文件的流程。
本发明实施例还提供了一种计算机存储介质,包括计算机指令,当所述计算机指令在计算机上运行时,使得计算机执行如前所述的加载库文件的方法。
在上述实施例中,上述加载库文件的方法可以全部或部分的通过软件、硬件、固件或者其任意组合来实现。当使用软件程序实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或者数据中心通过有线(例如同轴电缆、光纤、数字用户线(dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或者数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或半导体介质(例如固态硬盘solidstatedisk(ssd))等。
此外,为了实现热加载库文件的功能,本发明实施例还提出了一种加载库文件的装置,如图4所示,上述加载库文件的装置包括目标库文件确定模块102、目标库文件查找模块104、目标库文件缓存模块106、第一校验模块108以及目标库文件加载模块110,其中:
目标库文件确定模块102,用于检测业务调用过程,根据业务调用过程确定目标库文件;
目标库文件查找模块104,用于在缓存目录中查找所述目标库文件,在未查找到时,确定与所述目标库文件对应的库文件服务器;向所述库文件服务器发起与所述目标库文件对应的下载请求;
目标库文件缓存模块106,用于访问所述库文件服务器,将所述目标库文件由所述库文件服务器下载到所述缓存目录中;
第一校验模块108,用于校验所述缓存目录中的目标库文件是否与库文件服务器上存储的文件版本一致;
目标库文件加载模块110,用于在所述校验模块的结果为是时,通过将所述目标库文件添加到类加载路径中加载所述目标库文件。
可选的,在一个实施例中,上述目标库文件查找模块104还用于在缓存目录中查找到所述目标库文件时,调用所述目标库文件加载模块110。
可选的,在一个实施例中,目标库文件加载模块110还用于将所述目标库文件由所述缓存目录拷贝到与所述类加载路径对应的类加载路径目录中,由与所述类加载路径目录对应的系统类加载器加载所述目标库文件。
可选的,在一个实施例中,第一校验模块108还用于通过比对版本号、文件大小或哈希值中的至少一种校验所述缓存目录中的目标库文件是否与库文件服务器上存储的文件版本一致。
可选的,在一个实施例中,如图4所示,上述装置还包括第一删除模块112,用于在所述校验模块的结果为否时,删除所述缓存目录和所述类加载路径目录中的目标库文件,并调用所述目标库文件查找模块。
可选的,在一个实施例中,如图4所示,上述装置还包括第二校验模块114,用于在所述类加载路径目录中存在所述目标库文件时,校验所述类加载路径目录中的目标库文件是否与库文件服务器上存储的文件版本一致,在所述第二校验模块的结果为否时,调用所述目标库文件查找模块104。
可选的,在一个实施例中,如图4所示,上述装置还包括第二删除模块116,用于在所述与所述类加载路径目录对应的系统类加载器加载所述目标库文件加载失败时,删除所述缓存目录和所述类加载路径目录中的目标库文件。
可选的,在一个实施例中,所述目标库文件加载模块110还用于将所述目标库文件在所述缓存目录中的路径作为类加载路径的参数传递给预设的自定义类加载器,由所述自定义类加载器加载所述目标库文件。
可选的,在一个实施例中,如图4所示,上述装置还包括缓存清理模块118,用于检测所述缓存目录中的文件大小,在所述文件大小大于或等于阈值时,按照下载的时间先后顺序或加载次数由小到大的顺序删除所述缓存目录中的库文件,直至所述文件大小小于所述阈值。
实施本发明实施例,将具有如下有益效果:
采用了上述加载库文件的方法和装置之后,在业务调用过程需要调用安装包外部的库文件时,先将确定库文件,再将库文件从服务器下载到新增的缓存目录中,然后对库文件进行校验,在校验无误后,才会通过类加载器加载库文件,这样就使的库文件下载失败或库文件被恶意替换时,能够阻止加载过程,从而提高了安全性和可靠性。
另外,后续业务调用再次需要加载该库文件时,可直接在缓存目录中查找库文件,并对缓存目录中的库文件进行校验,校验通过后直接加载缓存目录中的库文件,而不需要再次由服务器下载文件,因此还节省了网络流量。
在一个实施例中,如图5所示,图5展示了一种运行上述加载库文件的方法的基于冯诺依曼体系的计算机系统的vr设备10。该计算机系统可以是vr设备的主机设备或是集成了主机功能的vr头戴式显示设备。具体的,可包括通过系统总线连接的外部输入接口1001、处理器1002、存储器1003和输出接口1004。其中,外部输入接口1001可选的可至少包括网络接口10012和陀螺仪传感器10014。存储器1003可包括外存储器10032(例如硬盘、光盘或软盘等)和内存储器10034。输出接口1004可至少包括显示屏10042等设备。
在本实施例中,本方法的运行基于计算机程序,该计算机程序的程序文件存储于前述基于冯诺依曼体系的计算机系统10的外存储器10032中,在运行时被加载到内存储器10034中,然后被编译为机器码之后传递至处理器1002中执行,从而使得基于冯诺依曼体系的计算机系统10中形成逻辑上的目标库文件确定模块102、目标库文件查找模块104、目标库文件缓存模块106、第一校验模块108、目标库文件加载模块110、第一删除模块112、第二校验模块114、第二删除模块116以及缓存清理模块118。且在上述加载库文件的方法执行过程中,输入的参数均通过外部输入接口1001接收,并传递至存储器1003中缓存,然后输入到处理器1002中进行处理,处理的结果数据或缓存于存储器1003中进行后续地处理,或被传递至输出接口1004进行输出。
以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。