CN108614702A - 字节码优化方法及装置 - Google Patents
字节码优化方法及装置 Download PDFInfo
- Publication number
- CN108614702A CN108614702A CN201611235713.1A CN201611235713A CN108614702A CN 108614702 A CN108614702 A CN 108614702A CN 201611235713 A CN201611235713 A CN 201611235713A CN 108614702 A CN108614702 A CN 108614702A
- Authority
- CN
- China
- Prior art keywords
- access
- attribute
- cut
- instruction
- attribute value
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4434—Reducing the memory space required by the program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4441—Reducing the execution time required by the program code
- G06F8/4443—Inlining
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请实施例公开了一种字节码优化方法及装置。所述字节码优化方法包括:解析字节码文件,生成关于类及类中的属性和方法的信息;从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令;将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理;以及,从所述信息中删除所述待裁剪的成员访问方法,并根据执行删除操作后的所述信息生成作为优化结果的字节码文件。采用上述方法,解决现有技术中的解决方法存在裁剪方法不充分、应用程序运行性能差、应用包增大的问题。
Description
技术领域
本申请实施例涉及软件开发领域,具体涉及一种字节码优化方法及装置。
背景技术
目前,随着应用软件需求的提高,客户端代码的体量越来越大,在安卓应用构建中,单一dex(Android平台上可执行文件的类型)模式下对方法名数量的限定已不能满足业务需求,因此提出了对字节码文件中的方法数量进行精简的需求,避免dex文件构建失败的问题。
现有技术中的Proguard作为一种压缩、优化和混淆Java字节码文件的工具,实现了删除无用的类、字段、方法和属性的功能。Proguard的实现方案是针对每一对调用方法-被调用方法,通过一系列的逻辑判断该种情况是否可以执行内联,当判断可以执行内联,直接将callee函数体内联到caller函数。
在实际应用过程中,基于Proguard工具进行字节码优化,存在以下缺陷:
1)在判断方法是否可以进行内联时,当发现方法内部访问私有属性/方法,则会直接跳过不做处理,而这恰恰是成员访问方法(例如getter,setter,access$)的普遍应用场景,这导致非常大的方法裁剪空间被忽略,影响应用程序的执行性能;
2)在进行方法内联时,不能有针对性地对待裁剪的成员访问方法进行处理,而是采用了通用化方案,导致内联后的方法冗余较多的store/load指令,不仅导致生成的应用程序包增大,而且影响应用程序的执行性能。
综上所述,现有技术中的解决方法存在裁剪不充分、应用程序运行性能差、应用包增大的问题。
发明内容
本申请实施例提供一种字节码优化方法,以解决现有技术中的解决方法存在裁剪方法不充分、应用程序运行性能差、应用包增大的问题。
所述字节码优化方法包括:
解析字节码文件,生成关于类及类中的属性和方法的信息;
从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令;
将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理;以及,
从所述信息中删除所述待裁剪的成员访问方法,并根据执行删除操作后的所述信息生成作为优化结果的字节码文件。
可选的,所述从所述方法中选取待裁剪的成员访问方法,包括:从所述方法中选取属于预设类别的待裁剪的成员访问方法。
可选的,所述预设类别包括以下类别之一或者任意组合:
来自源代码的属性值读取方法;
来自源代码的属性值写入方法;
由编译器生成的供内部类访问宿主类私有属性或私有方法的方法。
可选的,当所述预设类别包括来自源代码的属性值读取方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,包括:
针对所述信息中的每个属性,执行下述操作:
至少根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值读取方法的名称、参数列表和返回值类型;
若通过对上述方法名称、参数列表和返回值类型的匹配判定所述信息中包括与该属性对应的属性值读取方法,则将所述属性值读取方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。
可选的,当所述预设类别包括来自源代码的属性值写入方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,包括:
针对所述信息中的每个属性,执行下述操作:
至少根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值写入方法的名称、参数列表和返回值类型;
若通过对上述方法名称、参数列表和返回值类型的匹配判定所述信息中包括与该属性对应的属性值写入方法,则将所述属性值写入方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。
可选的,在判定所述信息中包括与该属性对应的属性值读取方法或者属性值写入方法之后、在将所述属性值读取方法或者所述属性值写入方法选取为待裁剪的成员访问方法之前,还包括:
对所述属性值读取方法或者所述属性值写入方法进行校验,并将通过校验的所述属性值读取方法或者所述属性值写入方法选取为待裁剪的成员访问方法。
可选的,对所述属性值读取方法或者所述属性值写入方法进行的校验,包括:
白名单校验、同步方法校验、指令序列校验、属性名校验、子类重载校验、和/或、继承父类或接口校验。
可选的,当所述预设类别包括由编译器生成的供内部类访问宿主类私有属性或私有方法的方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,包括:
针对所述信息中的每个方法,执行下述操作:
判断该方法的名称是否包含预设字符串,所述预设字符串是编译器生成的、用于标识供内部类访问宿主类私有属性或私有方法的方法的字符串;
若是,将该方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。
可选的,所述构造相应的直接访问指令,包括:根据所选待裁剪的成员访问方法所属类别以及所述成员访问方法所执行访问操作的相关信息,构造相应的直接访问指令。
可选的,所述根据所选待裁剪成员访问方法所属预设类别以及所述成员访问方法所执行访问操作的相关信息,构造相应的直接访问指令,包括:若所选待裁剪成员访问方法属于,来自源代码的属性值读取方法或者来自源代码的属性值写入方法,则根据被访问属性的属性类型构造相应的直接访问指令。
可选的,所述根据所选待裁剪成员访问方法所属预设类别以及所述成员访问方法所执行访问操作的相关信息,构造相应的直接访问指令,包括:
若所选待裁剪成员访问方法属于,由编译器生成的供内部类访问宿主类私有属性或私有方法的方法,则执行下述操作:若被访问成员为属性,则根据访问类型和属性类型,构造相应的直接访问指令;若被访问成员为方法,则根据方法类型构造相应的直接访问指令。
可选的,在将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令之前,包括:为所述信息中的方法建立依赖关系;
所述将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并对相应被访问成员的访问权限描述符进行处理,包括:
针对每个待裁剪的成员访问方法,执行以下操作:
根据已建立的依赖关系,查找该待裁剪成员访问方法的调用方法;
在所述信息中,将所述调用方法对该待裁剪成员访问方法的调用指令,替换为相应的直接访问指令;
并对该待裁剪成员访问方法所访问成员的访问权限描述符进行处理。
可选的,所述对相应被访问成员的访问权限描述符进行处理,包括:
将所述被访问成员的访问权限描述符设置为表征公有的预设符号。
本申请实施例还提供一种字节码优化装置,所述装置包括:
生成信息单元,用于解析字节码文件,生成关于类及类中的属性和方法的信息;
选取方法和构造指令单元,用于从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令;
替换指令单元,用于将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理;
删除单元,用于从所述信息中删除所述待裁剪的成员访问方法,并根据执行删除操作后的所述信息生成作为优化结果的字节码文件。
与现有技术相比,本申请实施例具有以下优点:
本申请实施例提供一种字节码优化方法,包括:解析字节码文件,生成关于类及类中的属性和方法的信息;从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令;将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理;以及,从所述信息中删除所述待裁剪的成员访问方法,并根据执行删除操作后的所述信息生成作为优化结果的字节码文件。
本申请实施例提供的字节码优化方法,通过将待裁剪的成员访问方法替换为相应的直接访问指令、并删除待裁剪的成员访问方法,在不破坏开发人员编码习惯的前提下,减少了字节码文件中的方法数量,实现了对字节码文件的优化。而且由于采用了将待裁剪的成员访问方法替换为相应的直接访问指令的方式,实现了字节码文件中所有待裁剪的成员访问方法指令的一对一的定制替换,没有引入冗余指令,减少了访问成员的开销,提高了应用程序的运行性能,而且也不会导致应用包增大;此外,针对待裁剪的成员访问方法,无论其内部是否访问私有属性或方法,都可以对其进行删除,使得对字节码文件的裁剪更为彻底、充分。
附图说明
图1是本申请第一实施例提供的一种字节码优化方法的流程图;
图2是本申请第一实施例提供的根据当前处理的属性选取待裁剪的属性值读取方法、并构造相应的直接访问指令的流程图;
图3是本申请第一实施例提供的对属性值读取方法进行校验的流程图;
图4是本申请第一实施例提供的根据当前处理的属性选取待裁剪的属性值写入方法、并构造相应的直接访问指令的流程图;
图5是本申请第一实施例提供的根据当前处理的方法选取待裁剪的access$方法、并构造相应的直接访问指令的流程图;
图6是本申请第二实施例提供的一种字节码优化装置的示意图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请实施例。但是本申请实施例能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请实施例内涵的情况下做类似推广,因此本申请实施例不受下面公开的具体实施的限制。
本申请第一实施例提供了一种字节码优化方法。请参考图1,其示出了根据本申请的实施例提供的字节码优化方法的流程图。以下结合图1进行详细说明。
步骤S101,解析字节码文件,生成关于类及类中的属性和方法的信息。
所述字节码文件,是由字节码构成的文件,其中所述字节码是Java虚拟机执行的一种指令格式。所述字节码文件可以为Java源代码经过编译后生成的文件,例如.class文件。
本步骤通过解析字节码文件,生成关于类及类中的属性和方法的信息。在具体实现时,所述信息可以存储在节点仓库中,所述节点仓库中可以包括类节点,类节点可以进一步包含方法节点、以及属性节点,本步骤可以利用ASM框架(Java字节码操纵框架)从字节码文件解析得到类信息,并存储在相应的类节点中,根据解析得到的类所包含的方法和属性的相关信息依次生成方法节点和属性节点,并添加到节点仓库的相应类节点中。其中,类节点中可以记录类的相关信息,例如:类名称、父类信息、子类信息等;方法节点中可以记录方法的相关信息,例如:方法名称、参数列表、返回值类型以及方法所包含的指令序列等;属性节点中可以记录属性的相关信息,例如:属性名称、属性类型等。
在具体实施时,所述字节码文件的数量可以为一个,也可以是一个以上,对于一个以上的情况,本步骤可以依次解析每个字节码文件,并在节点仓库中记录解析得到的上述各种信息。
步骤S102,从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令。
本步骤构造出待裁剪的成员访问方法的直接访问指令,可以是将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令的前序步骤。
在具体实施时,本步骤可以从步骤S101所生成的信息所包含的方法中,选取属于预设类别的待裁剪的成员访问方法,所述预设类别可以包括以下类别之一或者任意组合:来自源代码的属性值读取方法、来自源代码的属性值写入方法、由编译器生成的供内部类访问宿主类私有属性或私有方法的方法。
所述来自源代码的属性值读取方法,是指在开发人员编辑源代码阶段写入源代码中的属性值读取方法,通称为getter方法,例如:
public string getName(){return name;}。
所述来自源代码的属性值写入方法,是指在开发人员编辑源代码阶段写入源代码中的属性值写入方法,通常为setter方法,例如:
public void setI(int i){this.i=i;}。
所述由编译器生成的供内部类访问宿主类私有属性或私有方法的方法,则是指针对内部类访问宿主类私有方法或属性的情况,经过javac编译为宿主类生成的静态方法,所述静态方法用于桥接对于私有方法或属性的访问,所述静态方法的方法名通常包含预设的字符串,例如:access$XXX(XXX为随机数字)。
在具体实施时,可以根据具体的优化需求,预先指定预设类别为上述三个类别之一或者任意组合,从而在选取待裁剪的成员访问方法时,可以仅选取属于预设类别的成员访问方法。例如:预设类别为来自源代码的属性值读取方法、以及来自源代码的属性值写入方法,那么就可以从步骤S101获取的方法中选取来自源代码的属性值读取方法,以及来自源代码的属性值写入方法,作为待裁剪的成员访问方法。下面分别针对上述三个类别,对本步骤的实施方式进行说明。
(一)所述预设类别包括来自源代码的属性值读取方法
当所述预设类别包括来自源代码的属性值读取方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,可包括:
针对步骤S101所生成的信息中的每个属性,执行下述操作:至少根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值读取方法的名称、参数列表和返回值类型;若通过对上述信息的匹配判定所述信息中包括与该属性对应的属性值读取方法,则将所述属性值读取方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。
优选地,在判定所述信息中包括与该属性对应的属性值读取方法之后、在将所述属性值读取方法选取为待裁剪的成员访问方法之前,还包括:对所述属性值读取方法进行校验,并将通过校验的所述属性值读取方法选取为待裁剪的成员访问方法,以避免执行不恰当的裁剪操作,从而有助于保证目标代码的正确执行。
本步骤可以遍历步骤S101生成的节点仓库中的属性节点,并针对每个属性进行处理,请参见图2,其为本申请的第一实施例提供的根据当前处理的属性,选取待裁剪的属性值读取方法、并构造相应的直接访问指令的流程图,具体包括步骤S102-1-1至S102-1-5。
步骤S102-1-1、根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值读取方法的名称、参数列表和返回值类型。
例如,在java语言中,如果该属性名称为name,所属的类为com.test.A,数据类型是String,则与该属性对应的属性值读取方法的名称可以为com.test.A.getName,参数列表为空,返回值类型为String,即:相应的属性值读取方法的方法签名为“com.test.A.getName()Ljava.lang.String;”。如果该属性名称为open,所属的类为com.test.A,数据类型是boolean,则与该属性对应的属性值读取方法的名称可以为com.test.A.isOpen,参数列表为空,返回值类型为boolean,即:相应的属性值读取方法的方法签名为“com.test.A.isOpen()Z”。
步骤S102-1-2、通过对上述方法名称、参数列表和返回值类型的匹配,判断所述信息中是否包括与该属性对应的属性值读取方法,若是,则执行步骤S102-3。
在根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值读取方法的名称、参数列表和返回值类型之后,需要判定步骤S101生成的信息中是否包括与该属性对应的属性值读取方法。例如,可以通过将已确定的属性值读取方法的名称、参数列表和返回值类型与节点仓库中的各方法节点逐一进行匹配,若找到了相匹配的方法节点,即:参与匹配的双方的方法名称、参数列表和返回值类型都一致,则判定步骤S101生成的信息中包括与该属性对应的属性值读取方法。同样的道理,如果通过上述匹配过程,未在节点仓库中找到相匹配的方法节点,则判定步骤S101生成的信息中不包括与该属性对应的属性值读取方法。
例如,如果该属性对应的属性值读取方法的名称为com.test.A.getName,参数列表为空,返回值类型为String,若节点仓库中存在与上述名称、参数列表和返回值类型都匹配的方法节点,则可以判定步骤S101生成的信息中包括与该属性对应的属性值读取方法。
步骤S102-1-3、对所述属性值读取方法进行校验,若通过校验,则执行步骤S102-1-4。
考虑到在一些应用场景下,即使步骤S101生成的信息中包括所述属性值读取方法,也不能将所述属性值读取方法选取为待裁剪的成员访问方法,以避免执行不恰当的裁剪操作,因此可以对所述属性值读取方法是否为可裁剪的方法做进一步校验,从而有助于保证目标代码的正确执行。
请参见图3,其为本申请第一实施例提供的对属性值读取方法进行校验的流程图。对所述属性值读取方法进行的校验,包括:白名单校验、同步方法校验、指令序列校验、属性名校验、子类重载校验、继承父类或接口校验。
所述白名单校验,指判断所述属性值读取方法是否在白名单中,若是,则未通过白名单校验;若否,则通过了白名单校验。所述白名单中包含了不能裁剪,即:要保留的成员访问方法。例如,在Android开发中,供Native层调用或反射调用的属性值读取方法通常包含在白名单中。
所述同步方法校验,指校验所述属性值读取方法是否为同步方法,若是,则所述属性值读取方法不能通过同步方法校验;若否,则通过同步方法校验。其中,所述同步方法指不允许在同一时间点两个或者两个以上线程同时调用的方法,所述方法通常具有同步控制功能,如果被裁剪,则会丧失同步控制功能,可能导致无法得到正确的运行结果或者运行时出错。
所述指令序列校验,指判断所述属性值读取方法的指令序列是否正确,若不正确,则不能通过指令序列校验;若匹配,则通过指令序列校验。例如,属性名称为a,其对应的所述属性值读取方法为getA(){},getA内缺少用于返回属性a的值的相关指令,或者还存在执行其他操作的指令,则不能通过指令序列校验。
所述子类重载校验,指判断是否存在子类重载所述属性值读取方法,若存在,则不能通过子类重载校验;若不存在,则通过子类重载校验。子类重载校验过程需要根据通过解析字节码文件获取的类之间的相互关系进行校验。
所述继承父类或接口校验,指判断所述属性值读取方法是否继承父类或接口,若是,则不能通过继承父类或接口校验;若否,则通过继承父类或接口校验。继承父类或接口校验可以根据通过解析字节码文件获取的类之间的相互关系进行校验。
所述属性名校验,指判断所述属性值读取方法所访问的属性名称是否与当前处理的属性名称一致,若是,则通过属性名校验;若否,则不能通过属性名校验。例如,当前属性名称为a,其对应的所述属性值读取方法为getA(){return b;},所述属性值读取方法所访问的属性名称为b,返回的不是a,则不能通过属性名校验。
在具体实施时,可以根据具体的需求,从上面列举的校验方式中选取一种或者一种以上校验方式对所述属性值读取方法进行校验,并且当所述属性值读取方法通过所选取的所有校验时,执行步骤S102-1-4。
步骤S102-1-4、将通过校验的所述属性值读取方法选取为待裁剪的成员访问方法。
在将所述属性值读取方法选取为待裁剪的成员访问方法时,可以采用对节点仓库中的相应方法节点加标记的方式、或者采用将所述属性值读取方法放入待裁剪的成员访问方法列表中的方式来实现。
步骤S102-1-5、针对所述属性值读取方法,构造相应的直接访问指令。
在将所述属性值读取方法选取为待裁剪的成员访问方法之后,可以根据所述属性值读取方法所执行访问操作的相关信息构造相应的直接访问指令,所述属性值读取方法所执行访问操作的相关信息可以包括:被访问属性的属性类型。具体的,若被访问属性的属性类型为静态,则构造getstatic指令;若被访问属性的属性类型为非静态,则构造getfield指令。
(二)所述预设类别包括来自源代码的属性值写入方法
当所述预设类别包括来自源代码的属性值写入方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,包括:
针对步骤S101所生成的信息中的每个属性,执行下述操作:至少根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值写入方法的名称、参数列表和返回值类型;若通过对上述信息的匹配判定所述信息中包括与该属性对应的属性值写入方法,则将所述属性值写入方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。
优选地,在判定所述信息中包括与该属性对应的属性值写入方法之后、在将所述属性值写入方法选取为待裁剪的成员访问方法之前,还可以包括:对所述属性值写入方法进行校验,并将通过校验的所述属性值写入方法选取为待裁剪的成员访问方法,以避免执行不恰当的裁剪操作,从而有助于保证目标代码的正确执行。
本步骤可以遍历步骤S101生成的节点仓库中的属性节点,并针对每个属性进行处理,请参见图4,其为本申请的第一实施例提供的根据当前处理的属性,选取待裁剪的属性值写入方法、并构造相应的直接访问指令的流程图,具体可以包括步骤S102-2-1至S102-2-5。
步骤S102-2-1、根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值写入方法的名称、参数列表和返回值类型。
例如,在java语言中,如果该属性名称为name,所属的类为com.test.A,数据类型是String,则与该属性对应的属性值写入方法的名称可以为com.test.A.setName,参数列表中包含一个String类型的参数,返回值类型为void,即,相应的属性值写入方法的方法签名为“com.test.A.setName(Ljava.lang.String;)V”。
步骤S102-2-2、通过对上述方法名称、参数列表和返回值的匹配,判断所述信息中是否包括与该属性对应的属性值写入方法,若是,则执行步骤S102-2-3。
在根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值写入方法的名称、参数列表和返回值类型之后,需要判定步骤S101生成的信息中是否包括与该属性对应的属性值写入方法。例如,可以通过将已确定的属性值写入方法的名称、参数列表和返回值类型与节点仓库中的各方法节点逐一进行匹配,若找到了相匹配的方法节点,即:参与匹配的双方的方法名称、参数列表和返回值类型都一致,则判定步骤S101生成的信息中包括与该属性对应的属性值写入方法。同样的道理,如果通过上述匹配过程,未在节点仓库中找到匹配的方法节点,则判定步骤S101生成的信息中不包括与该属性名称对应的属性值写入方法。
例如,如果该属性对应的属性值写入方法的名称为com.test.A.setName,参数列表中包含一个String类型的参数,返回值类型为void,若节点仓库中存在与上述名称、参数列表和返回值类型都匹配的方法节点,则可以判定步骤S101生成的信息中包括与该属性对应的属性值写入方法。
步骤S102-2-3、对所述属性值写入方法进行校验,若通过校验,则执行步骤S102-2-4。
考虑到在一些应用场景下,即使步骤S101生成的信息中包括所述属性值写入方法,也不能将所述属性值写入方法选取为待裁剪的成员访问方法,以避免执行不恰当的裁剪操作,因此需要对所述属性值写入方法是否为可裁剪的方法做进一步校验,从而有助于保证目标代码的正确执行。
与对所述属性值读取方法进行的校验相似,对所述属性值写入方法进行的校验,包括:白名单校验、同步方法校验、指令序列校验、属性名校验、子类重载校验、继承父类或接口校验。
由于上述校验与属性值读取方法的相关校验类似,此处不再详述,详情参见步骤S102-1-3中对属性值读取方法进行校验的相关文字。
在具体实施时,可以根据具体的需求,从上面列举的校验方式中选取一种或者一种以上校验方式对所述属性值写入方法进行校验,并且当所述属性值写入方法通过所选取的所有校验时,执行步骤S102-2-4。
步骤S102-2-4、将通过校验的所述属性值写入方法选取为待裁剪的成员访问方法。
在将所述属性值写入方法选取为待裁剪的成员访问方法时,可以采用对节点仓库中的相应方法节点加标记的方式、或者采用将所述属性值写入方法放入待裁剪的成员访问方法列表中的方式来实现。
步骤S102-2-5、针对所述属性值写入方法,构造相应的直接访问指令。
在将所述属性值写入方法选取为待裁剪的成员访问方法之后,可以根据所述属性值写入方法所执行访问操作的相关信息构造相应的直接访问指令,所述属性值写入方法所执行访问操作的相关信息可以包括:被访问属性的属性类型。具体的,若被访问属性的属性类型为静态,则构造putstatic指令;若被访问属性的属性类型为非静态,则构造putfield指令。
(三)所述预设类别包括由编译器生成的供内部类访问宿主类私有属性或私有方法的方法
当所述预设类别包括由编译器生成的供内部类访问宿主类私有属性或私有方法的方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,包括:
针对步骤S101所生成的信息中的每个方法,执行下述操作:判断该方法的名称是否包含预设字符串,所述预设字符串是编译器生成的、用于标识供内部类访问宿主类私有属性或私有方法的方法的字符串;若是,将该方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。
以Java源代码编译生成字节码文件为例,所述预设字符串可以为“access$”,本实施例中,将javac编译器生成的供内部类访问宿主类私有属性或私有方法的方法称为:access$方法。相应地,本步骤可以遍历步骤S101通过解析字节码获取的方法,并针对每个方法进行处理,请参见图5,其为本申请的第一实施例提供的根据当前处理的方法选取待裁剪的access$方法、并构造相应的直接访问指令的流程图,具体包括步骤S102-3-1至S102-3-3。
步骤S102-3-1,判断该方法的名称是否包含预设字符串access$,若是,则执行步骤S102-3-2。
例如,如果该方法的名称为“access$100”,其中包含了预设字符串“access$”,则说明该方法属于由编译器生成的供内部类访问宿主类私有属性或私有方法的方法,因此继续执行后续步骤S102-3-2。
步骤S102-3-2,将该方法选取为待裁剪的成员访问方法。
在将该方法选取为待裁剪的成员访问方法时,可以采用对该方法加标记的方式、或者采用将该方法放入待裁剪的成员访问方法列表中的方式来实现。
步骤S102-3-3,针对该方法,构造相应的直接访问指令。
在将该方法选取为待裁剪的成员访问方法后,需要构造相应的直接访问指令。由于该方法属于由编译器生成的供内部类访问宿主类私有属性或私有方法,因此在构造相应的直接访问指令时,可以根据该方法所执行的访问操作的相关信息进行构造。所述该方法所执行的访问操作的相关信息可以包括:被访问成员是属性还是方法,以及相应的访问类型和属性类型、或者方法类型。其中,所述访问类型包括读取或写入,所述属性类型包括静态或非静态;所述方法类型包括静态或非静态。
在具体实施时,在将该方法选取为待裁剪的成员访问方法之后、构造相应的直接访问指令之前,可以获取该方法所执行的访问操作的上述相关信息,例如:被访问的是属性还是方法,以及上面列举的其他相应信息。
具体的,根据该方法所述执行的访问操作的相关信息构造相应的直接访问指令的处理过程可以为:1)针对被访问成员为属性的情况,若访问类型为读取,属性类型为静态,则构造getstatic指令;若访问类型为读取,属性类型为非静态,则构造getfield指令;若访问类型为写入,属性类型为静态,则构造putstatic指令;若访问类型为写入,属性类型为非静态,则构造putfield指令。2)针对被访问成员为方法的情况,若方法类型为静态,则构造invokestatic指令;若方法类型为非静态,则构造invokevirtual指令。
步骤S103,将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理。
本步骤实现了直接访问指令对方法调用指令的一对一替换、以及对被访问成员的访问权限描述符进行处理,防止了将待裁剪的成员访问方法进行删除后可执行代码无法正确运行。
所述将所述信息中对所述待裁剪的成员访问方法的调用指令、替换为相应的直接访问指令的实施方式可以为:在步骤S101所生成的信息中通过遍历的方式找到所有调用所述待裁剪的成员访问方法的调用指令,将每一条调用指令修改为相应的直接访问指令。例如,getI()对应的字节码调用指令为invokevirtual,将其修改为已构造的直接访问指令getfield。
优选的,在执行本步骤之前可以为步骤S101所生成的信息中的方法建立依赖关系。从而在执行本步骤时,可以根据已建立的依赖关系,在所述信息中查找所述待裁剪的成员访问方法的调用方法、并对其中的调用指令进行替换,从而可以提高本步骤的执行效率。
具体的,上述建立依赖关系的具体实施方式可以为,对步骤S101生成的节点仓库中的每个方法节点对应的方法进行如下处理:对该方法(以下称为调用方)所包含的指令序列进行遍历,通过指令的操作码(opcode)来判断当前指令的类型,若当前指令是方法调用指令,则解析出被调用方法的所属类名称、方法名称、参数列表和返回值类型,然后从节点仓库中查找与所述被调用方法对应的方法节点,并记录所述调用方与所述被调用方法之间的依赖关系。
基于上述预先建立依赖关系的优选实施方式,本步骤可以针对每个待裁剪的成员访问方法,执行以下操作:根据已建立的依赖关系,在步骤S101所生成的信息中查找该待裁剪成员访问方法的调用方法;在所述信息中,将所述调用方法对该待裁剪成员访问方法的调用指令,替换为相应的直接访问指令;并对该待裁剪成员访问方法所访问成员的访问权限描述符进行处理,以确保相应的直接访问指令成功执行,下面针对该待裁剪成员访问方法的处理过程进行说明。
其中,所述相应的直接访问指令,指步骤S102中针对该待裁剪的成员访问方法构造的直接访问指令。
所述根据已建立的依赖关系,在步骤S101所生成的信息中查找该待裁剪成员访问方法的调用方法,可以是根据该待裁剪成员访问方法与其调用方所建立的依赖关系,找到所有调用该待裁剪成员访问方法的方法。
所述在所述信息中,将所述调用方法对该待裁剪成员访问方法的调用指令,替换为相应的直接访问指令,包括:针对每一个调用方法进行以下处理:遍历调用方法所包含的指令序列,找到调用该待裁剪成员访问方法的方法调用指令,并将该方法调用指令替换成针对该待裁剪成员访问方法已构造的直接访问指令。
完成上述指令替换操作后,为了确保替换后的直接访问指令成功执行,需要在步骤S101所生成的信息中、针对该待裁剪成员访问方法所访问的成员(以下称为被访问成员,包括属性或方法)的访问权限描述符进行处理。
具体的,可以先判断被访问成员的访问权限描述符是否为表征公有的预设符号,例如:public,若是,可以不进行额外的设置操作,否则,可以根据被访问成员所在的类与调用方所在类之间的相对关系(例如:是否在同一个包中),为被访问成员设置相应的访问权限描述符,例如:private、protected、default或者public,以保证直接访问指令能够成功执行。
优选地,为了简化本技术方案实施的复杂度、减少开销,可以不进行上述判断以及类间关系的检查,而是直接将被访问成员的访问权限描述符设置为表征公有的预设符号,例如:public,从而可以确保与该待裁剪成员访问方法对应的直接访问指令能够成功执行。
步骤S104,从所述信息中删除所述待裁剪的成员访问方法,并根据执行删除操作后的所述信息生成作为优化结果的字节码文件。
本步骤通过删除所述待裁剪的成员访问方法,减少了字节码文件中方法的数量,对字节码文件进行了优化,有助于避免可执行文件构建失败的问题。
在将对待裁剪的成员访问方法的调用指令替换为相应的直接访问指令后,就可以将所述待裁剪的成员访问方法从所述步骤S101所生成的信息中删除,此时删除不会影响基于所述信息得到的可执行文件的运行,因为所述待裁剪的成员访问方法已经变成多余的了。
具体的,从所述信息中删除所述待裁剪的成员访问方法的实施方式可以为:如果选取所述待裁剪的成员访问方法时采用了对节点仓库中的相应方法节点作标记的方式,则可以在节点仓库中遍历查找作过所述标记的方法,将作标记的方法节点从节点仓库中删除。
所述根据执行删除操作后的所述信息生成作为优化结果的字节码文件,其具体实现方法可以为,针对节点仓库中的每一个类节点,执行下述操作:将该类节点包含的与类相关的信息,包括类及类所包含的方法、属性等相关信息作为ASM框架的输入,用ASM框架生成新的字节码文件。针对每个类节点进行上述处理后生成的新字节码文件即为采用本技术方案得到的优化结果,由于新的字节码文件与原始的字节码文件(即,步骤S101中解析的字节码文件)相比,减少了大量的成员访问方法,从而减少了访问成员的开销,提高了应用程序的运行性能。
至此,通过上述步骤S101-S104,对本实施例提供的字节码优化方法的实施方式进行了描述。通过上述描述可以看出,所述方法通过将待裁剪的成员访问方法替换为相应的直接访问指令、并删除待裁剪的成员访问方法,减少了字节码文件中的方法数量,实现了对字节码文件的优化。而且由于采用了将待裁剪的成员访问方法替换为相应的直接访问指令的方式,实现了字节码文件中所有待裁剪的成员访问方法指令的一对一的定制替换,没有引入冗余指令,减少了访问成员的开销,提高了应用程序的运行性能,而且也不会导致应用包增大;此外,针对待裁剪的成员访问方法,无论其内部是否访问私有属性或方法,都可以对其进行删除,使得对字节码文件的裁剪更为彻底、充分。
与上述字节码优化方法相对应的,本申请还提供了一种字节码优化装置。由于所述装置的实施例基本相似于方法的实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。所述字节码优化装置实施例如下:
请参考图6,其示出了根据本申请的第二实施例提供的一种字节码优化装置的示意图。
所述字节码优化装置,包括:生成信息单元601、选取方法和构造指令单元602、替换指令单元603、删除单元604。
生成信息单元601,用于解析字节码文件,生成关于类及类中的属性和方法的信息;
选取方法和构造指令单元602,用于从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令;
替换指令单元603,用于将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理;
删除单元604,用于从所述信息中删除所述待裁剪的成员访问方法,并根据执行删除操作后的所述信息生成作为优化结果的字节码文件。
可选的,所述选取方法和构造指令单元中从所述方法中选取待裁剪的成员访问方法,包括:从所述方法中选取属于预设类别的待裁剪的成员访问方法。
可选的,所述预设类别包括以下类别之一或者任意组合:
来自源代码的属性值读取方法;
来自源代码的属性值写入方法;
由编译器生成的供内部类访问宿主类私有属性或私有方法的方法。
可选的,当所述预设类别包括来自源代码的属性值读取方法时,所述选取方法和构造指令单元,包括:
确定读取方法子单元,用于针对所述信息中的每个属性,至少根据该属性所属类以及属性名称和数据类型确定其所对应的属性值读取方法的名称、参数列表和返回值类型;
选取读取方法子单元,用于若通过对上述方法名称、参数列表和返回值类型的匹配判定所述信息中包括与该属性对应的属性值读取方法,则将所述属性值读取方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。
可选的,当所述预设类别包括来自源代码的属性值写入方法时,所述选取方法和构造指令单元,包括:
确定写入方法子单元,用于针对所述信息中的每个属性,至少根据该属性的属性名称和数据类型确定其所对应的属性值写入方法的名称、参数列表和返回值类型;
选取写入方法子单元,用于若通过对上述方法名称、参数列表和返回值类型的匹配判定所述信息中包括与该属性对应的属性值写入方法,则将所述属性值写入方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。
可选的,所述选取读取方法子单元和所述选取写入方法子单元,还包括:校验子单元,用于在判定所述信息中包括与所述属性名称对应的属性值读取方法或者属性值写入方法之后、在将所述属性值读取方法或者所述属性值写入方法选取为待裁剪的成员访问方法之前,对所述属性值读取方法或者所述属性值写入方法进行校验,并将通过校验的所述属性值读取方法或者所述属性值写入方法选取为待裁剪的成员访问方法。
可选的,所述校验子单元包括:
白名单校验、同步方法校验、指令序列校验、属性名校验、子类重载校验、和/或、继承父类或接口校验。
可选的,当所述预设类别包括由编译器生成的供内部类访问宿主类私有属性或私有方法的方法时,所述选取方法和构造指令单元,包括:
判断子单元,用于针对所述信息中的每个方法,判断该方法的名称是否包含预设字符串,所述预设字符串是编译器生成的、用于标识供内部类访问宿主类私有属性或私有方法的方法的字符串;
选取子单元,用于当判断子单元的输出为是时,将该方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。
可选的,所述选取方法和构造指令单元,包括:
选取方法子单元,用于从所述方法中选取待裁剪的成员访问方法;
构造指令子单元,用于构造相应的直接访问指令。
可选的,所述构造指令子单元,具体用于根据所选待裁剪的成员访问方法所属类别以及所述成员访问方法所执行访问操作的相关信息,构造相应的直接访问指令。
可选的,所述构造指令子单元,包括:
读取或写入方法构造指令子单元,用于若所选待裁剪成员访问方法属于,来自源代码的属性值读取方法或者来自源代码的属性值写入方法,则根据被访问属性的属性类型构造相应的直接访问指令。
可选的,所述构造指令子单元,包括:
编译器方法构造指令子单元,用于若所选待裁剪成员访问方法属于,由编译器生成的供内部类访问宿主类私有属性或私有方法的方法,则执行下述操作:若被访问成员为属性,则根据访问类型和属性类型,构造相应的直接访问指令;若被访问成员为方法,则根据方法类型构造相应的直接访问指令。
可选的,在替换指令单元工作之前,包括:建立关系单元,用于为所述信息中的方法建立依赖关系。
可选的,所述替换指令单元,包括:
查找子单元,用于针对每个待裁剪的成员访问方法,根据已建立的依赖关系,查找该待裁剪成员访问方法的调用方法;
替换指令子单元,用于在所述信息中,将所述调用方法对该待裁剪成员访问方法的调用指令,替换为相应的直接访问指令;
处理权限描述符子单元,用于对该待裁剪成员访问方法所访问成员的访问权限描述符进行处理。
可选的,所述对相应被访问成员的访问权限描述符进行处理,包括:
将所述被访问成员的访问权限描述符设置为表征公有的预设符号。
本申请实施例虽然以较佳实施例公开如上,但其并不是用来限定本申请实施例,任何本领域技术人员在不脱离本申请实施例的精神和范围内,都可以做出可能的变动和修改,因此本申请实施例的保护范围应当以本申请实施例权利要求所界定的范围为准。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
Claims (14)
1.一种字节码优化方法,其特征在于,包括:
解析字节码文件,生成关于类及类中的属性和方法的信息;
从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令;
将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理;以及,
从所述信息中删除所述待裁剪的成员访问方法,并根据执行删除操作后的所述信息生成作为优化结果的字节码文件。
2.根据权利要求1所述的方法,其特征在于,所述从所述方法中选取待裁剪的成员访问方法,包括:从所述方法中选取属于预设类别的待裁剪的成员访问方法。
3.根据权利要求2所述的方法,其特征在于,所述预设类别包括以下类别之一或者任意组合:
来自源代码的属性值读取方法;
来自源代码的属性值写入方法;
由编译器生成的供内部类访问宿主类私有属性或私有方法的方法。
4.根据权利要求3所述的方法,其特征在于,当所述预设类别包括来自源代码的属性值读取方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,包括:
针对所述信息中的每个属性,执行下述操作:
至少根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值读取方法的名称、参数列表和返回值类型;
若通过对上述方法名称、参数列表和返回值类型的匹配判定所述信息中包括与该属性对应的属性值读取方法,则将所述属性值读取方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。
5.根据权利要求3所述的方法,其特征在于,当所述预设类别包括来自源代码的属性值写入方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,包括:
针对所述信息中的每个属性,执行下述操作:
至少根据该属性所属类以及属性名称和数据类型确定与该属性对应的属性值写入方法的名称、参数列表和返回值类型;
若通过对上述方法名称、参数列表和返回值类型的匹配判定所述信息中包括与该属性对应的属性值写入方法,则将所述属性值写入方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。
6.根据权利要求4或5所述的方法,其特征在于,在判定所述信息中包括与该属性对应的属性值读取方法或者属性值写入方法之后、在将所述属性值读取方法或者所述属性值写入方法选取为待裁剪的成员访问方法之前,还包括:
对所述属性值读取方法或者所述属性值写入方法进行校验,并将通过校验的所述属性值读取方法或者所述属性值写入方法选取为待裁剪的成员访问方法。
7.根据权利要求6所述的方法,其特征在于,对所述属性值读取方法或者所述属性值写入方法进行的校验,包括:
白名单校验、同步方法校验、指令序列校验、属性名校验、子类重载校验、和/或、继承父类或接口校验。
8.根据权利要求3所述的方法,其特征在于,当所述预设类别包括由编译器生成的供内部类访问宿主类私有属性或私有方法的方法时,所述从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令,包括:
针对所述信息中的每个方法,执行下述操作:
判断该方法的名称是否包含预设字符串,所述预设字符串是编译器生成的、用于标识供内部类访问宿主类私有属性或私有方法的方法的字符串;
若是,将该方法选取为待裁剪的成员访问方法,并构造相应的直接访问指令。
9.根据权利要求1所述的方法,其特征在于,所述构造相应的直接访问指令,包括:根据所选待裁剪的成员访问方法所属类别以及所述成员访问方法所执行访问操作的相关信息,构造相应的直接访问指令。
10.根据权利要求9所述的方法,其特征在于,所述根据所选待裁剪成员访问方法所属预设类别以及所述成员访问方法所执行访问操作的相关信息,构造相应的直接访问指令,包括:若所选待裁剪成员访问方法属于,来自源代码的属性值读取方法或者来自源代码的属性值写入方法,则根据被访问属性的属性类型构造相应的直接访问指令。
11.根据权利要求9所述的方法,其特征在于,根据所选待裁剪的成员访问方法所属类别以及所述成员访问方法所执行访问操作的相关信息,构造相应的直接访问指令,包括:
若所选待裁剪成员访问方法属于,由编译器生成的供内部类访问宿主类私有属性或私有方法的方法,则执行下述操作:若被访问成员为属性,则根据访问类型和属性类型,构造相应的直接访问指令;若被访问成员为方法,则根据方法类型构造相应的直接访问指令。
12.根据权利要求1所述的方法,其特征在于,在将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令之前,包括:为所述信息中的方法建立依赖关系;
所述将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并对相应被访问成员的访问权限描述符进行处理,包括:
针对每个待裁剪的成员访问方法,执行以下操作:
根据已建立的依赖关系,查找该待裁剪成员访问方法的调用方法;
在所述信息中,将所述调用方法对该待裁剪成员访问方法的调用指令,替换为相应的直接访问指令;
并对该待裁剪成员访问方法所访问成员的访问权限描述符进行处理。
13.根据权利要求1所述的方法,其特征在于,所述对相应被访问成员的访问权限描述符进行处理,包括:
将所述被访问成员的访问权限描述符设置为表征公有的预设符号。
14.一种字节码优化装置,其特征在于,包括:
生成信息单元,用于解析字节码文件,生成关于类及类中的属性和方法的信息;
选取方法和构造指令单元,用于从所述方法中选取待裁剪的成员访问方法,并构造相应的直接访问指令;
替换指令单元,用于将所述信息中对所述待裁剪的成员访问方法的调用指令,替换为相应的直接访问指令,并针对相应被访问成员的访问权限描述符进行处理;
删除单元,用于从所述信息中删除所述待裁剪的成员访问方法,并根据执行删除操作后的所述信息生成作为优化结果的字节码文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611235713.1A CN108614702B (zh) | 2016-12-28 | 2016-12-28 | 字节码优化方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611235713.1A CN108614702B (zh) | 2016-12-28 | 2016-12-28 | 字节码优化方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108614702A true CN108614702A (zh) | 2018-10-02 |
CN108614702B CN108614702B (zh) | 2022-02-11 |
Family
ID=63658417
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611235713.1A Active CN108614702B (zh) | 2016-12-28 | 2016-12-28 | 字节码优化方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108614702B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109032572A (zh) * | 2017-06-08 | 2018-12-18 | 阿里巴巴集团控股有限公司 | 一种基于字节码的java程序方法内联的方法 |
CN110609687A (zh) * | 2019-04-12 | 2019-12-24 | 北京字节跳动网络技术有限公司 | 一种编译方法、装置、电子设备和存储介质 |
CN110704074A (zh) * | 2019-09-12 | 2020-01-17 | 北京奇艺世纪科技有限公司 | 软件安装包处理方法、装置、电子设备及存储介质 |
CN111078279A (zh) * | 2019-12-20 | 2020-04-28 | 北京字节跳动网络技术有限公司 | 字节码文件的处理方法、装置、设备及存储介质 |
CN111090466A (zh) * | 2019-12-20 | 2020-05-01 | 北京字节跳动网络技术有限公司 | 调用指令的优化方法、装置、设备和存储介质 |
CN113157258A (zh) * | 2021-04-21 | 2021-07-23 | 北京鼎事兴教育咨询有限公司 | 信息处理方法、装置、存储介质及电子设备 |
CN114003317A (zh) * | 2021-10-29 | 2022-02-01 | 北京达佳互联信息技术有限公司 | 内联实现方法及装置、电子设备、存储介质及程序产品 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1158459A (zh) * | 1995-12-08 | 1997-09-03 | 太阳微系统有限公司 | 在保密解译程序中优化运行时调用专用变量函数的系统和方法 |
US20040205699A1 (en) * | 2003-04-08 | 2004-10-14 | Keim Dale O. | Generic embedded application technology architecture |
US20060107258A1 (en) * | 2004-11-10 | 2006-05-18 | Motoyasu Takabatake | Program, program code optimization method, program code compile method, program code, and information processing system |
CN101739280A (zh) * | 2008-11-11 | 2010-06-16 | 爱思开电讯投资(中国)有限公司 | 用于java卡的字节码优化系统和方法 |
US20110321018A1 (en) * | 2010-06-29 | 2011-12-29 | International Business Machines Corporation | Program, method, and system for code conversion |
CN103294457A (zh) * | 2012-02-27 | 2013-09-11 | 百度在线网络技术(北京)有限公司 | 动态替换主程序中c/c++函数的方法及装置 |
CN105404794A (zh) * | 2014-09-04 | 2016-03-16 | 腾讯科技(深圳)有限公司 | Java应用软件的保护方法和装置 |
-
2016
- 2016-12-28 CN CN201611235713.1A patent/CN108614702B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1158459A (zh) * | 1995-12-08 | 1997-09-03 | 太阳微系统有限公司 | 在保密解译程序中优化运行时调用专用变量函数的系统和方法 |
US20040205699A1 (en) * | 2003-04-08 | 2004-10-14 | Keim Dale O. | Generic embedded application technology architecture |
US20060107258A1 (en) * | 2004-11-10 | 2006-05-18 | Motoyasu Takabatake | Program, program code optimization method, program code compile method, program code, and information processing system |
CN101739280A (zh) * | 2008-11-11 | 2010-06-16 | 爱思开电讯投资(中国)有限公司 | 用于java卡的字节码优化系统和方法 |
US20110321018A1 (en) * | 2010-06-29 | 2011-12-29 | International Business Machines Corporation | Program, method, and system for code conversion |
CN103294457A (zh) * | 2012-02-27 | 2013-09-11 | 百度在线网络技术(北京)有限公司 | 动态替换主程序中c/c++函数的方法及装置 |
CN105404794A (zh) * | 2014-09-04 | 2016-03-16 | 腾讯科技(深圳)有限公司 | Java应用软件的保护方法和装置 |
Non-Patent Citations (1)
Title |
---|
张昱等: "一种Java字节码优化框架", 《计算机工程》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109032572A (zh) * | 2017-06-08 | 2018-12-18 | 阿里巴巴集团控股有限公司 | 一种基于字节码的java程序方法内联的方法 |
CN110609687A (zh) * | 2019-04-12 | 2019-12-24 | 北京字节跳动网络技术有限公司 | 一种编译方法、装置、电子设备和存储介质 |
CN110704074A (zh) * | 2019-09-12 | 2020-01-17 | 北京奇艺世纪科技有限公司 | 软件安装包处理方法、装置、电子设备及存储介质 |
CN111078279A (zh) * | 2019-12-20 | 2020-04-28 | 北京字节跳动网络技术有限公司 | 字节码文件的处理方法、装置、设备及存储介质 |
CN111090466A (zh) * | 2019-12-20 | 2020-05-01 | 北京字节跳动网络技术有限公司 | 调用指令的优化方法、装置、设备和存储介质 |
CN113157258A (zh) * | 2021-04-21 | 2021-07-23 | 北京鼎事兴教育咨询有限公司 | 信息处理方法、装置、存储介质及电子设备 |
CN114003317A (zh) * | 2021-10-29 | 2022-02-01 | 北京达佳互联信息技术有限公司 | 内联实现方法及装置、电子设备、存储介质及程序产品 |
Also Published As
Publication number | Publication date |
---|---|
CN108614702B (zh) | 2022-02-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108614702A (zh) | 字节码优化方法及装置 | |
US9430224B2 (en) | Hot-update method and apparatus | |
US7716641B2 (en) | Method and system for automatically identifying and marking subsets of localizable resources | |
US6941546B2 (en) | Method and apparatus for testing a software component using an abstraction matrix | |
US7318215B1 (en) | Stored procedure interface language and tools | |
CN111090433B (zh) | 一种数据处理的方法、装置和存储介质 | |
US7277827B2 (en) | Device testing framework for creating device-centric scenario-based automated tests | |
CN107943485B (zh) | 一种补丁编译平台及补丁编译方法 | |
JP2010507165A (ja) | ソースコード内のセキュリティ脆弱性の検出 | |
CN108647025A (zh) | 文档对象模型中节点的处理方法及装置、电子和存储设备 | |
JP3230467B2 (ja) | Gdmoトランスレータ及びgdmoトランスレーション方法並びにgdmoトランスレータプログラムを記録した記録媒体 | |
CN108595187A (zh) | 安卓安装包集成软件开发工具包的法、装置及存储介质 | |
CN110968437A (zh) | 一种基于Java智能合约的单个合约并行执行的方法、装置、设备及介质 | |
CN109032631A (zh) | 应用程序补丁包获取方法、装置、计算机设备及存储介质 | |
CN107832059A (zh) | 一种基于Makefile的代码静态分析方法和装置 | |
CN106021566A (zh) | 一种提高单台数据库并发处理能力的方法、装置及系统 | |
CN107800730A (zh) | 一种虚拟磁盘的扩容方法以及装置 | |
CN111078279A (zh) | 字节码文件的处理方法、装置、设备及存储介质 | |
CN111857860A (zh) | 一种安全加载插件的实现方法及系统 | |
CN109918113A (zh) | Ios应用热修复/热更新方法、服务器及存储介质 | |
CN113535141A (zh) | 数据库操作代码的生成方法及装置 | |
US8935657B2 (en) | Model-to-model transformation by kind | |
CN115576903B (zh) | 一种文件系统构建方法、计算设备及存储介质 | |
CN111881056A (zh) | 一种自动化测试框架及测试方法 | |
CN111625225A (zh) | 一种程序指定数据输出方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |