无用类检测方法及装置与流程

文档序号:12550566阅读:366来源:国知局
无用类检测方法及装置与流程

本申请涉及通信领域,尤其涉及一种无用类检测方法及装置。



背景技术:

Android是一个以Linux为基础的开放源代码移动设备操作系统,由于其开放性和可移植性,因此被大部分电子产品广泛采用。然而,随着无线端Android工程快速迭代,系统代码量剧增,无用类也逐渐堆积,对系统的开发和维护造成不便。



技术实现要素:

本申请提出一种无用类检测方法,该方法包括:

创建初始化的无用类集合以及有用类文件集合;

将所述无用类集合中的类名在初始化的有用类文件集合中进行迭代匹配,以移除所述无用类集合中的有用类的类名;

当所述无用类集合中的有用类的类名被移除后,将所述无用类集合作为无用类检测结果输出。

可选的,所述创建初始化的无用类集合以及有用类文件集合包括:

识别目标目录中的类文件;

将识别出的所述类文件与预设的有用类样本进行匹配以检测所述类文件中的无用类和有用类;

基于检测出的所述有用类的类名创建初始化的有用类集合;

基于检测出的所述有用类的类文件创建所述初始化的有用类文件集合;

基于检测出的所述无用类的类名创建所述初始化的无用类集合。

可选的,所述预设的有用类样本包括预设的有用类白名单列表、有用类目录列表、有用类类名特征列表和有用类文件特征列表中的一个或者多个;

所述识别目标目录中的类文件之前,所述方法还包括:

基于预设的代码清理工具清除所述目标目录中的无效代码。

可选的,所述将所述无用类集合中的类名在初始化的有用类文件集合中进行迭代匹配,以移除所述无用类集合中的有用类的类名包括:

遍历所述无用类集合;

将所述无用类集合中的类名依次与所述有用类文件集合中的类文件进行匹配;

当在所述有用类文件集合中的类文件中匹配到所述无用类集合中的类名时,将所述类名作为有用类的类名移入所述有用类集合,以及将所述类名对应的类文件作为有用类的类文件移入所述有用类文件集合。

可选的,所述方法还包括:

当将所述类名作为有用类的类名移入所述有用类集合,以及将所述类名对应的类文件作为有用类的类文件移入所述有用类文件集合后,将预设的有用类标记设定为第一标记;所述第一标记用于标识所述有用类集合中新加入了有用类的类名;

当在所述有用类文件集合中的所有类文件中均未匹配到所述无用类集合中的类名时,将预设的有用类标记设定为第二标记;所述第二标记用于标识所述有用类集合中未新加入有用类的类名。

可选的,所述方法还包括:

读取所述预设的有用类标记;

判断读取到的所述有用标记是否为所述第一标记;

当判断出所述有用类标记为所述第一标记时,重新遍历所述无用类集合,将所述无用类集合中的类名依次与所述有用类文件集合中的类文件进行匹配,直到判断出所述有用类标记为所述第二标记时匹配结束。

本申请还提出一种无用类检测装置,该装置包括:

创建模块,用于创建初始化的无用类集合以及有用类文件集合;

匹配模块,用于将所述无用类集合中的类名在初始化的有用类文件集合中进行迭代匹配,以移除所述无用类集合中的有用类的类名;

输出模块,用于当所述无用类集合中的有用类的类名被移除后,将所述无用类集合作为无用类检测结果输出。

可选的,所述创建模块具体用于:

识别目标目录中的类文件;

将识别出的所述类文件与预设的有用类样本进行匹配以检测所述类文件中的无用类和有用类;

基于检测出的所述有用类的类名创建初始化的有用类集合;

基于检测出的所述有用类的类文件创建所述初始化的有用类文件集合;

基于检测出的所述无用类的类名创建所述初始化的无用类集合。

可选的,所述预设的有用类样本包括预设的有用类白名单列表、有用类目录列表、有用类类名特征列表和有用类文件特征列表中的一个或者多个;

所述创建模块进一步用于:

在识别目标目录中的类文件之前,基于预设的代码清理工具清除所述目标目录中的无效代码。

可选的,所述匹配模块具体用于:

遍历所述无用类集合;

将所述无用类集合中的类名依次与所述有用类文件集合中的类文件进行匹配;

当在所述有用类文件集合中的类文件中匹配到所述无用类集合中的类名时,将所述类名作为有用类的类名移入所述有用类集合,以及将所述类名对应的类文件作为有用类的类文件移入所述有用类文件集合。

