发明内容
本申请实施例提供一种应用程序的冗余资源处理方法、装置、设备及存储介质,以达到以较高的处理速度查找应用程序的冗余资源的目的。
第一方面,本申请实施例提供一种应用程序的冗余资源处理方法,包括:
通过遍历应用程序的可扩展标记语言文件,查找资源引用数据,该资源引用数据包括资源引用标识和被引用资源的第一资源索引;
根据查找到的资源引用数据中包括的第一资源索引确定被引用资源,并按照第一修改方式修改确定的被引用资源的引用计数的计数值;
通过遍历应用程序的代码指令,查找资源引用代码指令,该资源引用代码指令包括被引用资源的第二资源索引;
根据查找到的资源引用代码指令中包括的第二资源索引确定被引用资源,并按照上述第一修改方式修改确定的被引用资源的引用计数的计数值;
查找引用计数的计数值为设定值的第一冗余资源,资源的引用计数的计数值为设定值表示本资源未被引用;
获取应用程序的资源引用关系集合,资源引用关系集合包括多个资源节点,每个资源节点对应一个资源,包括所对应资源的第三资源索引和被所对应资源引用的资源的第三资源索引;
分别以查找到的每个第一冗余资源为根节点遍历上述资源引用关系集合,根据遍历到的资源节点中包括的第三资源索引确定被引用资源,并按照第二修改方式修改确定的被引用资源的引用计数的计数值;
查找引用计数的计数值为设定值的第二冗余资源;
其中,上述第一修改方式使用的单位修改量与上述第二修改方式使用的单位修改量为相反数,单位修改量为单次确定被引用资源对应的引用计数的计数值的修改量。
本申请实施例提供的冗余资源处理方法,通过遍历可扩展标记语言文件和代码指令的方式确定被引用资源,按照第一修改方式修改被引用资源的引用计数的计数值。那么就可以通过资源的计数值发现未被引用的资源,即冗余资源(第一冗余资源)。若某资源仅被冗余资源引用,那么该资源也是冗余资源,为了发现这部分冗余资源,利用第一冗余资源对资源引用关系集合进行遍历,按照第二修改方式修改遍历到的被引用资源的引用计数的计数值,由于两种修改方式的单位修改量是相反数,就意味着通过这次修改,删除之前被冗余资源引用所带来的计数值修改痕迹,若某资源仅被冗余资源引用,经过这次修改后,则可以通过资源的计数值发现其为冗余资源(第二冗余资源)。可见,本申请实施例提供的方法,通过引用计数统计的方式自动查找冗余资源,较之人工查找方式效率更高。
在此基础上,还可以利用上述应用程序的各个资源的资源类型、资源名称和标识常量,生成基于哈希存储结构的数据集合。
相应的,上述根据查找到的资源引用数据中包括的第一资源索引确定被引用资源,其实现方式可以是:根据查找到的资源引用数据中包括的第一资源索引,在上述基于哈希存储结构的数据集合中确定被引用资源,第一资源索引包括资源类型和资源名称。
相应的,上述根据查找到的资源引用代码指令中包括的第二资源索引确定被引用资源,其实现方式可以是:根据查找到的资源引用代码指令中包括的第二资源索引,在上述基于哈希存储结构的数据集合中确定被引用资源,第二资源索引包括:标识常量,或者,资源类型和资源名称。
相应的,上述根据遍历到的资源节点中包括的第三资源索引确定被引用资源,其实现方式可以是:根据遍历到的资源节点中包括的第三资源索引,在上述基于哈希存储结构的数据集合中确定被引用资源,第三资源索引包括:标识常量,或者,资源类型和资源名称。
应当指出的是,在根据第一资源索引、第二资源索引、第三资源索引确定被引用资源时,也可以直接在应用程序的R文件中检索被引用资源,但需要逐条遍历R文件的每行数据,检索效率低。本申请实施例提供的方法,另外构造基于哈希存储结构的数据集合,利用第一资源索引、第二资源索引、第三资源索引在该数据集合中定位被引用资源,利用哈希存储结构快速定位的结构优势,可提高检索效率。
在上述任意方法实施例的基础上,上述获取应用程序的资源引用关系集合,其实现方式可以是:根据查找到的资源引用数据获取应用程序的资源引用关系集合。
本申请实施例提供的方法,可以通过遍历一次可扩展标记语言文件,即确定被引用资源,也获得资源间的引用关系,优化处理过程,提高处理效率。
在上述任意方法实施例的基础上,上述分别以查找到的每个第一冗余资源为根节点遍历所述资源引用关系集合,其实现方式可以是:将各个第一冗余资源添加到队列中;依次从所述队列中读取第一冗余资源作为根节点遍历上述资源引用关系集合。
本申请实施例提供的方法,将第一冗余资源添加到队列中,利用队列先进先出的特性,可以在确定第一冗余资源的过程中,利用已经确定了的第一冗余资源对资源引用关系集合进行遍历,进一步提高处理效率。
在上述任意方法实施例的基础上,上述查找引用计数的计数值为设定值的第二冗余资源,其实现方式可以是:
在第一冗余资源之外的资源中查找引用计数的计数值为设定值的第二冗余资源。
本申请实施例提供的方法,可以在全部资源范围内再次查找冗余资源,也可以仅在第一冗余资源之外的资源中查找冗余资源,以缩小查找范围,进一步提高处理效率。
在上述任意方法实施例的基础上,按照第一修改方式修改确定的被引用资源的引用计数的计数值,其实现方式可以是:每根据第一资源索引或第二资源索引确定一次被引用资源,将本次确定的被引用资源的引用计数的计数值加1;按照第二修改方式修改确定的被引用资源的引用计数的计数值,其实现方式可以是:每根据第三资源索引确定一次被引用资源,将本次确定的被引用资源的引用计数的计数值减1。
本申请实施例中,将单位修改量确定为1,且修改方式为加1或减1,其处理方式简单、快速。
在上述任意方法实施例的基础上,可以输出上述第一冗余资源和上述第二冗余资源,也可以直接删除上述第一冗余资源和上述第二冗余资源。
具体是将冗余资源的查找结果通知给用户,还是自动删除查找到的冗余资源,可以在实际应用中根据情况和需求确定。
第二方面,本申请实施例提供一种应用程序的冗余资源处理装置,包括:
第一遍历模块,用于通过遍历应用程序的可扩展标记语言文件,查找资源引用数据,该资源引用数据包括资源引用标识和被引用资源的第一资源索引;
第一计数模块,用于根据查找到的资源引用数据中包括的第一资源索引确定被引用资源,并按照第一修改方式修改确定的被引用资源的引用计数的计数值;
第二遍历模块,用于通过遍历应用程序的代码指令,查找资源引用代码指令,该资源引用代码指令包括被引用资源的第二资源索引;
第二计数模块,用于根据查找到的资源引用代码指令中包括的第二资源索引确定被引用资源,并按照第一修改方式修改确定的被引用资源的引用计数的计数值;
第一冗余资源查找模块,用于查找引用计数的计数值为设定值的第一冗余资源,资源的引用计数的计数值为设定值表示本资源未被引用;
引用关系集合获取模块,用于获取应用程序的资源引用关系集合,该资源引用关系集合包括多个资源节点,每个资源节点对应一个资源,包括所对应资源的第三资源索引和被所对应资源引用的资源的第三资源索引;
第三计数模块,用于分别以查找到的每个第一冗余资源为根节点遍历上述资源引用关系集合,根据遍历到的资源节点中包括的第三资源索引确定被引用资源,并按照第二修改方式修改确定的被引用资源的引用计数的计数值;
第二冗余资源查找模块,用于查找引用计数的计数值为设定值的第二冗余资源;
其中,上述第一修改方式使用的单位修改量与所述第二修改方式使用的单位修改量为相反数,上述单位修改量为单次确定被引用资源对应的引用计数的修改量。
本申请实施例提供的冗余资源处理装置,通过遍历可扩展标记语言文件和代码指令的方式确定被引用资源,按照第一修改方式修改被引用资源的引用计数的计数值。那么就可以通过资源的计数值发现未被引用的资源,即冗余资源(第一冗余资源)。若某资源仅被冗余资源引用,那么该资源也是冗余资源,为了发现这部分冗余资源,利用第一冗余资源对资源引用关系集合进行遍历,按照第二修改方式修改遍历到的被引用资源的引用计数的计数值,由于两种修改方式的单位修改量是相反数,就意味着通过这次修改,删除之前被冗余资源引用所带来的计数值修改痕迹,若某资源仅被冗余资源引用,经过这次修改后,则可以通过资源的计数值发现其为冗余资源(第二冗余资源)。可见,本申请实施例提供的装置,通过引用计数统计的方式自动查找冗余资源,较之人工查找方式效率更高。
在此基础上,还可以包括数据集合生成模块,用于利用上述应用程序的各个资源的资源类型、资源名称和标识常量,生成基于哈希存储结构的数据集合。
相应的,上述第一计数模块根据查找到的资源引用数据中包括的第一资源索引确定被引用资源,其实现方式可以是:根据查找到的资源引用数据中包括的第一资源索引,在上述基于哈希存储结构的数据集合中确定被引用资源,第一资源索引包括资源类型和资源名称。
相应的,上述第二计数模块根据查找到的资源引用代码指令中包括的第二资源索引确定被引用资源,其实现方式可以是:根据查找到的资源引用代码指令中包括的第二资源索引,在上述基于哈希存储结构的数据集合中确定被引用资源,第二资源索引包括:标识常量,或者,资源类型和资源名称。
相应的,上述第三计数模块根据遍历到的资源节点中包括的第三资源索引确定被引用资源,其实现方式可以是:根据遍历到的资源节点中包括的第三资源索引,在上述基于哈希存储结构的数据集合中确定被引用资源,第三资源索引包括:标识常量,或者,资源类型和资源名称。
应当指出的是,在根据第一资源索引、第二资源索引、第三资源索引确定被引用资源时,也可以直接在应用程序的R文件中检索被引用资源,但需要逐条遍历R文件的每行数据,检索效率低。本申请实施例提供的装置,另外构造基于哈希存储结构的数据集合,利用第一资源索引、第二资源索引、第三资源索引在该数据集合中定位被引用资源,利用哈希存储结构快速定位的结构优势,可提高检索效率。
在上述任意装置实施例的基础上,上述获取应用程序的资源引用关系集合,其实现方式可以是:根据查找到的资源引用数据获取应用程序的资源引用关系集合。
本申请实施例提供的装置,可以通过遍历一次可扩展标记语言文件,即确定被引用资源,也获得资源间的引用关系,优化处理过程,提高处理效率。
在上述任意装置实施例的基础上,上述分别以查找到的每个第一冗余资源为根节点遍历所述资源引用关系集合,其实现方式可以是:将各个第一冗余资源添加到队列中;依次从所述队列中读取第一冗余资源作为根节点遍历上述资源引用关系集合。
本申请实施例提供的装置,将第一冗余资源添加到队列中,利用队列先进先出的特性,可以在确定第一冗余资源的过程中,利用已经确定了的第一冗余资源对资源引用关系集合进行遍历,进一步提高处理效率。
在上述任意装置实施例的基础上,上述查找引用计数的计数值为设定值的第二冗余资源,其实现方式可以是:
在第一冗余资源之外的资源中查找引用计数的计数值为设定值的第二冗余资源。
本申请实施例提供的装置,可以在全部资源范围内再次查找冗余资源,也可以仅在第一冗余资源之外的资源中查找冗余资源,以缩小查找范围,进一步提高处理效率。
在上述任意装置实施例的基础上,按照第一修改方式修改确定的被引用资源的引用计数的计数值,其实现方式可以是:每根据第一资源索引或第二资源索引确定一次被引用资源,将本次确定的被引用资源的引用计数的计数值加1;按照第二修改方式修改确定的被引用资源的引用计数的计数值,其实现方式可以是:每根据第三资源索引确定一次被引用资源,将本次确定的被引用资源的引用计数的计数值减1。
本申请实施例中,将单位修改量确定为1,且修改方式为加1或减1,其处理方式简单、快速。
在上述任意装置实施例的基础上,可以输出上述第一冗余资源和上述第二冗余资源,也可以直接删除上述第一冗余资源和上述第二冗余资源。
具体是将冗余资源的查找结果通知给用户,还是自动删除查找到的冗余资源,可以在实际应用中根据情况和需求确定。
第三方面,本申请实施例还提供一种计算机设备,包括处理器和存储器;
存储器用于存储执行各个方法实施例所述方法的程序;处理器被配置为执行存储器中存储的程序。
本申请实施例提供的计算机设备,通过遍历可扩展标记语言文件和代码指令的方式确定被引用资源,按照第一修改方式修改被引用资源的引用计数的计数值。那么就可以通过资源的计数值发现未被引用的资源,即冗余资源(第一冗余资源)。若某资源仅被冗余资源引用,那么该资源也是冗余资源,为了发现这部分冗余资源,利用第一冗余资源对资源引用关系集合进行遍历,按照第二修改方式修改遍历到的被引用资源的引用计数的计数值,由于两种修改方式的单位修改量是相反数,就意味着通过这次修改,删除之前被冗余资源引用所带来的计数值修改痕迹,若某资源仅被冗余资源引用,经过这次修改后,则可以通过资源的计数值发现其为冗余资源(第二冗余资源)。可见,本申请实施例提供的计算机设备,通过引用计数统计的方式自动查找冗余资源,较之人工查找方式效率更高。
第四方面,本申请实施例还提供一种计算机可读存储介质,存储有执行第一方面各个实施例所述方法的程序。
本申请实施例提供的计算机可读存储介质,通过遍历可扩展标记语言文件和代码指令的方式确定被引用资源,按照第一修改方式修改被引用资源的引用计数的计数值。那么就可以通过资源的计数值发现未被引用的资源,即冗余资源(第一冗余资源)。若某资源仅被冗余资源引用,那么该资源也是冗余资源,为了发现这部分冗余资源,利用第一冗余资源对资源引用关系集合进行遍历,按照第二修改方式修改遍历到的被引用资源的引用计数的计数值,由于两种修改方式的单位修改量是相反数,就意味着通过这次修改,删除之前被冗余资源引用所带来的计数值修改痕迹,若某资源仅被冗余资源引用,经过这次修改后,则可以通过资源的计数值发现其为冗余资源(第二冗余资源)。可见,本申请实施例提供的计算机可读存储介质,通过引用计数统计的方式自动查找冗余资源,较之人工查找方式效率更高。
具体实施方式
为了更好的理解上述技术方案,下面通过附图以及具体实施例对本申请实施例的技术方案做详细的说明,应当理解本申请实施例以及实施例中的具体特征是对本申请实施例技术方案的详细的说明,而不是对本申请技术方案的限定,在不冲突的情况下,本申请实施例以及实施例中的技术特征可以相互组合。
本申请实施例提供一种应用程序的冗余资源处理方法,通过对应用程序的资源进行引用计数,利用引用计数的计数值发现冗余资源。该方法可以但不仅限于在应用程序的打包过程中执行,自动检查出冗余资源。
如图1所示,本发明实施例提供的应用程序的冗余资源处理方法包括如下操作:
步骤101、通过遍历应用程序的可扩展标记语言(XML)文件,查找资源引用数据,该资源引用数据包括资源引用标识和被引用资源的第一资源索引。
应用程序的资源引用出现在XML文件以及代码指令中。其中,XML文件对资源的引用方式为对资源类型和资源名的引用,具体的:XML文件中每个元素包括至少一个属性,若某个元素为引用资源,则该元素的某个属性的属性值为引用资源数据,具体数据格式为:@资源类型_资源名,其中,字符“@”为资源引用标识,资源类型和资源名构成第一资源索引。
因此,步骤101中,具体可以查找每个元素的属性的属性值,若存在资源引用标识,则获取其后的资源类型和资源名作为第一资源索引,否则继续遍历。
步骤102、根据查找到的资源引用数据中包括的第一资源索引确定被引用资源,并按照第一修改方式修改确定的被引用资源的引用计数的计数值。
步骤103、通过遍历应用程序的代码指令,查找资源引用代码指令,该资源引用代码指令包括被引用资源的第二资源索引。
其中,代码指令是指字节码文件中各个方法的指令。代码指令对资源的引用方式分为对标识(ID)常量的直接引用和间接引用,具体的:如果代码指令直接引用资源的ID常量,则在资源引用代码指令中包括ID常量(此时,ID常量作为第二资源索引);如果代码指令间接引用资源的ID常量,则在资源引用代码指令中包括被引用资源的资源类型和资源名(此时,资源类型和资源名作为第二资源索引),其具体引用格式为:R.资源类型.资源名。
步骤104、根据查找到的资源引用代码指令中包括的第二资源索引确定被引用资源,并按照上述第一修改方式修改确定的被引用资源的引用计数的计数值。
应当指出的是,实际应用中,步骤101和步骤103的执行不存在时序限定,可以先执行步骤101,也可以先执行步骤103,还可以同步执行步骤101和步骤103。
步骤105、查找引用计数的计数值为设定值的第一冗余资源。
其中,资源的引用计数的计数值为设定值表示本资源未被引用。
步骤106、获取应用程序的资源引用关系集合,资源引用关系集合包括多个资源节点,每个资源节点对应一个资源,包括所对应资源的第三资源索引和被所对应资源引用的资源的第三资源索引。
例如,资源A引用了资源B,那么,资源A对应的资源节点包括资源A的第三资源索引,还包括资源B的第三资源索引。作为举例而非限定,该资源节点的属性名保存资源A的第三资源索引,属性值保存资源B的第三资源索引;又或者,该资源节点包括两个属性,第一个属性的属性值保存资源A的第三资源索引,第二个属性的属性值保存资源B的第三资源索引。
其中,第三资源索引可以由资源的资源类型和资源名构成,当然也可以由资源的ID常量构成。
步骤107、分别以查找到的每个第一冗余资源为根节点遍历上述资源引用关系集合,根据遍历到的资源节点中包括的第三资源索引确定被引用资源,并按照第二修改方式修改确定的被引用资源的引用计数的计数值。
步骤108、查找引用计数的计数值为上述设定值的第二冗余资源。
其中,上述第一修改方式使用的单位修改量与上述第二修改方式使用的单位修改量为相反数,单位修改量为单次确定被引用资源对应的引用计数的计数值的修改量。
本申请实施例提供的冗余资源处理方法,通过遍历可扩展标记语言文件和代码指令的方式确定被引用资源,按照第一修改方式修改被引用资源的引用计数的计数值。那么就可以通过资源的计数值发现未被引用的资源,即冗余资源(第一冗余资源)。若某资源仅被冗余资源引用,那么该资源也是冗余资源,为了发现这部分冗余资源,利用第一冗余资源对资源引用关系集合进行遍历,按照第二修改方式修改遍历到的被引用资源的引用计数的计数值,由于两种修改方式的单位修改量是相反数,就意味着通过这次修改,删除之前被冗余资源引用所带来的计数值修改痕迹,若某资源仅被冗余资源引用,经过这次修改后,则可以通过资源的计数值发现其为冗余资源(第二冗余资源)。可见,本申请实施例提供的方法,通过引用计数统计的方式自动查找冗余资源,较之人工查找方式效率更高。
在此基础上,还可以利用上述应用程序的各个资源的资源类型、资源名称和标识常量,生成基于哈希存储结构的数据集合。作为举例而非限定,可以通过扫描应用程序的所有R文件的方式,利用这些R文件中的资源类型、资源名和ID常量生成上述基于哈希存储结构的数据集合(又可称为资源字典)。本申请实施例不对该数据集合的具体数据结构、数据管理方式进行限定,在实际应用过程中,根据实际场景需要进行定义,只要能够用于确定被引用资源即可。
相应的,上述根据查找到的资源引用数据中包括的第一资源索引确定被引用资源,其实现方式可以是:根据查找到的资源引用数据中包括的第一资源索引,在上述基于哈希存储结构的数据集合中确定被引用资源,第一资源索引包括资源类型和资源名称。
相应的,上述根据查找到的资源引用代码指令中包括的第二资源索引确定被引用资源,其实现方式可以是:根据查找到的资源引用代码指令中包括的第二资源索引,在上述基于哈希存储结构的数据集合中确定被引用资源,第二资源索引包括:标识常量,或者,资源类型和资源名称。
相应的,上述根据遍历到的资源节点中包括的第三资源索引确定被引用资源,其实现方式可以是:根据遍历到的资源节点中包括的第三资源索引,在上述基于哈希存储结构的数据集合中确定被引用资源,第三资源索引包括:标识常量,或者,资源类型和资源名称。
本申请实施例不对利用资源索引在数据集合中确定被引用资源的具体实现方式进行限定,其实现方式与数据集合的具体数据结构有关。实际应用中,一旦数据集合的具体数据结构确定,利用资源索引确定被引用资源可采用与该具体结构匹配的现有实现方式实现。
应当指出的是,在根据第一资源索引、第二资源索引、第三资源索引确定被引用资源时,也可以直接在应用程序的R文件中检索被引用资源,但需要逐条遍历R文件的每行数据,检索效率低。本申请实施例提供的方法,另外构造基于哈希存储结构的数据集合,利用第一资源索引、第二资源索引、第三资源索引在该数据集合中定位被引用资源,利用哈希存储结构快速定位的结构优势,可提高检索效率。
作为举例而非限定,对于资源类型为图片(drawable),资源名为“cat”,ID常量为1233344455的资源。
在R文件中,该资源的描述为:
Class R$drawable{
Public static finial int cat=1233344455
……
利用第一资源索引在上述数据集合中确定该资源的方式为:
//key is resource type
Private Map<String,Map<String,Resource>>resourceSet
利用第二资源索引在上述数据集合中确定该资源的方式为:
//key is resource id
Private Map<Integer,Resource>resourceMap
在上述任意方法实施例的基础上,上述获取应用程序的资源引用关系集合,其实现方式可以是:根据查找到的资源引用数据获取应用程序的资源引用关系集合。
该步骤可以复用应用程序打包过程中对字节码文件的分析过程,其具体实现方式不再赘述。
本申请实施例提供的方法,可以通过遍历一次XML文件,即确定被引用资源,也获得资源间的引用关系,优化处理过程,提高处理效率。
对资源引用关系集合的遍历可以采用深度优先的遍历方式,也可以采用广度优先的遍历方式,本申请实施例对此不作限定。
在上述任意方法实施例的基础上,还可以将各个第一冗余资源添加到队列中;相应的,上述分别以查找到的每个第一冗余资源为根节点遍历上述资源引用关系集合,其实现方式可以是:依次从所述队列中读取第一冗余资源作为根节点遍历上述资源引用关系集合。具体的,可以按照查找时间顺序,每查找到一个第一冗余资源,即将该第一冗余资源添加到队列中。
更进一步地,为了更加全面地查找冗余资源,还将查找到的各个第二冗余资源添加到上述队列中。也就是说,每查找到一个第一冗余资源或第二冗余资源,均添加到上述队列中,从该队列中依次读取冗余资源作为根节点遍历上述资源引用关系集合,直至队列为空。
其中,将冗余资源添加到队列中,可以但不仅限于是将该冗余资源的第三资源索引添加到队列中。相应的,从队列中读取冗余资源是指从队列中读取冗余资源的第三资源索引。
本申请实施例提供的方法,将第一冗余资源和第二冗余资源添加到队列中,利用队列先进先出的特性,可以在确定第一冗余资源和第二冗余资源的过程中,利用已经确定了的第一冗余资源和第二冗余资源对资源引用关系集合进行遍历,进一步提高处理效率。另外,利用利用队列保存待遍历的冗余资源,也便于全面查找冗余资源。
在上述任意方法实施例的基础上,上述查找引用计数的计数值为设定值的第二冗余资源,其实现方式可以是:
在第一冗余资源之外的资源中查找引用计数的计数值为设定值的第二冗余资源。
本申请实施例提供的方法,可以在全部资源范围内再次查找冗余资源,也可以仅在第一冗余资源之外的资源中查找冗余资源,以缩小查找范围,进一步提高处理效率。
在上述任意方法实施例的基础上,按照第一修改方式修改确定的被引用资源的引用计数的计数值,其实现方式可以是:每根据第一资源索引或第二资源索引确定一次被引用资源,将本次确定的被引用资源的引用计数的计数值加1;按照第二修改方式修改确定的被引用资源的引用计数的计数值,其实现方式可以是:每根据第三资源索引确定一次被引用资源,将本次确定的被引用资源的引用计数的计数值减1。
在一个具体的实现方式中,每个资源的引用计数的计数初始值(即上述设定值)为0,通过遍历XML文件每查找到一个资源引用数据,即对该资源引用数据对应的被引用资源的引用计数的计数值加1,通过遍历代码指令,每查找到一个资源引用代码指令,即对该资源引用代码指令所引用的资源(被引用资源)的引用计数的计数值加1;将引用计数的计数值为0的资源(第一冗余资源)添加到队列中,依次从队列中读取冗余资源作为根节点,在资源引用关系集合中进行遍历,每遍历到一个资源,将该资源的引用计数的计数值减1;将引用计数的计数值减至0的资源(第二冗余资源)添加到队列中,当队列为空时,结束遍历。
本申请实施例中,将单位修改量确定为1,且修改方式为加1或减1,其处理方式简单、快速。
应当指出的是,本申请实施例不对计数值的修改方式进行限定,修改方式不仅可以累加,也可以倍乘,即每确定一次被引用资源,则对该被引用资源的引用计数的计数值乘以预定倍数(该预定倍数为单位修改量)。
应当指出的是,本申请实施例不对上述设定值进行限定,该设定值可以为0,也可以为其他取值。
在上述任意方法实施例的基础上,可以输出上述第一冗余资源和上述第二冗余资源,也可以直接删除上述第一冗余资源和上述第二冗余资源。
若输出冗余资源,可以但不仅限于是指输出冗余资源的资源索引。更具体的,可以在控制台或日志文件中以json的格式输出冗余资源。
具体是将冗余资源的查找结果通知给用户,还是自动删除查找到的冗余资源,可以在实际应用中根据情况和需求确定。
基于与方法同样的发明构思,本申请实施例提供一种应用程序的冗余资源处理装置,如图2所示,包括:
第一遍历模块201,用于通过遍历应用程序的可扩展标记语言文件,查找资源引用数据,该资源引用数据包括资源引用标识和被引用资源的第一资源索引;
第一计数模块202,用于根据查找到的资源引用数据中包括的第一资源索引确定被引用资源,并按照第一修改方式修改确定的被引用资源的引用计数的计数值;
第二遍历模块203,用于通过遍历应用程序的代码指令,查找资源引用代码指令,该资源引用代码指令包括被引用资源的第二资源索引;
第二计数模块204,用于根据查找到的资源引用代码指令中包括的第二资源索引确定被引用资源,并按照第一修改方式修改确定的被引用资源的引用计数的计数值;
第一冗余资源查找模块205,用于查找引用计数的计数值为设定值的第一冗余资源,资源的引用计数的计数值为设定值表示本资源未被引用;
引用关系集合获取模块206,用于获取应用程序的资源引用关系集合,该资源引用关系集合包括多个资源节点,每个资源节点对应一个资源,包括所对应资源的第三资源索引和被所对应资源引用的资源的第三资源索引;
第三计数模块207,用于分别以查找到的每个第一冗余资源为根节点遍历上述资源引用关系集合,根据遍历到的资源节点中包括的第三资源索引确定被引用资源,并按照第二修改方式修改确定的被引用资源的引用计数的计数值;
第二冗余资源查找模块208,用于查找引用计数的计数值为设定值的第二冗余资源;
其中,上述第一修改方式使用的单位修改量与所述第二修改方式使用的单位修改量为相反数,上述单位修改量为单次确定被引用资源对应的引用计数的修改量。
本申请实施例提供的冗余资源处理装置,通过遍历可扩展标记语言文件和代码指令的方式确定被引用资源,按照第一修改方式修改被引用资源的引用计数的计数值。那么就可以通过资源的计数值发现未被引用的资源,即冗余资源(第一冗余资源)。若某资源仅被冗余资源引用,那么该资源也是冗余资源,为了发现这部分冗余资源,利用第一冗余资源对资源引用关系集合进行遍历,按照第二修改方式修改遍历到的被引用资源的引用计数的计数值,由于两种修改方式的单位修改量是相反数,就意味着通过这次修改,删除之前被冗余资源引用所带来的计数值修改痕迹,若某资源仅被冗余资源引用,经过这次修改后,则可以通过资源的计数值发现其为冗余资源(第二冗余资源)。可见,本申请实施例提供的装置,通过引用计数统计的方式自动查找冗余资源,较之人工查找方式效率更高。
在此基础上,还可以包括数据集合生成模块,用于利用上述应用程序的各个资源的资源类型、资源名称和标识常量,生成基于哈希存储结构的数据集合。
相应的,上述第一计数模块根据查找到的资源引用数据中包括的第一资源索引确定被引用资源,其实现方式可以是:根据查找到的资源引用数据中包括的第一资源索引,在上述基于哈希存储结构的数据集合中确定被引用资源,第一资源索引包括资源类型和资源名称。
相应的,上述第二计数模块根据查找到的资源引用代码指令中包括的第二资源索引确定被引用资源,其实现方式可以是:根据查找到的资源引用代码指令中包括的第二资源索引,在上述基于哈希存储结构的数据集合中确定被引用资源,第二资源索引包括:标识常量,或者,资源类型和资源名称。
相应的,上述第三计数模块根据遍历到的资源节点中包括的第三资源索引确定被引用资源,其实现方式可以是:根据遍历到的资源节点中包括的第三资源索引,在上述基于哈希存储结构的数据集合中确定被引用资源,第三资源索引包括:标识常量,或者,资源类型和资源名称。
应当指出的是,在根据第一资源索引、第二资源索引、第三资源索引确定被引用资源时,也可以直接在应用程序的R文件中检索被引用资源,但需要逐条遍历R文件的每行数据,检索效率低。本申请实施例提供的装置,另外构造基于哈希存储结构的数据集合,利用第一资源索引、第二资源索引、第三资源索引在该数据集合中定位被引用资源,利用哈希存储结构快速定位的结构优势,可提高检索效率。
在上述任意装置实施例的基础上,上述获取应用程序的资源引用关系集合,其实现方式可以是:根据查找到的资源引用数据获取应用程序的资源引用关系集合。
本申请实施例提供的装置,可以通过遍历一次可扩展标记语言文件,即确定被引用资源,也获得资源间的引用关系,优化处理过程,提高处理效率。
在上述任意装置实施例的基础上,上述分别以查找到的每个第一冗余资源为根节点遍历所述资源引用关系集合,其实现方式可以是:将各个第一冗余资源添加到队列中;依次从所述队列中读取第一冗余资源作为根节点遍历上述资源引用关系集合。
本申请实施例提供的装置,将第一冗余资源添加到队列中,利用队列先进先出的特性,可以在确定第一冗余资源的过程中,利用已经确定了的第一冗余资源对资源引用关系集合进行遍历,进一步提高处理效率。
在上述任意装置实施例的基础上,上述查找引用计数的计数值为设定值的第二冗余资源,其实现方式可以是:
在第一冗余资源之外的资源中查找引用计数的计数值为设定值的第二冗余资源。
本申请实施例提供的装置,可以在全部资源范围内再次查找冗余资源,也可以仅在第一冗余资源之外的资源中查找冗余资源,以缩小查找范围,进一步提高处理效率。
在上述任意装置实施例的基础上,按照第一修改方式修改确定的被引用资源的引用计数的计数值,其实现方式可以是:每根据第一资源索引或第二资源索引确定一次被引用资源,将本次确定的被引用资源的引用计数的计数值加1;按照第二修改方式修改确定的被引用资源的引用计数的计数值,其实现方式可以是:每根据第三资源索引确定一次被引用资源,将本次确定的被引用资源的引用计数的计数值减1。
本申请实施例中,将单位修改量确定为1,且修改方式为加1或减1,其处理方式简单、快速。
在上述任意装置实施例的基础上,可以输出上述第一冗余资源和上述第二冗余资源,也可以直接删除上述第一冗余资源和上述第二冗余资源。
具体是将冗余资源的查找结果通知给用户,还是自动删除查找到的冗余资源,可以在实际应用中根据情况和需求确定。
基于与方法同样的发明构思,本申请实施例提供一种计算机设备,包括处理器和存储器;存储器用于存储执行各个方法实施例所述方法的程序;处理器被配置为执行存储器中存储的程序。
本申请实施例提供的计算机设备,通过遍历可扩展标记语言文件和代码指令的方式确定被引用资源,按照第一修改方式修改被引用资源的引用计数的计数值。那么就可以通过资源的计数值发现未被引用的资源,即冗余资源(第一冗余资源)。若某资源仅被冗余资源引用,那么该资源也是冗余资源,为了发现这部分冗余资源,利用第一冗余资源对资源引用关系集合进行遍历,按照第二修改方式修改遍历到的被引用资源的引用计数的计数值,由于两种修改方式的单位修改量是相反数,就意味着通过这次修改,删除之前被冗余资源引用所带来的计数值修改痕迹,若某资源仅被冗余资源引用,经过这次修改后,则可以通过资源的计数值发现其为冗余资源(第二冗余资源)。可见,本申请实施例提供的计算机设备,通过引用计数统计的方式自动查找冗余资源,较之人工查找方式效率更高。
图3示出的是与本申请实施例提供的方法实施例相关的计算机设备的部分结构的框图。参考图3,计算机设备包括:
电源,通过电源管理系统与中央处理器逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能;主板,提供部件之间的电连接通路,各个部件通过主板进行电信号传输,各个部件通过插接、焊接等方式安装在主板上;中央处理器,主要包括算术逻辑运算单元(ALU,Arithmetic Logic Unit)、程序计数器(PC,Program Counter)、寄存器组、高速缓冲存储器(Cache)以及用于传输数据、控制及状态的总线(Bus)接口;内存储器、磁盘(即上述保存有执行各个方法实施例所述方法的程序的存储器)、输入单元(包括鼠标、键盘、触控面板等)、显示单元(包括显示器和显卡)和网卡通过总线与中央处理器进行数据交换。
执行各个方法实施例所述方法的程序及相关的数据首先从磁盘中被读取到内存储器中,中央处理器从内存储器中读取并加载程序。
本领域技术人员可以理解,图3中示出的计算机设备结构并不构成对计算机设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
基于与方法同样的发明构思,本申请实施例提供一种计算机可读存储介质,存储有执行第一方面各个实施例所述方法的程序。
本申请实施例提供的计算机可读存储介质,通过遍历可扩展标记语言文件和代码指令的方式确定被引用资源,按照第一修改方式修改被引用资源的引用计数的计数值。那么就可以通过资源的计数值发现未被引用的资源,即冗余资源(第一冗余资源)。若某资源仅被冗余资源引用,那么该资源也是冗余资源,为了发现这部分冗余资源,利用第一冗余资源对资源引用关系集合进行遍历,按照第二修改方式修改遍历到的被引用资源的引用计数的计数值,由于两种修改方式的单位修改量是相反数,就意味着通过这次修改,删除之前被冗余资源引用所带来的计数值修改痕迹,若某资源仅被冗余资源引用,经过这次修改后,则可以通过资源的计数值发现其为冗余资源(第二冗余资源)。可见,本申请实施例提供的计算机可读存储介质,通过引用计数统计的方式自动查找冗余资源,较之人工查找方式效率更高。
本说明书是参照根据本说明书实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的设备。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令设备的制造品,该指令设备实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本说明书的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本说明书范围的所有变更和修改。
显然,本领域的技术人员可以对本说明书进行各种改动和变型而不脱离本说明书的精神和范围。这样,倘若本说明书的这些修改和变型属于本说明书权利要求及其等同技术的范围之内,则本说明书也意图包含这些改动和变型在内。