字节码优化方法及装置制造方法及图纸

技术编号:19098370 阅读:25 留言:0更新日期:2018-10-03 02:35
本申请实施例公开了一种字节码优化方法及装置。所述字节码优化方法包括:解析字节码文件,生成关于类及类中的属性和方法的信息;从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令;将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理;以及,从所述信息中删除所述待裁剪的成员访问方法,并根据执行删除操作后的所述信息生成作为优化结果的字节码文件。采用上述方法,解决现有技术中的解决方法存在裁剪方法不充分、应用程序运行性能差、应用包增大的问题。

【技术实现步骤摘要】
字节码优化方法及装置
本申请实施例涉及软件开发领域,具体涉及一种字节码优化方法及装置。
技术介绍
目前,随着应用软件需求的提高,客户端代码的体量越来越大,在安卓应用构建中,单一dex(Android平台上可执行文件的类型)模式下对方法名数量的限定已不能满足业务需求,因此提出了对字节码文件中的方法数量进行精简的需求,避免dex文件构建失败的问题。现有技术中的Proguard作为一种压缩、优化和混淆Java字节码文件的工具,实现了删除无用的类、字段、方法和属性的功能。Proguard的实现方案是针对每一对调用方法-被调用方法,通过一系列的逻辑判断该种情况是否可以执行内联,当判断可以执行内联,直接将callee函数体内联到caller函数。在实际应用过程中,基于Proguard工具进行字节码优化,存在以下缺陷:1)在判断方法是否可以进行内联时,当发现方法内部访问私有属性/方法,则会直接跳过不做处理,而这恰恰是成员访问方法(例如getter,setter,access$)的普遍应用场景,这导致非常大的方法裁剪空间被忽略,影响应用程序的执行性能;2)在进行方法内联时,不能有针对性地对待裁剪的成员访问方法进行处理,而是采用了通用化方案,导致内联后的方法冗余较多的store/load指令,不仅导致生成的应用程序包增大,而且影响应用程序的执行性能。综上所述,现有技术中的解决方法存在裁剪不充分、应用程序运行性能差、应用包增大的问题。
技术实现思路
本申请实施例提供一种字节码优化方法,以解决现有技术中的解决方法存在裁剪方法不充分、应用程序运行性能差、应用包增大的问题。所述字节码优化方法包括:解析字节码文件,生成关于类及类中的属性和方法的信息;从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令;将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理;以及,从所述信息中删除所述待裁剪的成员访问方法,并根据执行删除操作后的所述信息生成作为优化结果的字节码文件。可选的,所述从所述方法中选取待裁剪的成员访问方法,包括:从所述方法中选取属于预设类别的待裁剪的成员访问方法。可选的,所述预设类别包括以下类别之一或者任意组合:来自源代码的属性值读取方法;来自源代码的属性值写入方法;由编译器生成的供内部类访问宿主类私有属性或私有方法的方法。可选的,当所述预设类别包括来自源代码的属性值读取方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,包括:针对所述信息中的每个属性,执行下述操作:至少根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值读取方法的名称、参数列表和返回值类型;若通过对上述方法名称、参数列表和返回值类型的匹配判定所述信息中包括与该属性对应的属性值读取方法,则将所述属性值读取方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。可选的,当所述预设类别包括来自源代码的属性值写入方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,包括:针对所述信息中的每个属性,执行下述操作:至少根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值写入方法的名称、参数列表和返回值类型;若通过对上述方法名称、参数列表和返回值类型的匹配判定所述信息中包括与该属性对应的属性值写入方法,则将所述属性值写入方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。可选的,在判定所述信息中包括与该属性对应的属性值读取方法或者属性值写入方法之后、在将所述属性值读取方法或者所述属性值写入方法选取为待裁剪的成员访问方法之前,还包括:对所述属性值读取方法或者所述属性值写入方法进行校验,并将通过校验的所述属性值读取方法或者所述属性值写入方法选取为待裁剪的成员访问方法。可选的,对所述属性值读取方法或者所述属性值写入方法进行的校验,包括:白名单校验、同步方法校验、指令序列校验、属性名校验、子类重载校验、和/或、继承父类或接口校验。可选的,当所述预设类别包括由编译器生成的供内部类访问宿主类私有属性或私有方法的方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,包括:针对所述信息中的每个方法,执行下述操作:判断该方法的名称是否包含预设字符串,所述预设字符串是编译器生成的、用于标识供内部类访问宿主类私有属性或私有方法的方法的字符串;若是,将该方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。可选的,所述构造相应的直接访问指令,包括:根据所选待裁剪的成员访问方法所属类别以及所述成员访问方法所执行访问操作的相关信息,构造相应的直接访问指令。可选的,所述根据所选待裁剪成员访问方法所属预设类别以及所述成员访问方法所执行访问操作的相关信息,构造相应的直接访问指令,包括:若所选待裁剪成员访问方法属于,来自源代码的属性值读取方法或者来自源代码的属性值写入方法,则根据被访问属性的属性类型构造相应的直接访问指令。可选的,所述根据所选待裁剪成员访问方法所属预设类别以及所述成员访问方法所执行访问操作的相关信息,构造相应的直接访问指令,包括:若所选待裁剪成员访问方法属于,由编译器生成的供内部类访问宿主类私有属性或私有方法的方法,则执行下述操作:若被访问成员为属性,则根据访问类型和属性类型,构造相应的直接访问指令;若被访问成员为方法,则根据方法类型构造相应的直接访问指令。可选的,在将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令之前,包括:为所述信息中的方法建立依赖关系;所述将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并对相应被访问成员的访问权限描述符进行处理,包括:针对每个待裁剪的成员访问方法,执行以下操作:根据已建立的依赖关系,查找该待裁剪成员访问方法的调用方法;在所述信息中,将所述调用方法对该待裁剪成员访问方法的调用指令,替换为相应的直接访问指令;并对该待裁剪成员访问方法所访问成员的访问权限描述符进行处理。可选的,所述对相应被访问成员的访问权限描述符进行处理,包括:将所述被访问成员的访问权限描述符设置为表征公有的预设符号。本申请实施例还提供一种字节码优化装置,所述装置包括:生成信息单元,用于解析字节码文件,生成关于类及类中的属性和方法的信息;选取方法和构造指令单元,用于从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令;替换指令单元,用于将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理;删除单元,用于从所述信息中删除所述待裁剪的成员访问方法,并根据执行删除操作后的所述信息生成作为优化结果的字节码文件。与现有技术相比,本申请实施例具有以下优点:本申请实施例提供一种字节码优化方法,包括:解析字节码文件,生成关于类及类中的属性和方法的信息;从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令;将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理;以及,从所述信息中删除所述待裁剪的成员访问方法,并根据执行本文档来自技高网...