可选的,所述匹配模块进一步用于:

当将所述类名作为有用类的类名移入所述有用类集合,以及将所述类名 对应的类文件作为有用类的类文件移入所述有用类文件集合后,将预设的有用类标记设定为第一标记;所述第一标记用于标识所述有用类集合中新加入了有用类的类名;

当在所述有用类文件集合中的所有类文件中均未匹配到所述无用类集合中的类名时,将预设的有用类标记设定为第二标记;所述第二标记用于标识所述有用类集合中未新加入有用类的类名。

可选的,所述匹配模块进一步用于:

读取所述预设的有用类标记;

判断读取到的所述有用标记是否为所述第一标记;

当判断出所述有用类标记为所述第一标记时,重新遍历所述无用类集合,将所述无用类集合中的类名依次与所述有用类文件集合中的类文件进行匹配,直到判断出所述有用类标记为所述第二标记时匹配结束。

本申请中,通过创建初始化的无用类集合以及有用类文件集合,将所述无用类集合中的类名在初始化的有用类文件集合中进行迭代匹配,以移除所述无用类集合中的有用类的类名,当所述无用类集合中的有用类的类名被移除后,将所述无用类集合作为无用类检测结果输出,由于本申请中在进行无用类的检测时,可以充分考虑无用类的类名与有用类的类文件之间的引用关系,从而可以更加高效的检测无用类文件,为清理系统冗余代码提供依据。

附图说明

图1是本申请一实施例提供的一种无用类检测方法的流程图;

图2是本申请一实施例提供的一种迭代匹配的流程图;

图3是本申请一实施例提供的一种无用类检测装置的逻辑框图;

图4是本申请一实施例提供的承载所述一种无用类检测装置的客户端的硬件结构图。

具体实施方式

在相关技术中,在对android无线端的进行代码清理时,通常是基于PMD或者UCDetector等代码清理工具来完成。

然而,PMD工具通常只能扫描无用的私有方法、私有属性,以及代码段内的无用代码和变量定义,对于其它类型的代码段无法识别其有用性,而且PMD工具也不具备类级别的扫描能力。

UCDetector工具虽然可以通过配置有用类白名单,扫描出标准android工程中的无用类,然而UCDetector在进行无用类扫描时,并没有考虑类之间的引用关系,因此对于提供API的android工程(提供API的android工程中会存在引用该API的类),UCDetector工具将无法准确定义出有用类集合,因而无法扫描出该项目中的所有无用类。

可见,现有的代码清理工具已无法满足实际工作场景中的代码清理需求。

有鉴于此,本申请提出一种无用类检测方法,通过创建初始化的无用类集合以及有用类文件集合,将所述无用类集合中的类名在初始化的有用类文件集合中进行迭代匹配,以移除所述无用类集合中的有用类的类名,当所述无用类集合中的有用类的类名被移除后,将所述无用类集合作为无用类检测结果输出,由于本申请中在进行无用类的检测时,可以充分考虑无用类的类名与有用类的类文件之间的引用关系,从而实现了可以更加高效的检测无用类文件,为清理系统冗余代码提供依据。

下面通过具体实施例并结合具体的应用场景对本申请进行描述。

请参考图1,图1是本申请一实施例提供的一种无用类检测方法,应用于客户端,所述方法执行以下步骤:

步骤101,创建初始化的无用类集合以及有用类文件集合;

步骤102,将所述无用类集合中的类名在初始化的有用类文件集合中进行迭代匹配,以移除所述无用类集合中的有用类的类名;

步骤103,当所述无用类集合中的有用类的类名被移除后,将所述无用 类集合作为无用类检测结果输出。

上述客户端可以包括面向软件开发人员提供无用类检测服务的客户端软件;例如,以android工程的开发为例,该客户端软件可以是用于面向android开发人员提供无用类检测服务的无用类检测工具,开发人员可以通过该无用类检测工具对已创建的android工程进行无用类检测。

其中,承载上述客户端软件的硬件环境,在本实施例中不进行特别限定;例如,可以是PC主机、移动终端或者服务器。

以下以上述客户端软件为面向android开发人员提供无用类检测服务的无用类检测工具为例进行说明。

在本实施例中,当开发人员在对已创建的android工程进行无用类检测时,客户端软件可以将该android工程下的所有目录作为目标目录进行递归扫描,来识别该android工程的所有类文件。

