一种运行时Android库文件的透明加载方法及系统的制作方法

文档序号:6607381阅读:137来源:国知局
专利名称:一种运行时Android库文件的透明加载方法及系统的制作方法
技术领域
本发明提供了一种Android库文件的加载方法,具体涉及一种运行时对Android 库文件的透明加载方法,属于移动计算领域。
背景技术
Android是谷歌于2007年11月5日推出的一款手机操作系统,其底层是经过修改 与简化的Linux内核。该操作系统由下到上依次由内核层、动态链接库层、框架层和应用层 构成。其中动态链接库层由后缀为so的文件集合构成,框架层由后缀为jar的文件集合构 成,它们分别对紧邻的上层环境提供运行时的支持。在传统设计中,动态链接库层和框架层 的文件存储在手机的ROM中,在运行时如果发现需要某个未被加载的库,则从ROM中查找并 加载这个库,使得系统能够正常运行。在上述设计中,动态链接库层和框架层的文件都存储在手机上,然而在系统运行 时并不是所有的文件都需要加载进内存的,其中大部分不常用的文件占据了相当多的存储 空间,另一方面手机的存储空间相对于PC而言又比较小,因此这种设计对于手机的存储空 间而言可以说是一种浪费。

发明内容
为了便于说明,本文将动态链接库层和框架层中的文件统一称为“库文件”。本发明的目的是提供一种新的透明加载方法,在不影响Android系统正确性的前 提下,提供一种运行时的透明加载方法,使得系统或上层应用在需要加载某个库文件的时 候,能检测并主动到远程服务器端将所需的库文件安全、可靠地加载到本地,使系统继续运 行。本发明的系统由客户端和服务器端组成,其中客户端在Android操作系统的动态 加载库层(lib层),包括依赖检测模块和文件获取模块;服务器端包括监听模块、文件检索 模块和文件传输模块。依赖检测模块用于取得应用所依赖的库文件名称,并在本地ROM的 特定目录中查找这些库文件,如果找到就直接加载,否则文件获取模块向远程服务器端发 出获取库文件的请求。后者与服务器端通信,请求需要的库文件。服务器端的监听模块接 收客户端发来的请求,文件检索模块根据请求的文件名在本地指定的目录中查找对应的文 件是否存在,如果存在,则将文件读入内存,文件传输模块再将文件发送给客户端;否则向 客户端发出文件不存在的信号。客户端将接收到的文件保存在本地目录中,以供Android 系统加载。本发明对应的流程图如图1所示,详细技术方案如下A.手机客户端的依赖检测模块,在系统启动新的应用时,获取Java虚拟机启动该 应用所依赖的库文件名,并尝试从本地寻找对应的库文件,实现方法如下Al.新的应用在启动时,Android系统会加载Java虚拟机依赖的库文件,依赖检测 模块在这里获取应用依赖的库文件名;
A2.对于每一个被依赖库文件,依赖检测模块首先在本地(即手机端)遍历指定的 目录,寻找该文件是否存在;如果找到,则将其直接加载到内存中,本系统的工作结束;A3.如果在本地找不到,则该模块向文件获取模块发出请求,后者将从远程服务器 端获取库文件,此时依赖检测模块等待文件获取模块返回结果;B.手机客户端的文件获取模块,向远程服务器端发送获取库文件的请求,并等待 接收库文件,实现方法如下Bi.该模块首先将库文件名和用于标示用户身份的用户名打包成一个请求;B2.文件获取模块与远程服务器端建立一个连接,并将这个请求发送给服务器 端;B3.该模块接下来等待远程服务器端的回应;C.服务器端的监听模块,接收来自手机客户端的请求,创建请求响应线程调用文 件检索模块,实现方法如下Cl.该模块接收到某个手机客户端的请求后,创建一个线程来处理这个请求,完成 创建线程的工作后该模块继续等待接收下一个请求,为了方便起见,下面将创建的线程称 作“请求响应线程”;C2.请求响应线程从打包的请求中抽取客户端的身份信息和需要的文件名,接下 来以用户名和文件名作为参数,调用文件检索模块的检索方法,其中用户名可以作为身份 验证信息以保证系统安全性,该方法返回一个文件句柄(如果找到对应的文件)或返回一 个空引用(如果找不到对应的文件);D.服务器端的文件检索模块,根据用户名确定检索目录,在该目录下检索给定的 文件,并将结果返回给请求响应线程,实现方法如下Dl.该模块首先根据用户名确认查找的根目录。每个用户都有不同的目录,如用户 名为user,那么查找路径就定义为user/lib,接下来在该路径中查找是否存在给定文件名 的库文件;D2.如果所需的文件存在,则该模块将文件句柄返回给请求响应线程;D3.如果所需的文件不存在,则该模块向请求响应线程返回一个空引用,表示检索 失败;E.请求响应线程以文件句柄和与客户端通信的通信句柄为参数,调用文件传输模 块,实现方法如下El.如果找到文件,则以文件句柄为参数,调用文件传输模块的传输方法;E2.否则,以空引用为参数,调用文件传输模块的传输方法;F.服务器端的文件传输模块将库文件读入内存,并依次向客户端发送文件的长 度、MD5值和文件内容,实现方法如下Fl.如果文件句柄不为空,则将对应的文件读入内存,并获取文件长度;如果文件 句柄为空,则将文件长度设为-1,表示未找到文件;F2.将文件长度通过通信句柄发送给客户端;F3.如果未见长度为-1,则该模块工作结束返回;F4.如果文件长度不为-1,则先将文件的MD5值作为字符串,发送给客户端,接着 发送文件本身,发送完成后该模块等待接收客户端的回应,该回应作为客户端是否正确接收文件的标志;F5.当接收到的消息为“0”时,表明客户端已正确接收文件,该模块工作结束返 回;F6.当接收到的消息为“-1”时,表示客户端接收到的文件不正确,此时回到步骤 F3重复执行;G.客户端的文件获取模块接收来自服务器端的文件传输模块的消息;接收并利 用MD5值验证库文件的正确性,将库文件保存在本地指定的目录下,实现方法如下Gl.文件获取模块首先接收库文件长度,当接收到的值是大于零的整型值,说明库 文件存在,如果接收到的值是-1,说明库文件不存在;G2.如果库文件不存在,则返回-1表示未找到指定库文件;G3.如果库文件存在,则该模块首先从远程读入一个字符串作为将要接收文件的 MD5值,继而将库文件从远程读入本地内存中;G4.完成接收文件的工作后,该模块计算接收到的文件的MD5并与之前接收的MD5 值做比较,以判断文件是否正确传输。若两者相等则表明接收正确,该模块向服务器端发送 一个“0”,否则表示未能正确接收文件,该模块想服务器端发送一个“_1”表示接收失败,并 重新接收文件;G5.上一步骤将重复直到两个MD5值相等为止。此时表明文件已经正确接收,此时 在指定目录下创建一个空文件,用于保存接收到的文件。本发明同时包含一种运行时对Android库文件的透明加载,如图2所示。该系统由 客户端和服务器端组成,其中客户端在Android操作系统的动态加载库层,检测并主动到 远程服务器端将所需的库文件;服务器端监听客户端发来的请求,根据请求的文件名在本 地指定的目录中查找对应的文件,发送给客户端;客户端将接收到的文件保存在本地目录 中,以供Android系统加载。该系统采用本发明提供的方法实现,包括以下几个功能单元-依赖检测模块,主要用于取得应用所依赖的库文件名称,并在本地ROM的特定 目录中查找这些库文件;-文件获取模块,主要用于向远程服务器端发出获取库文件的请求;-监听模块,主要用于接收客户端发来的请求;_文件检索模块,主要用于根据请求的文件名在本地指定的目录中查找对应的文件;-文件传输模块,主要用于将文件发送给客户端。利用本发明提供的技术方案,通过将部分库文件从手机客户端移动到远程服务器 端,可以有效减少系统的存储开销,同时提高了数据的利用率和系统运行的效率。同时基于 MD5的文件验证也保证了文件传输的正确性。


