首页> 中国专利> 一种基于DEX文件类的流式微服务加载验证方法

一种基于DEX文件类的流式微服务加载验证方法

摘要

本发明公开了一种基于DEX文件类的流式微服务加载验证方法,具体为:首先选择具有单DEX文件的应用程序安装包,将该安装包的所有资源存储至服务器,通过分析该安装包里的DEX文件结构对类信息进行抽取,并由一个DEX文件反编译得到多个.class文件;根据类的依赖关系生成基于安卓应用程序DEX文件类的流式微服务有向图;最后根据基于DEX文件类的流式加载顺序规则以及类之间的依赖关系流式加载类以保证安卓应用程序能够运行,当缓存区已满时,使用缓存区替换算法对其先换出类后换入类操作;解决了传统方法无法将DEX文件分层次加载问题,可以及时的响应终端用户请求,从而使得应用程序能够以一种加载时间快且占用空间最少的方式正常运行。

著录项

  • 公开/公告号CN114924809A

    专利类型发明专利

  • 公开/公告日2022-08-19

    原文格式PDF

  • 申请/专利权人 西安理工大学;

    申请/专利号CN202210545048.5

  • 申请日2022-05-19

  • 分类号G06F9/445(2018.01);G06F16/16(2019.01);

  • 代理机构北京国昊天诚知识产权代理有限公司 11315;

  • 代理人李潇

  • 地址 710048 陕西省西安市金花南路5号

  • 入库时间 2023-06-19 16:26:56

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-09-06

    实质审查的生效 IPC(主分类):G06F 9/445 专利申请号:2022105450485 申请日:20220519

    实质审查的生效

说明书

技术领域

本发明涉及微服务技术领域,具体为一种基于DEX文件类的流式微服务加载验证方法。

背景技术

随着互联网时代的不断发展,安卓应用的数量以及更新频率越来越多,相应的需要手机内存空间也就越来越大,为了满足不同用户的不同需求,需要利用动态加载技术来解决按需加载问题。

安卓动态加载技术大致分为两种:动态加载DEX文件/jar文件/apk文件和动态加载so库。该技术使得用户无需下载和安装apk,从而节约内存空间。该技术大多数是面向云边端协同的,与传统的应用程序运行方式相比,不再是下载APK再安装至终端,而是将应用程序划分为微服务,其中边缘服务器存储应用程序划分之后的资源信息,还需将微服务运行在服务端以满足客户端的请求信息,终端用户设备能够按需请求服务器资源,还需对本地运行的块进行流处理,终端设备最终呈现给用户与本地原生应用相同的操作界面。

DEX文件里面存储安卓应用程序的全部操作指令以及运行时数据,安卓应用程序大多数是使用JAVA语言开发的,但是Dalvik/ART虚拟机不支持JAVA字节码,所以JAVA源代码经过编译得到多个.class文件,.class文件编译后完成的产物是DEX文件。图1为DEX文件的结构示意图,包括文件头、索引区和数据区三部分。其中,索引区是由若干个数据索引组成,数据区包括类的定义区及存储真实的字符串和代码。安卓系统中运行应用程序使用的是Dalvik/ART虚拟机,在运行程序时首先将对应的类加载到内存中。

然而,目前的研究一般是以插件化技术或者是从云端下载资源,所涉及到的云端下载一般都是下载整个DEX文件,没有对文件进行更细粒度的加载,故以class文件粒度加载应用程序是非常有意义的。

发明内容

本发明的目的是提供一种基于DEX文件类的流式微服务加载验证方法,解决了传统方法无法将DEX文件分层次加载问题。

为实现上述目的,本发明提供如下技术方案:一种基于DEX文件类的流式微服务加载验证方法,具体按照以下步骤实施:

步骤1,首先选择具有单DEX文件的应用程序安装包,将该安装包的所有资源存储至服务器,通过分析该安装包里的DEX文件结构对类信息进行抽取,并由一个DEX文件反编译得到多个.class文件;

步骤2,根据类的依赖关系生成基于安卓应用程序DEX文件类的流式微服务有向图;

步骤3,设置功能类所占比例;

步骤4,定义一套基于DEX文件类的流式加载顺序规则;