其中,对于android工程来说,由于android工程使用java语言作为实现语言,因此该android工程的类文件通常为扩展名为java的系统文件,客户端软件在识别类文件时,可以对android工程所有目录中扩展名为java的系统文件进行识别。

另外,客户端软件在识别该android工程下的所有类文件之前,还可以基于预设的代码清理工具清除目标目录中的无效代码,从而可以避免无用类被引用到有用类的无用成员变量或者无用代码段等无效代码中。

在本实施例中,当识别出该android工程的所有类文件时后,客户端软件可以将已识别出的所有类文件与预设的有用类样本进行匹配,来检测该android工程下的所有类文件中的有用类和无用类。

其中,该预设的有用类样本可以包括由开发人员自定义的有用类白名单列表、有用类目录列表、有用类类名特征列表和有用类文件特征列表中的一个或者多个。

例如,在实现时,开发人员可以预先定义出whiteList变量、usedDirList变量、usedNamePrefList变量和usedContentPrefList变量四种变量。

其中,whiteList变量,即为有用类白名单列表,表示不需要进行处理的类的集合,该列表中的类均为有用类。usedDirList变量,即为有用类目录列表,该列表下的目录均为有用类目录,有用类目录中的类均为有用类。usedNamePrefList变量,即为有用类类名特征列表,该列表中包括若干有用类的类名特征字符,如果该列表中的字符在类名中出现,则该类为有用类。usedContentPrefList变量,即为有用类文件特征列表,该列表中包括若干有用类的类文件的特征字符,如果该列表中的字符在类文件(即类的内容)中出现,则该类为有用类。

基于此,客户端软件在检测已经识别出的所有类文件中的有用类和无用类时,可以将识别出的所有类文件在以上四种列表中分别进行匹配,如果匹配成功,则表明该类文件为有用类,如果匹配不成功,表明该类文件为无用类。通过这种方式,客户端软件可以检测出所有识别出的类文件中的有用类和无用类。

当检测出所有识别出的类文件中的有用类和无用类后,客户端软件可以基于检测出的所有有用类的类名创建初始化的有用类集合;可以基于所有有用类的文件路径读取类文件,并基于读取到的类文件创建初始化的有用类文件集合(即有用类的内容集合);还可以基于检测出的所有无用类的类名创建初始化的无用类集合。

其中,对于创建完成的初始化的无用类集合,客户端软件还可以记录该集合中所有无用类的文件路径,从而在后续的迭代匹配中,当该集合中的无用类成为有用类后,便于基于该文件路径将该无用类的类文件加载到上述有用类文件集合中。

在本实施例中,由于初始化的无用类集合中,可能会存在被有用类的类文件引用的类名,而android工程中通常是按照类名来使用类,因此在代码规范的android工程中,一旦某个无用类集合中的类名在有用类文件集合中的类文件中可被匹配到,那么与该类名对应的类文件一定被使用到,此时该类名被有用类文件集合中的类文件所引用,因而与该类名对应的类文件为有 用类。

从这个角度出发,当客户端软件创建出初始化的有用类文件集合、有用类文件集合以及无用类集合后,可以通过将无用类集合中的类名依次与有用类文件集合中的类文件进行匹配,来检测无用类集合中的有用类的类名。

请参见图2,图2为本实施例示出的一种客户端软件将无用类集合中的类名在有用类文件集合中进行迭代匹配的流程图。

客户端软件在开始将无用类集合中的类名在有用类文件集合中进行迭代匹配之前,可以为有用类集合预设一个有用类标记。

其中,该有用类标记可以包括第一标记和第二标记,该第一标记用于标识该有用类集合中新加入了有用类的类名,该第二标记可以用于标识该有用类集合中未新加入有用类的类名。

例如,客户端软件可以为有用类集合预设一个作为上述有用类标记的标记位,并为该标记位定义第一标记和第二标记两种标记取值。

请参见图2,客户端软件在将无用类集合中的类名在有用类文件集合中进行迭代匹配时,首先可以将该有用类标记设置为默认标记,其中该默认标记可以是第一标记也可以是第二标记。

例如,该第一标记可以是为有用类集合预设的一个标记T,该第二标记可以是为有用类集合预设的一个标记F,客户端软件在将该有用类标记设置为默认标记时,可以将该有用类标记设置为标记F也可以设置为标记T(图2中示出的该默认标记为标记F)。