图1 本发明的方法流程图;图2 本发明的系统结构图。
具体实施例方式下面通过实例对本发明做进一步说明。需要注意的是,公布实施例的目的在于帮助进一步理解本发明,但是本领域的技术人员可以理解在不脱离本发明及所附权利要求 的精神和范围内,各种替换和修改都是可能的。因此,本发明不应局限于实施例所公开的内 容,本发明要求保护的范围以权利要求书界定的范围为准。实施例从Android系统中的/system/lib目录下移除26个库文件,测试手机能
够正常启动。本实施例在Android 1. 6版本的基础上,实现了运行时对库文件的透明加载方 法,并以系统启动必要的文件=IibjniJatinime. so为例,,验证系统加载该文件的全过 程。该库文件能够为手机用户提供一个输入界面,缺少该库文件,手机虽然能够正常启动, 但会报告找不到必要库文件的错误,而且也无法为用户提供必要的输入框。本实施例包括以下操作1.客户端获取系统欲加载的库文件名,并首先在本地查 找该文件;2.客户端向服务器端发出请求,并等待回应;3.服务器端接受请求,检索并传输 对应的库文件;4.客户端接收来自服务器端的响应。具体步骤如下1.在应用程序动态执行的过程中,客户端获取系统欲加载的库文件名,并首先在 本地查找该文件,具体步骤如下1)获取系统将要加载的库文件名。文件名在/bionic/linker目录内的文件 linker, c中,存在方法open_library (const char * name)。,当该方法被调用时,说明系统 将要加载库文件,且其名为libjnijatinime. so,我们在这里将其捕获;2)变量char 〃 path记录了从本地查找该文件的所有路径,算法遍历所有的路 径,通过函数_open_lib(full_name)判断libjni_latinime. so是否已经存在。如果存在 则_open_lib()返回大于0的值,否则返回负数。在本实施例中,本地路径有两个在本实施例中,path包含两个路径path
= “/system/lib,,path[l] = “/data/syslib”其中前者是Android系统默认的库文件存储路径,后者是我们增加的路径,该路 径保存了从服务器端获取的库文件。另外增设一个布尔型变量sofoimd,用以标记lib jni_ latinime. so是否被找到;3)在该实施例中,系统无法在本地找到libjnijatinime. so,进入步骤22.客户端向服务器端发出请求,并等待回应,具体步骤如下1)与服务器端建立socket通信,并发送请求。在本实施例中,服务器端的ip = 192. 168. 3. 33,port = 6666 ;2)等待服务器端的回应;3.服务器端接受请求,检索并传输对应的库文件,具体步骤如下1)在特定目录下查找libjnijatinime. so。在本实例中,该目录被固定为常量 fPath ;2)本地查找libjnijatinime. so存在,首先向客户端发送文件长度,接收到的值 为 9340bytes3)接下来向客户端传送libjni_latinime. so的MD5值,发送的值为3ea8341dc28 4f3d9797ef98e9a9bl392 ;4)最后向客户端传送文件libjnijatinime. so ;
5)传送结束后,服务器等待客户端的回应;4.客户端接收来自服务器端的响应,具体步骤如下1)接收文件长度,接收到的值为9340bytes ;2)该值大于0,则说明服务器端已找到该文件,且其大小等于接收到的长度;3)客户端继续接收 MD5 值,接收到 libjni_latinime. so 的 MD5 值为 3ea8341dc28 4f3d9797ef98e9a9bl3924)接下来接收文件libjnijatinime. so。文件接收完成后,验证其MD5值,验证 结果为3ea8341dc284f3d9797ef98e9a9bl392,说明文件被正确接收;5)客户端向服务器端发送一个“0”表示协议结束;6)服务器端接收到“0”,工作结束返回。
8
权利要求
一种运行时Android库文件的透明加载方法,其特征在于,包括以下步骤a)手机客户端的依赖检测模块在系统启动新的应用时,获取Java虚拟机启动该应用所依赖的库文件名,并尝试从本地寻找对应的库文件;b)手机客户端的文件获取模块向远程服务器端发送获取库文件的请求,并等待接收库文件;c)服务器端的监听模块接收来自手机客户端的请求,创建请求响应线程调用文件检索模块;d)服务器端的文件检索模块,根据用户名确定检索目录,在该目录下检索给定的文件,并将结果返回给请求响应线程;e)请求响应线程以文件句柄和与客户端通信的通信句柄为参数,调用文件传输模块;f)服务器端的文件传输模块将库文件读入内存,并依次向客户端发送文件的长度、MD5值和文件内容;g)客户端的文件获取模块接收来自服务器端的文件传输模块的消息;接收并利用MD5值验证库文件的正确性,将库文件保存在本地指定的目录下。
2.如权利要求1所述 的方法,其特征在于,所述步骤A的具体步骤如下Al.新的应用在启动时,Android系统会加载Java虚拟机依赖的库文件,依赖检测模块 在这里获取应用依赖的库文件名;A2.对于每一个被依赖库文件,依赖检测模块首先在本地(即手机端)遍历指定的目 录,寻找该文件是否存在;如果找到,则将其直接加载到内存中,本系统的工作结束;A3.如果在本地找不到,则该模块向文件获取模块发出请求,后者将从远程服务器端获 取库文件,此时依赖检测模块等待文件获取模块返回结果。
3.如权利要求2所述的方法,其特征在于,所述步骤B的实现方法为Bi.该模块首先将库文件名和用于标示用户身份的用户名打包成一个请求; B2.文件获取模块与远程服务器端建立一个连接,并将这个请求发送给服务器端; B3.该模块接下来等待远程服务器端的回应。
4.如权利要求3所述的方法,其特征在于,所述步骤D的实现方法为Dl.该模块首先根据用户名确认查找的根目录。每个用户都有不同的目录,如用户名 为user,那么查找路径就定义为user/lib,接下来在该路径中查找是否存在给定文件名的 库文件;D2.如果所需的文件存在,则该模块将文件句柄返回给请求响应线程;D3.如果所需的文件不存在,则该模块向请求响应线程返回一个空引用,表示检索失败。
5.如权利要求4所述的方法,其特征在于,所述步骤E实现方法为El.如果找到文件,则以文件句柄为参数,调用文件传输模块的传输方法; E2.否则,以空引用为参数,调用文件传输模块的传输方法。
6.如权利要求5所述的方法,其特征在于,所述步骤F实现方法为Fl.如果文件句柄不为空,则将对应的文件读入内存,并获取文件长度;如果文件句柄 为空,则将文件长度设为-1,表示未找到文件; F2.将文件长度通过通信句柄发送给客户端;F3.如果未见长度为-1,则该模块工作结束返回;F4.如果文件长度不为-1,则先将文件的MD5值作为字符串,发送给客户端,接着发送 文件本身,发送完成后该模块等待接收客户端的回应,该回应作为客户端是否正确接收文 件的标志;F5.当接收到的消息为“0”时,表明客户端已正确接收文件,该模块工作结束返回;F6.当接收到的消息为“-1”时,表示客户端接收到的文件不正确,此时回到步骤F3重 复执行。
7.如权利要求6所述的方法,其特征在于,所述步骤G实现方法如下Gl.文件获取模块首先接收库文件长度,当接收到的值是大于零的整型值,说明库文件 存在,如果接收到的值是-1,说明库文件不存在;G2.如果库文件不存在,则返回-1表示未找到指定库文件;G3.如果库文件存在,则该模块首先从远程读入一个字符串作为将要接收文件的MD5 值,继而将库文件从远程读入本地内存中;G4.完成接收文件的工作后,该模块计算接收到的文件的MD5并与之前接收的MD5值 做比较,以判断文件是否正确传输。若两者相等则表明接收正确,该模块向服务器端发送一 个“0”,否则表示未能正确接收文件,该模块想服务器端发送一个“_1”表示接收失败,并重 新接收文件;G5.上一步骤将重复直到两个MD5值相等为止。此时表明文件已经正确接收,此时在指 定目录下创建一个空文件,用于保存接收到的文件。
全文摘要
本发明公布了一种运行时对Android库文件的透明加载方法,属于移动计算领域。本发明提出的方法主要包括以下步骤A.手机客户端的依赖检测模块获取应用所依赖的库文件名;B.文件获取模块向远程服务器端发送获取库文件的请求;C.服务器端的监听模块创建线程调用文件检索模块在用户目录下检索给定的文件;D.文件传输模块向客户端发送文件的长度、MD5值和文件内容;E.客户端的文件接收库文件并利用MD5值验证库文件的正确性,将库文件保存在本地指定的目录下。本发明提出的方法能检测到所需库文件,并主动到远程服务器端将所需的库文件安全、可靠地加载到本地,使系统继续运行,减少手机本地存储空间开销。
文档编号G06F17/30GK101938469SQ201010247700
公开日2011年1月5日 申请日期2010年8月8日 优先权日2010年8月8日
发明者刘晗, 赵霞, 郭耀, 陈向群 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1