步骤5,流式加载类以保证安卓应用程序能够运行,初始化缓存区,当缓存区已满时,使用缓存区替换算法对其先换出类后换入类操作。

优选的,所述步骤1具体按照以下步骤实施:

步骤1.1,选择具有单个DEX文件的应用程序安装包,并将该安装包的所有资源存储至服务器;

步骤1.2,分析该安装包里的DEX文件结构进行类信息抽取;

步骤1.3,根据Graph结构体实例的相应属性,生成一个矩阵AdjMatrix用于存储类名以及类之间的依赖关系;

步骤1.4,在服务端借助dex2jar工具将一个DEX文件转换为Jar包,通过解压Jar包将多个.class文件提取出来以便响应终端用户的按需请求。

优选的,所述步骤1.2具体为:

(1)提取安卓DEX文件中Header部分的mapOff属性值,其中mapOff属性值表示DexMapList结构在DEX文件中的偏移量,进而找到DexMapList后,转至(2);

(2)按顺序进行遍历,当遍历完整个DexMapList后结束;

(3)在DexMapList中得到一个DexMapItem实例;

(4)判断上述DexMapItem实例中的kDexTypeClassDefItem和type值是否相等,若相等,由于offset指向的是类数据的文件偏移,故可以依据offset值找到描述类信息的DexClassDef实例,转至(5),否则转至(2);

(5)将上述DexClassDef实例中的classIdx、sourceFilesIdx以及accessFlags属性值存放于自定义Graph结构体实例的相应属性中,完成类信息的提取。

优选的,所述步骤2具体按照以下步骤实施:

步骤2.1,首先连接远程服务器,连接成功时,会通过包名获取对应DEX文件的起始与结束位置;

步骤2.2,根据步骤1中的矩阵AdjMatrix,通过循环添加顶点及依赖关系的方式输出安卓应用程序基于DEX文件类的流式微服务有向图。

优选的,所述步骤3具体按照以下步骤实施:

步骤3.1,根据安卓应用程序,通常一个页面上会有多个功能,不同用户的功能偏好不同,故其不同功能发生概率不同,根据用户行为及大数据分析得到功能发生的概率;

步骤3.2,匹配到由步骤2得到的基于DEX文件类的流式微服务有向图中的依赖关系上,将此结果保存到二维数组likelihood中,其中第一行表示类之间的依赖关系,第二行表示依赖关系发生的概率。

优选的,所述步骤4具体按照以下步骤实施:

步骤4.1,有出度而没入度的类优先加载;

步骤4.2,通过遍历有向图得到入度与出度之和最大的类优先加载,若两者之和相同,则优先调用入度之和较大的类;

步骤4.3,对于A一对一引用B,B又一对一引用C这种依赖关系,能够得到A引用C的关系是必然的,那么根据依赖关系,应当在加载了A后优先加载B。

优选的,所述步骤5具体按照以下步骤实施:

步骤5.1,将步骤2得到的基于DEX文件类的流式微服务有向图存储到邻接表,对每个结点设置标志位,1表示已经写入内存,0表示未写入内存;

步骤5.2,遍历邻接表,分别计算出每个顶点的入度、出度,并计算每个节点的入度与出度之和;

步骤5.3,初始化缓存区,缓存区有4块空闲区域;

步骤5.4,将满足步骤4中加载顺序规则的类优先写入缓存区;

步骤5.5,根据步骤3.2中二维数组likelihood得到下一步需要写入内存的类;

步骤5.6,判断缓存区是否有该类,若是跳至步骤5.7,否则跳至步骤5.8;

步骤5.7,跳出此次循环;

步骤5.8,判断缓存区是否已满,若是跳至步骤5.9,否则跳至步骤5.10;

步骤5.9,判断条件出度为0或者入度为1,若是则程序自动控制选择最恰当的内存替换算法换出类,再将需要写入的类写入缓存,否则结束;

步骤5.10,找到空闲区将类写入缓存。

优选的,终端用户通过点击主屏幕的图标以触发启动应用程序事件,服务端会判断请求微服务的合理性,若合理,则服务端会通过Socket通信向终端用户设备传输微服务,直至整个安卓应用程序功能模块能够正常使用。