【技术保护点】
1.一种字节码优化方法,其特征在于,包括:解析字节码文件,生成关于类及类中的属性和方法的信息;从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令;将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理;以及,从所述信息中删除所述待裁剪的成员访问方法,并根据执行删除操作后的所述信息生成作为优化结果的字节码文件。

【技术特征摘要】
1.一种字节码优化方法,其特征在于,包括:解析字节码文件,生成关于类及类中的属性和方法的信息;从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令;将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理;以及,从所述信息中删除所述待裁剪的成员访问方法,并根据执行删除操作后的所述信息生成作为优化结果的字节码文件。2.根据权利要求1所述的方法,其特征在于,所述从所述方法中选取待裁剪的成员访问方法,包括:从所述方法中选取属于预设类别的待裁剪的成员访问方法。3.根据权利要求2所述的方法,其特征在于,所述预设类别包括以下类别之一或者任意组合:来自源代码的属性值读取方法;来自源代码的属性值写入方法;由编译器生成的供内部类访问宿主类私有属性或私有方法的方法。4.根据权利要求3所述的方法,其特征在于,当所述预设类别包括来自源代码的属性值读取方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,包括:针对所述信息中的每个属性,执行下述操作:至少根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值读取方法的名称、参数列表和返回值类型;若通过对上述方法名称、参数列表和返回值类型的匹配判定所述信息中包括与该属性对应的属性值读取方法,则将所述属性值读取方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。5.根据权利要求3所述的方法,其特征在于,当所述预设类别包括来自源代码的属性值写入方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,包括:针对所述信息中的每个属性,执行下述操作:至少根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值写入方法的名称、参数列表和返回值类型;若通过对上述方法名称、参数列表和返回值类型的匹配判定所述信息中包括与该属性对应的属性值写入方法,则将所述属性值写入方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。6.根据权利要求4或5所述的方法,其特征在于,在判定所述信息中包括与该属性对应的属性值读取方法或者属性值写入方法之后、在将所述属性值读取方法或者所述属性值写入方法选取为待裁剪的成员访问方法之前,还包括:对所述属性值读取方法或者所述属性值写入方法进行校验,并将通过校验的所述属性值读取方法或者所述属性值写入方法选取为待裁剪的成员访问方法。7.根据权利要求6所述的方法,其特征在于,对所述属性值读取方法或者所述属性值写入方法进行的校验,包括:白名单校验、同步方法校验、指令序列校验、属性名校验、子类重载校验、和/或、继承父类或接口校验。8.根据权利要求3所述的方法,其特征在于,当所述预设类别包括由编译器生成的供内部类访问宿主类私有属性或私有方法的方法时...

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

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

1