请继续参见图2,当客户端软件将该有用类标记设置为默认标记后,客户端软件可以遍历无用类集合,将无用类集合中的类名依次与有用类文件集合中的类文件进行匹配,来检测无用类集合中的有用类的类名。

一方面,如果在有用类文件集合中的类文件中匹配到该无用类集合中的某一类名时,此时该类名被有用的类文件引用,该类名对应的类文件为有用类,客户端软件可以将该类名作为有用类的类名移入有用类集合,同时还可以基于预先记录的该类名的文件路径,将该类名对应的类文件作为有用类的 类文件移入有用类文件集合。

当客户端软件将该类名作为有用类的类名移入有用类集合,以及将该类名对应的类文件作为有用类的类文件移入有用类文件集合后,此时客户端软件可以将上述有用类标记设置为第一标记(图2示出的第一标记为标记T),以标识该有用类集合中新加入了有用类的类名。

其中,客户端软件在将上述有用类标记设置为第一标记时,如果客户端软件为该有用类标记设置的默认标记为第二标记,此时客户端可以将该有用类标记由第二标记更改为第一标记,然后客户端软件可以在无用类集合中读取下一个类名与有用类文件集合中的类文件继续进行匹配,以此类推,直到无用类集合中的类名均匹配完成。如果客户端软件为该有用类标记设置的默认标记为第一标记,此时客户端可以不做更改,直接在无用类集合中读取下一个类名与有用类文件集合中的类文件继续进行匹配,以此类推,直到无用类集合中的类名均匹配完成。

另一方面,如果在有用类文件集合中的类文件中未匹配到该无用类集合中的某一类名,此时该类名未被有用类的类文件引用,该类名对应的类文件为无用类,客户端软件可以在无用类集合中读取下一个类名与有用类文件集合中的类文件继续进行匹配,以此类推,直到无用类集合中的类名均匹配完成。

当然,如果在有用类文件集合中的类文件中均未匹配到该无用类集合中类名,此时该无用类集合中的类名均未被有用类的类文件引用,该无用类集合中的类名对应的类文件均为无用类,在这种情况下,客户端可以将上述有用类标记设置为第二标记(图2示出的第二标记为标记F),以标识该有用类集合中未新加入有用类的类名。

其中,客户端软件在将上述有用类标记设置为第二标记时,如果该有用类标记被客户端默认设置为第一标记,此时客户端可以将该有用类标记由第一标记更改为第二标记,如果该有用类标记被客户端默认设置为第二标记,此时客户端可以不做更改,此时本轮迭代结束。

以上结合图2描述了客户端软件在将无用类集合中的类名在有用类文件集合中进行迭代匹配时的一轮迭代的过程。

在本实施例中,在一轮迭代结束后,如果有用类集合中新加入了有用类的类名后,此时无用类集合中可能仍然存在被该新加入的有用类的类文件所使用到的类名,即被该新加入的有用类的类文件所引用的类名。

因此,在这种情况下,如果有用类集合中新加入了有用类的类名,此时客户端软件可以继续开始下一轮迭代,直到无用类集合中不再有新的有用类的类名加入时停止。

请继续参见图2,当一轮迭代结束后,客户端软件可以读取上述有用类标记,并判断读取到的所述有用标记是否为所述第一标记。

如果客户端软件判断出该有用类标记为第一标记时,此时无用类集合中仍然可能存在有用类的类名,客户端软件可以按照以上迭代过程进行下一轮的迭代,将有用类标记设置为默认标记,并重新遍历无用类集合,将所述无用类集合中的类名依次与有用类文件集合中的类文件进行匹配,具体过程不再赘述。

可见,通过这种方式,客户端软件通过反复的迭代,可以不断将无用类集合中的有用类的类名移出无用类集合,而移入到有用类集合。

请继续参见图2,当客户端软件通过反复迭代后,最终判断出读取到的有用标记为第二标记时,无用类集合中的有用类的类名已全部移入到有用类集合,此时迭代匹配结束,无用类集合中剩下的类名即为最终的无用类检测结果。

此时,客户端软件可以将当前的无用类集合作为无用类检测结果向开发人员输出,开发人员可以基于客户端软件输出的该无用类检测结果,清除当前android工程中的无用类。

可见,通过这种方式,可以充分考虑无用类的类名与有用类的类文件之间的引用关系,可以避免诸如UCDetector工具由于未考虑类之间的引用关系,而无法无准确定义出有用类集合,因而无法扫描出android工程中的所有无 用类的问题。从而更加高效的检测无用类文件。