与现有技术相比,本发明的有益效果如下:

(1)本发明一种基于DEX文件类的流式微服务加载验证方法,无需终端用户下载安装应用程序,也无需对应用程序进行繁琐的更新操作,这样为终端用户节约了下载安装等待时间,进而提高用户体验感;

(2)本发明旨在利用安卓DEX文件以更细粒度的方式加载应用程序,同时,需要根据大数据分析以及用户行为分析应用程序业务功能使用的频率信息,在加载应用程序过程中提高微服务加载的效率,根据安卓DEX文件类的流式加载顺序规则,首先初始化缓存区,其次根据顺序规则先加载一部分类,接着应该尽可能让用户使用频率最高的功能类优先加载,当内存缓存区满时,采取内存替换算法对类进行先换出,再换入操作,最终实现边缘服务器与终端设备之间能够满足本地空间占用较少且加载时间较短的情况下以块流方式运行应用程序,从而给终端用户提供透明服务。

附图说明

图1为DEX文件的结构示意图;

图2是本发明一种基于DEX文件类的流式微服务加载验证方法的流程图;

图3是云边端协同系统架构图;

图4是本发明一种基于DEX文件类的流式微服务加载验证方法中DEX文件类信息抽取的流程图;

图5是本发明一种基于DEX文件类的流式微服务加载验证方法中生成基于DEX文件类的流式微服务有向图方法的流程图;

图6是本发明一种基于DEX文件类的流式微服务加载验证方法中基于DEX文件类的流式微服务加载方法的流程图;

图7是本发明一种基于DEX文件类的流式微服务加载验证方法中表1楼宇房间监控系统项目基于DEX文件类的流式微服务有向图;

图8是本发明一种基于DEX文件类的流式微服务加载验证方法中楼宇房间监控系统项目不同加载方式对比图。

具体实施方式

下面将结合本发明实施例中的本发明附图,对本发明实施例中的本发明技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

如图1-8,本发明一种基于DEX文件类的流式微服务加载验证方法,如图2所示,具体按照以下步骤实施:

步骤1,首先选择具有单DEX文件的应用程序安装包,将该安装包的所有资源存储至服务器,通过分析该安装包里的DEX文件结构对类信息进行抽取,并由一个DEX文件反编译得到多个.class文件。

步骤1具体按照以下步骤实施:

步骤1.1,选择具有单个DEX文件的应用程序安装包,并将该安装包的所有资源存储至服务器;

步骤1.2,分析该安装包里的DEX文件结构进行类信息抽取如图4所示。

步骤1.2具体为:

(1)提取安卓DEX文件中Header部分的mapOff属性值,其中mapOff属性值表示DexMapList结构在DEX文件中的偏移量,进而找到DexMapList后,转至(2);

(2)按顺序进行遍历,当遍历完整个DexMapList后结束;

(3)在DexMapList中得到一个DexMapItem实例;

(4)判断上述DexMapItem实例中的kDexTypeClassDefItem和type值是否相等,若相等,由于offset指向的是类数据的文件偏移,故可以依据offset值找到描述类信息的DexClassDef实例,转至(5),否则转至(2);

(5)将上述DexClassDef实例中的classIdx、sourceFilesIdx以及accessFlags属性值存放于自定义Graph结构体实例的相应属性中,完成类信息的提取;

步骤1.3,根据Graph结构体实例的相应属性,生成一个矩阵AdjMatrix用于存储类名以及类之间的依赖关系;

步骤1.4,在服务端借助dex2jar工具将一个DEX文件转换为Jar包,通过解压Jar包将多个.class文件提取出来以便响应终端用户的按需请求;

步骤2,根据类的依赖关系生成基于安卓应用程序DEX文件类的流式微服务有向图,如图5所示;具体按照以下步骤实施:

步骤2.1,首先连接远程服务器,连接成功时,会通过包名获取对应DEX文件的起始与结束位置;

步骤2.2,根据步骤1中的矩阵AdjMatrix,通过循环添加顶点及依赖关系的方式输出安卓应用程序基于DEX文件类的流式微服务有向图;

步骤3,设置功能类所占比例;具体按照以下步骤实施:

