一种在android系统的虚拟机上加载java类的方法及系统的制作方法

文档序号:6510911阅读:189来源:国知局
一种在android系统的虚拟机上加载java类的方法及系统的制作方法
【专利摘要】本发明公开了一种在android系统的虚拟机上加载java类的方法及系统,该方法包括以下步骤:android系统的外部java类生成器预先加载并链接所需的java类,获取java类对应的结构信息;外部java类生成器根据结构信息查找所述android系统的虚拟机中是否已经加载了结构信息,如果是则所述虚拟机禁止为结构信息分配内存,否则所述虚拟机根据所述结构信息创建相应的C语言源文件;虚拟机根据C语言源文件得到对应的二进制形式的java类文件并保存在只读存储区;当android系统初始启动时,虚拟机查找所述二进制形式的java类文件直接进行加载。本发明虚拟机中的java类预先生成和存储在ROM中以供使用,缩短了Java类在虚拟机中加载和链接的时间,可以提高android程序的执行效率。
【专利说明】—种在andro i d系统的虚拟机上加载java类的方法及系统
【技术领域】
[0001]本发明涉及网络通信【技术领域】,特别涉及一种在android系统的虚拟机上加载java类的方法及系统。
【背景技术】
[0002]目前,移动终端的Android系统的Dalvik VM加载类到内存的工作方式如图1所示,首先Android系统决定是否需要类文件(S10),如果需要的话,加载JAR文件(S12),查看JAR文件中有没有classes, dex文件(S14),如果存在则解压出classes, dex (S16),查看classes, dex中有没有需要的类文件(S18),如果有则加载(S20),如果没有,则回到S12,重复以上步骤去查找另外的JAR文件。
[0003]Android系统中普通类的链接过程如图2所示,Java类继承链上的所有类和接口的加载和链接是递归进行的。首先,父类先加载,如果没有加载,在S22步骤进行检查并在S24步骤加载,如果父类已经加载,则在S26步骤进行链接,在步骤S28检查Java类继承链上的超接口是否加载,如果没有,则在S30加载超接口,并在S32步骤链接超接口,如果以上步骤成功,在S34步骤创建成员函数表以方便程序运行时快速调用,而且可以创建类的数据域的访问表以方便后续调用。
[0004]如上描述,Android系统中普通的Java类加载是一个不断重复的解压相应类文件的过程。在这个过程中的文件操作(打开,读取,查找,关闭)和JAR文件的解压在移动终端中需要消耗大量时间。而且,所需的Java类继承链上的所有父类和超接口的加载和链接过程递归进行,过程复杂而且耗时。
[0005]也就是说,传统的Android系统虚拟机Dalvik VM在初始启动时,Java类的加载和链接导致了 Android系统启动的延时。

【发明内容】

