一种基于字节码的JAVA程序方法内联的方法技术

技术编号:19820764 阅读:47 留言:0更新日期:2018-12-19 14:20
本申请公开了一种基于字节码的JAVA程序方法内联的方法,包括:将类文件解析成类节点,并将该类的属性和方法分别依次生成属性节点、方法节点,然后添加到预先定义的节点仓库中;读取所述节点仓库的方法节点,针对被读取的方法节点,判断是否存在内联的可行性;若是,则进入下一步;对判断结果为可以执行内联的方法执行方法内联操作。本申请通过ASM框架将类文件解析成类节点,再将类的方法和属性分别生成方法节点和属性节点;通过遍历所述节点仓库中的方法节点,对可以执行内联操作的方法执行内联操作,从而实现方法的合并。本申请能够在不减少应用程序功能的情况下减少方法数量,显著减少了开发者的工作量,提高了工作效率,降低开发成本。

【技术实现步骤摘要】
一种基于字节码的JAVA程序方法内联的方法
本申请涉及计算机开发领域,具体涉及一种基于字节码的JAVA程序方法内联的方法。本申请同时提供一种基于字节码的JAVA程序方法内联的装置,以及一种电子设备。
技术介绍
dex文件是Android系统的可执行文件,包含应用程序的全部操作指令以及资源文件。在安卓应用构建过程中存在一个限制,即一个dex文件最多拥有65536个方法,当方法数超过65536时,会导致生成dex文件失败。由于当前业务的发展越来越快,客户端的体量越来越大,单一dex模式下65536个方法早已不能满足业务量的需求。这大大限制了Android开发的发展,成为Android应用程序满足用户需求的一大障碍,Android程序开发者在面对此种问题时,必须考虑删减一部分功能,或者其他更加复杂的办法解决这个问题,大大增加了开发难度和开发成本。
技术实现思路
本申请实施例提供一种基于字节码的JAVA程序方法内联的方法,以解决单一dex模式下方法数超过限制导致dex文件构建失败的问题。本申请提供一种基于字节码的JAVA程序方法内联的方法,包括:将类文件解析成类节点,并将该类的属性和方法分别依次本文档来自技高网...

【技术保护点】
1.一种基于字节码的JAVA程序方法内联的方法,其特征在于,包括:将类文件解析成类节点,并将该类的属性和方法分别依次生成属性节点、方法节点,然后添加到预先定义的节点仓库中;读取所述节点仓库的方法节点,针对被读取的方法节点,判断是否存在内联的可行性;若是,则进入下一步;对判断结果为可以执行内联的方法执行方法内联操作。

【技术特征摘要】
1.一种基于字节码的JAVA程序方法内联的方法,其特征在于,包括:将类文件解析成类节点,并将该类的属性和方法分别依次生成属性节点、方法节点,然后添加到预先定义的节点仓库中;读取所述节点仓库的方法节点,针对被读取的方法节点,判断是否存在内联的可行性;若是,则进入下一步;对判断结果为可以执行内联的方法执行方法内联操作。2.根据权利要求1所述的基于字节码的JAVA程序方法内联的方法,其特征在于,在所述读取所述节点仓库的方法节点,针对被读取的方法节点,判断是否存在内联的可行性的步骤之前,进行以下操作:从节点仓库获取所有的方法节点并依次处理,添加每个方法节点对其他方法节点以及属性节点的依赖关系;进行所述执行方法内联操作时,根据所述依赖关系确定内联的插入点。3.根据权利要求2所述的基于字节码的JAVA程序方法内联的方法,其特征在于,所述从节点仓库获取所有的方法节点并依次处理,添加每个方法节点对其他方法节点以及属性节点的依赖关系,具体过程如下:对每一个方法的指令序列进行遍历,通过指令的操作码判断当前指令的类型,若指令是方法调用指令,则:解析出指令访问的方法所属类型的名称,方法名称,方法参数列表和返回值,从而从节点仓库查找对应的方法节点,添加方法-方法之间的依赖关系;若指令是属性访问指令,则解析出指令访问的属性所属类型的名称,属性名称,从而从节点仓库查找对应的属性节点,添加方法-属性之间的依赖关系。4.根据权利要求1所述的基于字节码的JAVA程序方法内联的方法,其特征在于,所述将类文件解析成类节点是通过ASM框架实现的。5.根据权利要求1所述的基于字节码的JAVA程序方法内联的方法,其特征在于,所述判断是否存在内联的可行性,在符合如下各个判断项目的情况下,则判断结果为是:该方法不是构造方法或者静态初始化方法;该方法不是同步方法;该方法不是native方法;该方法不是枚举类型;该方法是私有方法,或静态方法,或该方法是final方法且不是继承自父类方法或接口;该方法在内联后不需要提升libClass的方法/属性的访问权限;该方法的方法体异常表为空;该方法不存在自身调用;该方法不存在条件跳转指令;该方法不存在下述情况:在其内部通过invoke-special指令访问父类方法,并且其调用方不仅限于当前方法所述类型;该方法不属于下述情况:该方法是static方法,同时其在内联后可能导致运行时其所属类型未执行初始化。6.根据权利要求5所述的基于字节码的JAVA程序方法内联的方法,其特征在于,所述判断项目还包括:该方法不存在如下情况:其指令数量超过阀值,同时调用点不止一处。7.根据权利要求6所述的基于字节码的JAVA程序方法内联的方法,其特征在于,所述阀值可以由用户配置。8.根据权利要求2所述的基于字节码的JAVA程序方法内联的方法,其特征在于,所述内联操作包括:将所述可以执行内联的方法作为被调用方,称为callee,调用方称为caller;通过依赖关系找出callee的依赖方caller,分析caller的指令序列,找到所述caller调用callee的指令,该调用指令所在程序位置为内联的插入点;删除所述调用callee的调用指令;利用构造store指令栈的方法,将所述callee指令序列插入到插入点并进行完善操作,使插入后的所述caller在不需要所述callee时能够正常运行;删除所述callee,去除caller-callee依赖关系并将该方法节点从节点仓库中删除。9.根据权利要求8所述的基于字节码的JAVA程序方法内联的方法,其特征在于,在删除所述调用callee的调用指令后、构造store指令栈之前,判断所述callee是否为空方法,若是,则逆序处理所述callee的参数列表,如果参数是float或double类型,则插入pop2指令,否则插入pop指令;如果callee同时还是成员方法,则额外插入一条pop指令将调用方法的对象从栈中弹出;跳过所述利用构造store指令栈的方法,将所述callee指令序列插入到插入点并进行完善操作,使插入后的所述caller在不需要所述callee时能够正常运行的步骤,直接执行所述删除callee方法,去除caller-callee依赖关系并将该方法节点从节点仓库中删除;若否,则进入所述利用构造store指令栈的方法,将所述callee指令序列插入到插入点并进行完善操作,使插入后的所述caller在不需要所述callee时能够正常运行的步骤。10.根据权利要求8所述的基于字节码的JAVA程序方法内联的方法,其特征在于,所述利用构造store指令栈的方法,将所述callee指令序列插入到插入点并进行完善操作,使插入后的所述caller在不需要所述callee时能够正常运行,包括以下步骤:构造store指令栈;按顺序处理callee的参...

【专利技术属性】
技术研发人员:肖浩龙
申请(专利权)人:阿里巴巴集团控股有限公司
类型:发明
国别省市:开曼群岛,KY

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1