另外,值得说明的是,图2示出流程中,客户端开始将无用类集合中的类名在有用类文件集合中进行迭代匹配时,在另一种实现方式中也可以不为该有用类标记设置默认标记,而是直接执行后续的匹配步骤,遍历所述无用类集合,将无用类集合中的类名依次与有用类文件集合中的类文件进行匹配,直到一轮迭代结束后,再根据迭代结果来为该标记位设置第一标记或者第二标记,然后客户端软件可以通过判断该有用类标记是否为第一标记来确定是否开始下一轮的迭代。

例如,客户端软件仍然可以为该有用类集合预设一个作为上述有用类标记的标记位,并为该标记位定义第一标记和第二标记两种标记取值,而在迭代匹配开始时仅保留该标记位,客户端软件并不为该标记为设置具体的标记取值,而是直接执行后续的匹配步骤,直到一轮迭代结束后,再根据迭代结果来为该标记位设置第一标记或者第二标记,不再赘述。

在以上实施例中,通过创建初始化的无用类集合以及有用类文件集合,将所述无用类集合中的类名在初始化的有用类文件集合中进行迭代匹配,以移除所述无用类集合中的有用类的类名,当所述无用类集合中的有用类的类名被移除后,将所述无用类集合作为无用类检测结果输出,由于本申请中在进行无用类的检测时,可以充分考虑无用类的类名与有用类的类文件之间的引用关系,从而实现了可以更加高效的检测无用类文件,为清理系统冗余代码提供依据。

与上述方法实施例相对应,本申请还提供了装置的实施例。

请参见图3,本申请提出一种无用类检测装置30,应用于客户端;其中,请参见图4,作为承载所述无用类检测装置30的客户端所涉及的硬件架构中,通常包括CPU、内存、非易失性存储器、网络接口以及内部总线等;以软件实现为例,所述无用类检测装置30通常可以理解为加载在内存中的计算机程序,通过CPU运行之后形成的软硬件相结合的逻辑装置,所述装置30包括:

创建模块301,用于创建初始化的无用类集合以及有用类文件集合;

匹配模块302,用于将所述无用类集合中的类名在初始化的有用类文件集合中进行迭代匹配,以移除所述无用类集合中的有用类的类名;

输出模块303,用于当所述无用类集合中的有用类的类名被移除后,将所述无用类集合作为无用类检测结果输出。

在本实施例中,所述创建模块301具体用于:

识别目标目录中的类文件;

将识别出的所述类文件与预设的有用类样本进行匹配以检测所述类文件中的无用类和有用类;

基于检测出的所述有用类的类名创建初始化的有用类集合;

基于检测出的所述有用类的类文件创建所述初始化的有用类文件集合;

基于检测出的所述无用类的类名创建所述初始化的无用类集合。

在本实施例中,所述预设的有用类样本包括预设的有用类白名单列表、有用类目录列表、有用类类名特征列表和有用类文件特征列表中的一个或者多个;

所述创建模块301进一步用于:

在识别目标目录中的类文件之前,基于预设的代码清理工具清除所述目标目录中的无效代码。

在本实施例中,所述匹配模块302具体用于:

遍历所述无用类集合;

将所述无用类集合中的类名依次与所述有用类文件集合中的类文件进行匹配;

当在所述有用类文件集合中的类文件中匹配到所述无用类集合中的类名时,将所述类名作为有用类的类名移入所述有用类集合,以及将所述类名对应的类文件作为有用类的类文件移入所述有用类文件集合。

在本实施例中,所述匹配模块302进一步用于:

当将所述类名作为有用类的类名移入所述有用类集合,以及将所述类名对应的类文件作为有用类的类文件移入所述有用类文件集合后,将预设的有 用类标记设定为第一标记;所述第一标记用于标识所述有用类集合中新加入了有用类的类名;

当在所述有用类文件集合中的所有类文件中均未匹配到所述无用类集合中的类名时,将预设的有用类标记设定为第二标记;所述第二标记用于标识所述有用类集合中未新加入有用类的类名。

在本实施例中,所述匹配模块302进一步用于:

读取所述预设的有用类标记;

判断读取到的所述有用标记是否为所述第一标记;

当判断出所述有用类标记为所述第一标记时,重新遍历所述无用类集合,将所述无用类集合中的类名依次与所述有用类文件集合中的类文件进行匹配,直到判断出所述有用类标记为所述第二标记时匹配结束。

本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。

应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。

以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1