[0006]本发明提供了 一种在android系统的虚拟机上加载java类的方法及系统,解决Android系统虚拟机初始启动Java类的加载和链接所导致的Android系统启动的延时问题。
[0007]本发明提供了一种在android系统的虚拟机上加载java类的方法,该方法包括以下步骤:
android系统的外部java类生成器预先加载并链接所需的java类,获取所述java类对应的结构信息;
所述外部java类生成器根据所述结构信息查找所述android系统的虚拟机中是否已经加载了所述结构信息,如果是则所述虚拟机禁止为所述结构信息分配内存,否则所述虚拟机根据所述结构信息创建相应的C语言源文件;
所述虚拟机根据所述C语言源文件得到对应的二进制形式的java类文件并保存在只读存储区; 当所述android系统初始启动时,所述虚拟机查找所述二进制形式的java类文件直接进行加载。
[0008]其中,所述获取所述java类对应的结构信息具体为:获取所述java类的相关信息,将所述相关信息通过创建函数结构存储,形成结构信息。
[0009]其中,所述获取所述java类的相关信息具体包括:从所述java类中提取基本信息、从所述java类对应的超类提取信息以及从所述java类对应的超接口提取信息。
[0010]其中,所述结构信息包括所述java类的基本信息、所述java类的连接状态信息、所述java类方法、静态变量和实例变量。
[0011]其中,所述外部java类生成器根据所述结构信息查找所述android系统的虚拟机中是否已经加载了所述结构信息,如果是则所述虚拟机禁止为所述结构信息分配内存具体为:所述android系统的虚拟机通过垃圾回收机制的标记算法,阻止所述结构信息所需内存的分配。
[0012]此外,本发明还提供了一种在android系统的虚拟机上加载java类的系统,该系统,包括:
外部java类生成器,用于预先加载并链接所需的java类,获取所述java类对应的结构信息;并根据所述结构信息查找移动终端android系统的虚拟机中是否已经加载了所述结构信息;
装有android系统的移动终端,当android系统的虚拟机中已经加载了所述结构信息时,所述移动终端禁止为所述结构信息分配内存,否则所述移动终端用于根据所述结构信息创建相应的C语言源文件,还用于根据所述C语言源文件得到对应的二进制形式的java类文件并保存;当所述android系统初始启动时,所述移动终端还用于查找所述二进制形式的java类文件直接进行加载。
[0013]其中,所述装有android系统的移动终端包括:
虚拟机,当android系统的虚拟机中已经加载了所述结构信息时,所述移动终端禁止为所述结构信息分配内存,否则所述移动终端用于根据所述结构信息创建相应的C语言源文件,还用于根据所述C语言源文件得到对应的二进制形式的java类文件并保存;java类模块,用以初始启动时,存放预先选择的程序。
[0014]其中,所述虚拟机包括:
Java类加载模块,当所述android系统初始启动时,用于java类文件的加载;
Java类存储模块,用于存储外部Java类生成器建立的Java类结构信息;
内存管理,用于保存根据所述C语言源文件得到对应的二进制形式的java类文件。
[0015]与现有技术相比,本发明实施例具有以下优点:现有技术中Android系统中普通的Java类加载是一个不断重复的解压相应类文件的过程。在这个过程需要消耗大量时间。而且,所需的Java类继承链上的所有父类和超接口的加载和链接过程递归进行,过程复杂而且耗时,本发明通过android系统的外部java类生成器将虚拟机中的java类预先生成和存储在ROM中以供使用,可以有效缩短虚拟机初始启动时间,节省25%左右,而且普通的Android应用程序Java类的加载也可以采用本发明的方法,可以提高android程序的执行效率。【专利附图】