步骤3.1,根据安卓应用程序,通常一个页面上会有多个功能,不同用户的功能偏好不同,故其不同功能发生概率不同,根据用户行为及大数据分析得到功能发生的概率;

步骤3.2,匹配到由步骤2得到的基于DEX文件类的流式微服务有向图中的依赖关系上,将此结果保存到二维数组likelihood中,其中第一行表示类之间的依赖关系,第二行表示依赖关系发生的概率;

步骤4,定义一套基于DEX文件类的流式加载顺序规则;具体按照以下步骤实施:

步骤4.1,有出度而没入度的类优先加载;

步骤4.2,通过遍历有向图得到入度与出度之和最大的类优先加载,若两者之和相同,则优先调用入度之和较大的类;

步骤4.3,对于A一对一引用B,B又一对一引用C这种依赖关系,能够得到A引用C的关系是必然的,那么根据依赖关系,应当在加载了A后优先加载B。

步骤5,流式加载类以保证安卓应用程序能够运行,初始化缓存区,当缓存区已满时,使用缓存区替换算法对其先换出类后换入类操作,如图6所示;具体按照以下步骤实施:

步骤5.1,将步骤2得到的基于DEX文件类的流式微服务有向图存储到邻接表,对每个结点设置标志位,1表示已经写入内存,0表示未写入内存;

步骤5.2,遍历邻接表,分别计算出每个顶点的入度、出度,并计算每个节点的入度与出度之和;

步骤5.3,初始化缓存区,缓存区有4块空闲区域;

步骤5.4,将满足步骤4中加载顺序规则的类优先写入缓存区;

步骤5.5,根据步骤3.2中二维数组likelihood得到下一步需要写入内存的类;

步骤5.6,判断缓存区是否有该类,若是跳至步骤5.7,否则跳至步骤5.8;

步骤5.7,跳出此次循环;

步骤5.8,判断缓存区是否已满,若是跳至步骤5.9,否则跳至步骤5.10;

步骤5.9,判断条件出度为0或者入度为1,若是则程序自动控制选择最恰当的内存替换算法换出类,再将需要写入的类写入缓存,否则结束;

步骤5.10,找到空闲区将类写入缓存;

终端用户通过点击主屏幕的图标以触发启动应用程序事件,服务端会判断请求微服务的合理性,若合理,则服务端会通过Socket通信向终端用户设备传输微服务,直至整个安卓应用程序功能模块能够正常使用。

表1为图7中的楼宇房间监控系统项目类名

首先,对应于步骤1,选择一个DEX文件的应用程序安装包,并对DEX文件进行类信息抽取。此次实验是针对一个较小的楼宇房间监控系统应用程序,将楼宇房间监控系统项目资源上传至服务器,借助dex2jar工具把classes.dex转换成classes-dex2jar.jar,将classes-dex2jar.jar文件拖入jd-gui工具中,可以查看.class文件,通过分析.class文件能够得到楼宇房间监控系统项目类之间的依赖关系。

其次,对应于步骤2,进行生成基于安卓应用程序DEX文件类的流式微服务有向图,根据步骤1类之间的依赖关系绘制流式微服务有向图。

再次,对应于步骤3,进行设置功能类所占比例,按照楼宇房间监控系统项目功能,可以把功能分为登录成功或者失败,登录成功后,提供4个功能接口。

当用户看到一些应用程序图标时,此时,终端没有将楼宇房间监控系统项目的数据加载进去,在触发楼宇房间监控系统应用程序图标时,首先加载登录功能类,此时本地只有登录功能类存在,登录成功之后,根据用户行为以及大数据分析,其功能1发生概率最大,应当在登录成功后优先加载,此时内存除了登录功能类之外还有功能1类,且同一个页面的不同功能类占比之和为1。

最后,对应于步骤5,流式加载类以保证安卓应用程序能够运行,首先将满足步骤4规则的类加入缓存区,接着根据其依赖关系按需加载类,如果缓存区已满时,脚本会自动匹配缓存区替换算法对其先换出适当的类后换入类,使得应用程序能够正常运行,最后通过比较动态加载DEX文件及DEX文件类的流式微服务加载所需的内存空间,结果表明基于DEX文件类的流式微服务加载验证方法内存占用空间较少。

尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号