【附图说明】
[0016]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0017]图1普通的Android系统上虚拟机加载类到内存的工作方式流程图。
[0018]图2普通的Android系统上虚拟机链接类的工作方式流程图。
[0019]图3是本发明一种在android系统的虚拟机上加载java类的方法流程图。
[0020]图4本发明实施例的带有Dalvik虚拟机的移动终端配置图。
[0021]图5本发明实施例的Dalvik虚拟机配置图。
[0022]图6本发明实施例的Java类建立过程流程图。
[0023]图7本发明实施例的Java类加载过程流程图。
[0024]图8本发明实施例的内存管理标记算法流程图。
[0025]图9本发明实施例的内存管理清除算法流程图。
【具体实施方式】
[0026]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0027]本发明中提供了一种在android系统的虚拟机上加载java类的方法,通过一个外部Java类生成器将虚拟机中的java类预先生成和存储在ROM中以供使用,当虚拟机Dalvik VM初始启动时,所述虚拟机查找所述二进制形式的java类文件直接进行加载,缩短了 Java类在虚拟机中加载和链接的时间,可以提高android程序的执行效率,如图3所示,该方法包括以下步骤:
步骤S101, android系统的外部java类生成器预先加载并链接所需的java类,获取所述java类对应的结构信息;
步骤S102,所述外部java类生成器根据所述结构信息查找所述android系统的虚拟机中是否已经加载了所述结构信息;
如果是则执行步骤S1022,所述虚拟机禁止为所述结构信息分配内存;
否则将执行步骤S1021,所述虚拟机根据所述结构信息创建相应的C语言源文件;
步骤S103,所述虚拟机根据所述C语言源文件得到对应的二进制形式的java类文件并保存在只读存储区;
步骤S104,当所述android系统初始启动时,所述虚拟机查找所述二进制形式的java类文件直接进行加载。其中,所述获取所述java类对应的结构信息具体为:获取所述java类的相关信息,将所述相关信息通过创建函数结构存储,形成结构信息。
[0028]其中,所述获取所述java类的相关信息具体包括:从所述java类中提取基本信息、从所述java类对应的超类提取信息以及从所述java类对应的超接口提取信息。
[0029]其中,所述结构信息包括所述java类的基本信息、所述java类的连接状态信息、所述java类方法、静态变量和实例变量。
[0030]其中,所述外部java类生成器根据所述结构信息查找所述android系统的虚拟机中是否已经加载了所述结构信息,如果是则所述虚拟机禁止为所述结构信息分配内存具体为:所述android系统的虚拟机通过垃圾回收机制的标记算法,阻止所述结构信息所需内存的分配。
[0031]此外,本发明还提供了一种在android系统的虚拟机上加载java类的系统,该系统,如图5和图6所示,包括:
外部java类生成器100,用于预先加载并链接所需的java类,获取所述java类对应的结构信息;并根据所述结构信息查找移动终端android系统的虚拟机中是否已经加载了所述结构信息;
装有android系统的移动终端300,当android系统的虚拟机中已经加载了所述结构信息时,所述移动终端禁止为所述结构信息分配内存,否则所述移动终端用于根据所述结构信息创建相应的C语言源文件,还用于根据所述C语言源文件得到对应的二进制形式的java类文件并保存;当所述android系统初始启动时,所述移动终端还用于查找所述二进制形式的java类文件直接进行加载。
[0032]其中,所述装有android系统的移动终端包括:
虚拟机,当android系统的虚拟机中已经加载了所述结构信息时,所述移动终端禁止为所述结构信息分配内存,否则所述移动终端用于根据所述结构信息创建相应的C语言源文件,还用于根据所述C语言源文件得到对应的二进制形式的java类文件并保存;j ava类模块,用以初始启动时,存放预先选择的程序。
[0033]其中,所述虚拟机包括Java类加载加载器和内存管理,
其中,所述Java类加载加载器,包括Java类加载模块和Java类存储模块;
Java类加载模块,当所述android系统初始启动时,用于java类文件的加载;
Java类存储模块,用于存储外部Java类生成器建立的Java类结构信息;
内存管理,用于保存根据所述C语言源文件得到对应的二进制形式的java类文件。
[0034]实施例一,图4为本发明实施例的带有虚拟机的移动终端的配置图,配置有Dalvik VM (310)的机器(如Android移动终端,(300)),其Dalvik VM包括Java类加载器(320)和内存管理模块(330)。外部Java类产生器建立的Java类存储在模块350中。
[0035]模块350中的Java类,是由外部Java类产生器(100)建立的,根据初始启动程序需要,预先选定一个或者多个Java类加载和链接,并在这个过程中抽取信息,这些信息形成要建立的Java类的基本结构,并根据此结构建立Java类。
[0036]在本实施例中,外部Java类产生器(100),从所需要加载的一个或者多个Java类中抽取信息结构,当Dex文件执行时,从一个或者多个压缩文件(JAR)加载的Java类的链接状态提取结构信息;根据提取的结构信息产生C语言源文件;根据C语言源文件产生二进制形式的Java类文件。
[0037]这里,C语言的结构包括方法、静态变量、静态初始化、实例初始化。另一方面,生成的Java类的信息,存放在只读存储区。
[0038]在Dalvik VM中,Java类加载器(320)通过索引检查Java类的存在,Java类存储单元(350)用以初始启动存放预先选择的程序。[0039]在本实施例中,Java类加载器(320),在初始启动时,通过外部Java类生成器(100)提供的哈希表或者二叉树搜索Java类,如果要查找的Java类存在则返回其动态变量。
[0040]Java类的动态信息,存在内存管理单元330。内存管理单元330采用垃圾回收机制可以阻止不需要的Java类动态信息的内存分配。
[0041]图5为本发明实施例的虚拟机配置图,虚拟机(400)包括类加载器(410)和内存管理(440)。类加载器(410)包括Java类加载(420)和Java类存储(430)。进一步,Java类存储模块(430)可以存储有外部Java类生成器建立的Java类。
[0042]外部Java类生成器(100)产生Java类加载和链接状态信息。换句话说,外部Java类生成器通过普通的Java类加载器(Java类加载和链接模块)在JAR文件加载和链接的时候提取信息建立一个Java类。这样提取的信息用结构来存储,包含类的链接状态信息。这些结构代表了类的基本信息,类对象、方法、静态域、实例域。外部Java类生成器(100)可以把这些结构以C语言文件形式输出。
[0043]外部Java类生成器(100)为Java类加载器(420)建立类加载时查找所需要的哈希表或者二叉树。如果Dalvik VM需要加载特殊的Java类,在初次初始化的时候,通过在索引表中搜索可以返回该Java类的动态变量。如果该Java类不存在,贝U当做一般的Java类进行加载和链接处理。
[0044]内存管理模块(440)支持垃圾回收机制。普通的内存管理以标记&清除(Mark&Swe印)方式工作,清除分为两个阶段,标记算法和不断的迭代清除内存堆。
[0045]安装Java类的ROM分为静态和动态区域。在内存管理中,必须阻止当前没有使用的Java类产生动态信息。ROM中安装了 Dalvik VM以及相应的内存管理和Java类。在标记阶段,Java类在虚拟机中产生的所有动态信息都要被标记。
[0046]本发明实施例中Java类的建立过程如图6所示,包括:
步骤S102外部Java类生成器首先加载所需的Java类;
步骤S104链接所需的Java类;
步骤S106从所需的Java类中选择一个类来创建信息;
步骤S108外部Java类生成器从所选的Java类中提取基本信息;
步骤SllO从超类提取信息;
步骤SI 12从超接口提取信息;
步骤SI 14外部Java类生成器创建函数;
步骤SI 16外部Java类生成器创建函数表;
步骤SI 18外部Java类生成器创建接口以及接口表;
进一步,
步骤S120外部Java类生成器创建成员变量和静态变量;
步骤S122确定是否所有需要的类的信息都已创建好;
如果没有,则返回步骤S106重复进行,如果确定已经完成,则进行步骤S124 ;
步骤S124在链接表加载状态信息,并在外部Java类生成器可以把以上信息编译成二级制可执行文件。
[0047]本发明实施例的Java类加载过程如图7所示,包括: 步骤S202虚拟机的类加载器根据哈希表查找加载类到ROM ;
如果没有加载,在按照普通的流程进行:
步骤S204Java类的加载;
步骤S206Java类的链接。
[0048]另一方面,如果检查确定Java类已经加载到ROM中,则只需要:
步骤S208对已经加载的类进行初始化;
步骤S210返回有关类的信息。
[0049]参考图8和图9,所示为本发明实施例的内存管理流程图,具体地,图8为本发明实施例的内存管理标记算法流程图;图9为本发明实施例的内存管理清除算法流程图。根据图8和图9所示,内存管理分为标记和清除两个阶段。标记阶段主要包括步骤S302到步骤S316,清除阶段主要包括步骤S318到步骤S322。
[0050]步骤S302虚拟机查找并标记所有加载的类;
步骤S304查找并标记所有类的名字。
[0051]在本实施例中,虚拟机的堆(heap)中存放的当前不在用的Java类的动态信息必须释放出来,并且内存管理器应该阻止为这些不用的Java类分配内存。
[0052]进一步包括:
步骤S306虚拟机内存管理查找并标记所有的线程;
步骤S308虚拟机内存管理查找并标记所有的字符串;
步骤S310虚拟机内存管理查找并标记全局对象;
步骤S312标记对象状态所存在的堆;
步骤S314标记所有对象的状态;
步骤S316检查是否所有对象已标记;
标记完成后,进入清除阶段。
[0053]清除阶段主要包括:
步骤S318释放未标记的堆;
步骤S320释放已分配的未标记对象所占用的内存;
步骤S322检查所有的未标记对象是否处理完,直至清除阶段结束。
[0054]本发明实施例的技术方案带来的有益效果如下:通过android系统的外部java类生成器将虚拟机中的java类预先生成和存储在ROM中以供使用,缩短了 Java类在虚拟机中加载和链接的时间,可以提高android程序的执行效率。
[0055]通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可以通过硬件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是⑶-R0M,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
[0056]以上实施例仅用以说明本发明的技术方案而非限定,仅仅参照较佳实施例对本发明进行了详细说明。本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或等同替换,而不脱离本发明技术方案的精神和范围,均应涵盖在本发明的权利要求范围当中。
【权利要求】
1.一种在android系统的虚拟机上加载java类的方法,其特征在于,包括以下步骤: android系统的外部java类生成器预先加载并链接所需的java类,获取所述java类对应的结构信息; 所述外部java类生成器根据所述结构信息查找所述android系统的虚拟机中是否已经加载了所述结构信息,如果是则所述虚拟机禁止为所述结构信息分配内存,否则所述虚拟机根据所述结构信息创建相应的C语言源文件; 所述虚拟机根据所述C语言源文件得到对应的二进制形式的java类文件并保存在只读存储区; 当所述android系统初始启动时,所述虚拟机查找所述二进制形式的java类文件直接进行加载。
2.根据权利要求1所述的方法,其特征在于,所述获取所述java类对应的结构信息具体为:获取所述java类的相关信息,将所述相关信息通过创建函数结构存储,形成结构信肩、O
3.根据权利要求2所述的方法,其特征在于,所述获取所述java类的相关信息具体包括:从所述java类中提取基本信息、从所述java类对应的超类提取信息以及从所述java类对应的超接口提取信息。
4.根据权利要求1所述的方法,其特征在于,所述结构信息包括所述java类的基本信息、所述java类的连接状态信息、所述java类方法、静态变量和实例变量。
5.根据权利要求1所.述的方法,其特征在于,所述外部java类生成器根据所述结构信息查找所述android系统的虚拟机中是否已经加载了所述结构信息,如果是则所述虚拟机禁止为所述结构信息分配内存具体为:所述android系统的虚拟机通过垃圾回收机制的标记算法,阻止所述结构信息所需内存的分配。
6.一种在android系统的虚拟机上加载java类的系统,其特征在于,包括: 外部java类生成器,用于预先加载并链接所需的java类,获取所述java类对应的结构信息;并根据所述结构信息查找移动终端android系统的虚拟机中是否已经加载了所述结构信息; 装有android系统的移动终端,当android系统的虚拟机中已经加载了所述结构信息时,所述移动终端禁止为所述结构信息分配内存,否则所述移动终端用于根据所述结构信息创建相应的C语言源文件,还用于根据所述C语言源文件得到对应的二进制形式的java类文件并保存;当所述android系统初始启动时,所述移动终端还用于查找所述二进制形式的java类文件直接进行加载。
7.根据权利要求6所述的系统,其特征在于,所述装有android系统的移动终端包括: 虚拟机,当android系统的虚拟机中已经加载了所述结构信息时,所述移动终端禁止为所述结构信息分配内存,否则所述移动终端用于根据所述结构信息创建相应的C语言源文件,还用于根据所述C语言源文件得到对应的二进制形式的java类文件并保存;java类模块,用以初始启动时,存放预先选择的程序。
8.根据权利要求7所述的系统,其特征在于,所述虚拟机包括: Java类加载模块,当所述android系统初始启动时,用于java类文件的加载; Java类存储模块,用于存储外部Java类生成器建立的Java类结构信息;内存管理,用于保存根据所述C语言源文件得到对应的二进制形式的java类文件 。
【文档编号】G06F9/445GK103473096SQ201310408519
【公开日】2013年12月25日 申请日期:2013年9月10日 优先权日:2013年9月10日
【发明者】霍梅梅, 吴明晖, 蔡建平, 吴剑钟, 孙霖, 王云武 申请人:浙江大学城市学院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1