代码混淆方法、装置、设备及存储介质
技术领域
本申请涉及计算机技术领域,特别是涉及一种代码混淆方法、装置、设备及存储介质。
背景技术
在安卓系统中,应用程序通常可以由应用模块和多个库模块构建得到,其中,应用模块可以对库模块进行调用,以实现库模块的功能。在许多情况下,需要对某一应用程序的库模块单独进行发布,以便第三方应用程序可以调用该单独发布的库模块。在单独对库模块进行发布的情况下,有必要对该单独发布的库模块进行代码混淆,以防止恶意用户对该单独发布的库模块进行反编译。其中,代码混淆指的是一种将计算机程序代码(本文简称为代码)转换成一种功能上等价但是难于阅读和理解的形式的技术。
相关技术中,可以对单独发布的每一库模块进行独立的代码混淆,例如,在需要对A应用程序的3个库模块进行单独发布的情况下,对于该3个库模块中的每一个库模块,相关技术都可以进行独立的代码混淆。
然而,由于代码混淆会产生许多简短但无意义的代码命名,在对单独发布的每一库模块进行独立的代码混淆的情况下,经常会出现多个库模块中混淆出的代码命名相互冲突的现象,在第三方应用程序调用库模块时,就有可能因为代码命名冲突而导致调用失败,这严重影响了库模块的正常使用。
发明内容
基于此,本申请实施例提供了一种代码混淆方法、装置、设备及存储介质,可以保证库模块的正常使用。
第一方面,提供了一种代码混淆方法,该代码混淆方法包括:
获取待发布的发布库模块集合,该发布库模块集合包括至少一个发布库模块;获取每个该发布库模块依赖的依赖库模块,得到依赖库模块集合;根据该发布库模块集合和该依赖库模块集合中库模块间的依赖关系,对该发布库模块集合和该依赖库模块集合中的库模块共同进行代码混淆,得到混淆后的库模块集合。
在其中一个实施例中,对该发布库模块集合和该依赖库模块集合中的库模块共同进行代码混淆,得到混淆后的库模块集合,包括:
对该发布库模块集合中的每个该发布库模块进行编译,得到每个该发布库模块的第一编译文件;对库模块仓库进行搜索,从该库模块仓库中获取该依赖库模块集合中每个该依赖库模块的第二编译文件;对每个该发布库模块的第一编译文件和每个该依赖库模块的第二编译文件共同进行代码混淆,得到该混淆后的库模块集合。
在其中一个实施例中,对库模块仓库进行搜索,从该库模块仓库中获取该依赖库模块集合中每个该依赖库模块的第二编译文件,包括:
获取该依赖库模块集合中每个该依赖库模块在该库模块仓库中的第一存储位置;根据该依赖库模块集合中每个该依赖库模块在该库模块仓库中的第一存储位置,从该库模块仓库中获取该依赖库模块集合中每个该依赖库模块的第二编译文件。
在其中一个实施例中,该混淆后的库模块集合包括与该第一编译文件对应的第一混淆文件和与该第二编译文件对应的第二混淆文件,在得到混淆后的库模块集合之后,该方法还包括:
对该第一混淆文件进行发布。
在其中一个实施例中,获取每个该发布库模块依赖的依赖库模块,得到依赖库模块集合,包括:
获取每个该发布库模块依赖的候选库模块,得到候选库模块集合;对该候选库模块集合进行去冗余操作,得到该依赖库模块集合。
在其中一个实施例中,对该候选库模块集合进行去冗余操作,得到该依赖库模块集合,包括:
将该候选库模块集合中所包含的发布库模块以及重复的候选库模块筛选掉,得到该依赖库模块集合。
在其中一个实施例中,获取每个该发布库模块依赖的依赖库模块,包括:
对于每个该发布库模块,获取该发布库模块的依赖序列,并将该依赖序列包括的n个库模块作为该发布库模块依赖的依赖库模块;
其中,该n个库模块中的第i个库模块直接依赖第i+1个库模块,该发布库模块直接依赖该n个库模块中的第1个库模块,i为小于n的正整数。
在其中一个实施例中,获取该发布库模块的依赖序列,包括:
获取该发布库模块直接依赖的库模块;以该发布库模块直接依赖的库模块作为搜索起点,在库模块仓库中依次搜索有依赖关系的库模块,得到该发布库模块的依赖序列。
在其中一个实施例中,该获取该发布库模块直接依赖的库模块,包括:
获取该发布库模块的Gradle脚本中的依赖配置信息,该依赖配置信息用于指示该发布库模块直接依赖的库模块的标识;根据该依赖配置信息获取该发布库模块直接依赖的库模块。
在其中一个实施例中,以该发布库模块直接依赖的库模块作为搜索起点,在库模块仓库中依次搜索有依赖关系的库模块,包括:
在搜索第j个库模块时,获取已经搜索到的第j-1个库模块在该库模块仓库中的第二存储位置,并根据该第二存储位置在该库模块仓库中获取该第j-1个库模块的依赖配置文件,该依赖配置文件用于指示该第j-1个的库模块直接依赖的库模块的标识;根据该第j-1个库模块的依赖配置文件在该库模块仓库中搜索该第j个库模块,j为大于1且小于等于n的整数。
第二方面,提供了一种代码混淆装置,该装置包括:
第一获取模块,用于获取待发布的发布库模块集合,该发布库模块集合包括至少一个发布库模块;
第二获取模块,用于获取每个该发布库模块依赖的依赖库模块,得到依赖库模块集合;
混淆模块,用于根据该发布库模块集合和该依赖库模块集合中库模块间的依赖关系,对该发布库模块集合和该依赖库模块集合中的库模块共同进行代码混淆,得到混淆后的库模块集合。
在其中一个实施例中,该混淆模块,具体用于:
对该发布库模块集合中的每个该发布库模块进行编译,得到每个该发布库模块的第一编译文件;对库模块仓库进行搜索,从该库模块仓库中获取该依赖库模块集合中每个该依赖库模块的第二编译文件;对每个该发布库模块的第一编译文件和每个该依赖库模块的第二编译文件共同进行代码混淆,得到该混淆后的库模块集合。
在其中一个实施例中,该混淆模块,具体用于:
获取该依赖库模块集合中每个该依赖库模块在该库模块仓库中的第一存储位置;根据该依赖库模块集合中每个该依赖库模块在该库模块仓库中的第一存储位置,从该库模块仓库中获取该依赖库模块集合中每个该依赖库模块的第二编译文件。
在其中一个实施例中,该混淆后的库模块集合包括与该第一编译文件对应的第一混淆文件和与该第二编译文件对应的第二混淆文件,该装置还包括发布模块;
该发布模块,用于对该第一混淆文件进行发布。
在其中一个实施例中,该第二获取模块,具体用于:
获取每个该发布库模块依赖的候选库模块,得到候选库模块集合;对该候选库模块集合进行去冗余操作,得到该依赖库模块集合。
在其中一个实施例中,该第二获取模块,具体用于:
将该候选库模块集合中所包含的发布库模块以及重复的候选库模块筛选掉,得到该依赖库模块集合。
在其中一个实施例中,该第二获取模块,具体用于:
对于每个该发布库模块,获取该发布库模块的依赖序列,并将该依赖序列包括的n个库模块作为该发布库模块依赖的依赖库模块;
其中,该n个库模块中的第i个库模块直接依赖第i+1个库模块,该发布库模块直接依赖该n个库模块中的第1个库模块,i为小于n的正整数。
在其中一个实施例中,该第二获取模块,具体用于:
获取该发布库模块直接依赖的库模块;以该发布库模块直接依赖的库模块作为搜索起点,在库模块仓库中依次搜索有依赖关系的库模块,得到该发布库模块的依赖序列。
在其中一个实施例中,该第二获取模块,具体用于:
获取该发布库模块的Gradle脚本中的依赖配置信息,该依赖配置信息用于指示该发布库模块直接依赖的库模块的标识;根据该依赖配置信息获取该发布库模块直接依赖的库模块。
在其中一个实施例中,该第二获取模块,具体用于:
在搜索第j个库模块时,获取已经搜索到的第j-1个库模块在该库模块仓库中的第二存储位置,并根据该第二存储位置在该库模块仓库中获取该第j-1个库模块的依赖配置文件,该依赖配置文件用于指示该第j-1个的库模块直接依赖的库模块的标识;根据该第j-1个库模块的依赖配置文件在该库模块仓库中搜索该第j个库模块,j为大于1且小于等于n的整数。
第三方面,提供了一种计算机设备,包括存储器和处理器,该存储器存储有计算机程序,该计算机程序被该处理器执行时实现如上述第一方面任一所述的代码混淆方法。
第四方面,提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述第一方面任一所述的代码混淆方法。
本申请实施例提供的技术方案带来的有益效果至少包括:
通过获取待发布的发布库模块集合,其中,该发布库模块集合包括至少一个发布库模块,而后,获取每个发布库模块依赖的依赖库模块,得到依赖库模块集合,接着,根据发布库模块集合和依赖库模块集合中库模块间的依赖关系,对发布库模块集合和依赖库模块集合中的库模块共同进行代码混淆,从而得到混淆后的库模块集合,由于本申请实施例提供的代码混淆方法中,可以根据发布库模块集合和依赖库模块集合中库模块间的依赖关系,对发布库模块集合和依赖库模块集合中的库模块共同进行代码混淆,因此,在代码混淆过程中,就可以根据发布库模块集合和依赖库模块集合中库模块间的依赖关系,建立发布库模块集合和依赖库模块集合中库模块的目标代码的索引,基于该索引,就可以获知各个发布库模块中相同的目标代码以及不同目标代码,从而为各个发布库模块中相同的目标代码分配同样的代码命名,为各个发布库模块中不同的目标代码分配不同的代码命名,这就可以解决代码命名冲突的问题,从而可以保证发布库模块的正常调用。
附图说明
图1为一种代码混淆方法的示意图;
图2为本申请实施例提供的一种计算机设备的框图;
图3为本申请实施例提供的一种代码混淆方法的流程图;
图4为本申请实施例提供的一种获取依赖序列的方法的流程图;
图5为本申请实施例提供的另一种代码混淆方法的流程图;
图6为本申请实施例提供的一种代码混淆装置的框图;
图7为本申请实施例提供的另一种代码混淆装置的框图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
在安卓系统中,可以利用Gradle语言对应用模块(英文:Application Module)和多个库模块(英文:Library Module)共同进行构建,以得到应用程序,其中,库模块可以被其他的库模块或者应用模块进行调用,以实现库模块的功能。
在构建应用程序的过程中,可以对应用模块以及各个库模块分别进行编译,从而得到多个字节码文件(class文件),而后,可以通过Gradle语言的Transform(中文:转换)处理过程将编译得到的多个字节码文件合并为一个完整的字节码包(dex文件)。
在对应用程序构建完成之后,可以将字节码包进行对外发布,以使用户能够基于该字节码包运行应用程序。
然而,在实际应用中的许多场景下,需要单独对库模块进行对外发布,而不对字节码包进行对外发布。
例如,某地图互联网企业可能需要对合作企业提供地图服务,以使合作企业能够使用该地图互联网企业开发的地图导航以及地图定位的功能,此时,该地图互联网企业可以向合作企业发布用于实现地图导航以及地图定位功能的库模块,以使合作企业的应用程序能够调用该库模块,以通过调用实现该库模块的地图导航以及地图定位的功能。
又例如,某直播提供商可能需要对合作企业提供直播嵌入服务,此时,该直播提供商可以向合作企业发布用于实现直播功能的库模块,以使合作企业的应用程序能够调用该库模块,以通过调用实现该库模块的直播功能。
在单独对库模块进行发布的情况下,有必要对库模块进行代码混淆,以防止恶意用户对库模块进行反编译,从而获取库模块中包含的源代码。其中,代码混淆指的是一种将计算机程序代码(本文简称为代码)转换成一种功能上等价但是难于阅读和理解的形式的技术,通常情况下,代码混淆可以包括验证(英文:preverify)、压缩(英文:shrink)、重命名(英文:obfuscate)以及优化(英文:optimize)等处理过程。
相关技术中,可以对单独发布的每一库模块进行独立的代码混淆,例如,请参考图1,相关技术中,在需要单独发布库模块A和库模块B的情况下,可以对该库模块A进行编译,得到字节码文件classA,接着对该字节码文件classA进行代码混淆,得到classAh,而后,对该classAh进行打包,得到打包文件DA,并对该打包文件DA进行发布,同时,可以对该库模块B进行编译,得到字节码文件classB,接着对该字节码文件classB进行代码混淆,得到classBh,而后,对该classBh进行打包,得到打包文件DB,并对该打包文件DB进行发布。
然而,相关技术提供的代码混淆方式存在诸多问题,下面,本申请将对其进行简要说明:
其一、可能会出现代码命名冲突的现象。
通常情况下,代码混淆可以对库模块中的类、方法和字段等(为了简化叙述,下文统一将“类、方法和字段等”称为目标代码)进行重命名,从而增加库模块中代码的理解难度。
在对每一库模块进行独立代码混淆的情况下,由于在代码混淆的过程中无法获知其他的库模块中的代码命名(也即是目标代码经过重命名处理后的名称),因此,一方面可能出现不同库模块中的不同目标代码经过代码混淆后所得到的代码命名相同,另一方面可能出现不同库模块中的相同的目标代码经过代码混淆后所得到的代码命名不同,这就是所谓的代码命名冲突的现象。
在应用程序同时调用多个经过代码混淆的库模块时,就有可能因为代码命名冲突而导致调用失败,这严重影响了库模块的正常使用。
其二、无法对库模块的调用接口进行代码混淆。
库模块通常可以包括调用接口,实际应用中,对于库模块A而言,库模块B可以通过在代码中声明库模块A的调用接口的方式对库模块A进行调用。
在对每一库模块进行独立代码混淆的情况下,若对库模块A的调用接口进行混淆,那么就有可能出现库模块B的代码中声明的库模块A的调用接口与代码混淆后的库模块A的调用接口不一致的现象,这种现象会导致库模块A调用失败。
为了避免库模块调用失败,在对每一库模块进行独立代码混淆的情况下,就不能对库模块的调用接口进行混淆。
其三、无法优化库模块的代码体积。
实际应用中,库模块中可能存在大量的备用代码或者废弃代码,同时,库模块提供的调用接口中也会存在着未被使用的调用接口,换句话说,实际应用中,库模块中可能包含许多的冗余代码。
由于无法根据库模块本身来判断库模块中哪些代码属于冗余代码,因此,在对每一库模块进行独立代码混淆的情况下,库模块中的冗余代码不会被移除,这导致库模块的代码体积无法被优化。
有鉴于此,本申请实施例提供了一种代码混淆方法,在该代码混淆方法中,计算机设备可以获取待发布的发布库模块集合,其中,该发布库模块集合包括至少一个发布库模块,而后,计算机设备可以获取每个发布库模块依赖的依赖库模块,得到依赖库模块集合,接着,计算机设备可以根据发布库模块集合和依赖库模块集合中库模块间的依赖关系,对发布库模块集合和依赖库模块集合中的库模块共同进行代码混淆,从而得到混淆后的库模块集合,由于本申请实施例提供的代码混淆方法中,可以根据发布库模块集合和依赖库模块集合中库模块间的依赖关系,对发布库模块集合和依赖库模块集合中的库模块共同进行代码混淆,因此,在代码混淆过程中,就可以根据发布库模块集合和依赖库模块集合中库模块间的依赖关系,建立发布库模块集合和依赖库模块集合中库模块的目标代码的索引,基于该索引,就可以获知各个发布库模块中相同的目标代码以及不同目标代码,从而为各个发布库模块中相同的目标代码分配同样的代码命名,为各个发布库模块中不同的目标代码分配不同的代码命名,这就可以解决代码命名冲突的问题,从而可以保证发布库模块的正常调用。
进一步地,由于对发布库模块集合和依赖库模块集合中的库模块共同进行代码混淆,因此,某一发布库模块A的调用接口以及另一发布库模块B的代码中声明的发布库模块A的调用接口可以同时被混淆,这样,就可以避免发布库模块B的代码中声明的发布库模块A的调用接口与发布库模块A的调用接口不一致的问题,从而可以保证发布库模块A的正常调用。
再进一步地,由于可以根据发布库模块集合和依赖库模块集合中库模块间的依赖关系,对发布库模块集合和依赖库模块集合中的库模块共同进行代码混淆,因此,在代码混淆的过程中,计算机设备就可以根据发布库模块集合和依赖库模块集合中库模块间的依赖关系,从每一发布库模块中识别出冗余代码,从而在代码混淆的过程中可以对每一发布库模块中的冗余代码进行移除,从而可以优化发布库模块的代码体积。
下面,将对本申请实施例提供的代码混淆方法所涉及到的实施环境进行简要说明。
其中,该实施环境可以包括计算机设备,该计算机设备可以为终端或者服务器,该计算机设备可以用于执行本申请实施例提供的代码混淆方法。
请参考图2,其示出了该计算机设备的内部结构图。如图2所示,该计算机设备包括通过系统总线连接的处理器和存储器。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机程序被处理器执行时以实现一种代码混淆方法。
本领域技术人员可以理解,图2中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
请参考图3,其示出了本申请实施例提供的一种代码混淆方法的流程图,如上文所述,该代码混淆方法可以应用于计算机设备中。如图3所示,该代码混淆方法可以包括以下步骤:
步骤301、计算机设备获取待发布的发布库模块集合。
其中,发布库模块集合包括至少一个发布库模块,这里所谓的发布库模块指的是需要单独对外发布的库模块。
例如,在地图互联网企业需要对合作企业提供地图服务的情况下,该发布库模块可以是地图互联网企业单独发布的的用于实现地图导航以及地图定位功能的库模块。
又例如,在直播提供商需要对合作企业提供直播嵌入服务的情况下,该发布库模块可以是该直播提供商单独发布的用于实现直播功能的库模块。
步骤302、计算机设备获取每个发布库模块依赖的依赖库模块,得到依赖库模块集合。
在实际应用中,库模块之间通常存在依赖关系,某一库模块可以调用其所依赖的库模块,以实现其所依赖的库模块的功能,例如,库模块A依赖库模块B,则库模块A可以调用该库模块B,以实现库模块B的功能。
通常情况下,库模块之间的依赖关系可以包括直接依赖和间接依赖两种,其中,间接依赖指的是两个库模块间通过中间的库模块进行相互依赖,直接依赖指的是两个库模块间不通过中间的库模块进行相互依赖。
例如,库模块A依赖库模块B,库模块B依赖库模块C,由于库模块A和库模块C需要通过中间的库模块B进行相互依赖,因此,库模块A和库模块C之间的依赖关系为间接依赖,由于库模块A和库模块B不需要通过中间的库模块进行相互依赖,库模块B和库模块C也不需要通过中间的库模块进行相互依赖,因此,库模块A和库模块B之间的依赖关系为直接依赖,库模块B和库模块C之间的依赖关系也为直接依赖。
在步骤302中,计算机设备可以获取每个发布库模块直接依赖的依赖库模块,以及间接依赖的依赖库模块,从而得到依赖库模块集合。
可选的,在本申请的一个实施例中,对于每个发布库模块,计算机设备可以获取该发布库模块的依赖序列,并将该依赖序列包括的n个库模块作为该发布库模块依赖的依赖库模块,其中,该n个库模块中的第i个库模块直接依赖第i+1个库模块,也即是,该n个库模块中任意相邻的两个库模块之间的依赖关系均为直接依赖,此外,该发布库模块直接依赖该n个库模块中的第1个库模块,i为小于n的正整数。
例如,对于发布库模块A而言,计算机设备可以获取该发布库模块A的依赖序列,该依赖序列为库模块y1和库模块y2,其中,该发布库模块A直接依赖库模块y1,该库模块y1直接依赖库模块y2,在获取到发布库模块A的依赖序列之后,可以将该依赖序列包括的库模块y1和库模块y2作为步骤302中所述的“发布库模块A依赖的依赖库模块”。
实际应用中,发布库模块之间可能存在依赖关系,例如,发布库模块A可以直接依赖另一发布库模块B,此外,不同的发布库模块依赖的依赖库模块可能部分相同,例如,发布库模块A的依赖库模块包括库模块y1和库模块y2,发布库模块B的依赖库模块包括库模块y3和库模块y2,则发布库模块A和发布库模块B的依赖库模块中存在相同的库模块y2。
考虑到上述情况,在本申请的一个可选的实施例中,计算机设备可以获取每个发布库模块依赖的候选库模块,得到候选库模块集合,其中,该候选库模块包括发布库模块依赖的所有库模块,在得到候选库模块集合之后,计算机设备可以对该候选库模块集合进行去冗余操作,从而得到上文所述的依赖库模块集合。
其中,可选的,对该候选库模块集合进行去冗余操作可以包括:将候选库模块集合中所包含的发布库模块以及重复的候选库模块筛选掉。
步骤303、计算机设备根据发布库模块集合和依赖库模块集合中库模块间的依赖关系,对发布库模块集合和依赖库模块集合中的库模块共同进行代码混淆,得到混淆后的库模块集合。
请参考图4,在上文所述实施例的基础上,本申请实施例提供了一种可选的获取依赖序列的方法,如图4所示,该方法可以包括以下步骤:
步骤401、计算机设备获取发布库模块直接依赖的库模块。
可选的,在本申请的一个实施例中,计算机设备可以获取发布库模块的Gradle脚本中的依赖配置信息(英文:dependencies),其中,该依赖配置信息用于指示发布库模块直接依赖的库模块的标识,计算机设备可以根据该依赖配置信息获取发布库模块直接依赖的库模块。
可选的,计算机设备根据依赖配置信息获取发布库模块直接依赖的库模块的方式可以包括:
计算机设备在发布库模块的Gradle脚本中获取仓库配置信息(英文:repositories),该仓库配置信息用于指示存放库模块的库模块仓库的地址,其中,该库模块仓库可以为Maven仓库或者Ivy仓库,计算机设备可以基于库模块仓库的地址定位到该库模块仓库,而后,计算机设备可以根据依赖配置信息所指示的发布库模块直接依赖的库模块的标识在定位到的库模块仓库中搜索发布库模块直接依赖的库模块,从而通过搜索得到发布库模块直接依赖的库模块。
步骤402、计算机设备以发布库模块直接依赖的库模块作为搜索起点,在库模块仓库中依次搜索有依赖关系的库模块,从而得到该发布库模块的依赖序列。
可选的,在搜索第j个库模块时,计算机设备可以获取已经搜索到的第j-1个库模块在库模块仓库中的第二存储位置,并根据该第二存储位置在库模块仓库中获取第j-1个库模块的依赖配置文件(pom文件),其中,该依赖配置文件用于指示第j-1个的库模块直接依赖的库模块的标识,而后,计算机设备可以根据第j-1个库模块的依赖配置文件在库模块仓库中搜索第j个库模块,j为大于1且小于等于n的整数。
例如,在搜索第3个库模块的时候,计算机设备已经搜索到了第2个库模块,此时,计算机设备可以获取该第2个库模块在库模块仓库中的第二存储位置,并根据该第二存储位置在库模块仓库中获取第2个库模块的pom文件,该pom文件可以指示该第2个库模块直接依赖的库模块的标识,计算机设备可以根据第2个库模块直接依赖的库模块的标识在库模块仓库中搜索该第3个库模块,其中,该第3个库模块被第2个库模块直接依赖。
请参考图5,在上文所述实施例的基础上,步骤303可以包括以下技术过程:
步骤501、计算机设备对发布库模块集合中的每个发布库模块进行编译,得到每个发布库模块的第一编译文件。
其中,该第一编译文件为字节码文件。
步骤502、计算机设备对库模块仓库进行搜索,从库模块仓库中获取依赖库模块集合中每个依赖库模块的第二编译文件。
可选的,计算机设备可以获取依赖库模块集合中每个依赖库模块在库模块仓库中的第一存储位置,而后,计算机设备可以根据依赖库模块集合中每个依赖库模块在库模块仓库中的第一存储位置,从库模块仓库中获取依赖库模块集合中每个依赖库模块的第二编译文件,其中,第二编译文件为字节码文件。
步骤503、计算机设备对每个发布库模块的第一编译文件和每个依赖库模块的第二编译文件共同进行代码混淆,得到混淆后的库模块集合。
可选的,混淆后的库模块集合包括与第一编译文件对应的第一混淆文件和与第二编译文件对应的第二混淆文件,在得到混淆后的库模块集合之后,计算机设备可以对第一混淆文件进行发布。
请参考图6,其示出了本申请实施例提供的一种代码混淆装置600的框图,该代码混淆装置600可以配置于上文所述的计算机设备中。如图6所示,该代码混淆装置600可以包括:第一获取模块601、第二获取模块602和混淆模块603。
该第一获取模块601,用于获取待发布的发布库模块集合,该发布库模块集合包括至少一个发布库模块。
该第二获取模块602,用于获取每个该发布库模块依赖的依赖库模块,得到依赖库模块集合。
该混淆模块603,用于根据该发布库模块集合和该依赖库模块集合中库模块间的依赖关系,对该发布库模块集合和该依赖库模块集合中的库模块共同进行代码混淆,得到混淆后的库模块集合。
在本申请的一个实施例中,该混淆模块603,具体用于:对该发布库模块集合中的每个该发布库模块进行编译,得到每个该发布库模块的第一编译文件;对库模块仓库进行搜索,从该库模块仓库中获取该依赖库模块集合中每个该依赖库模块的第二编译文件;对每个该发布库模块的第一编译文件和每个该依赖库模块的第二编译文件共同进行代码混淆,得到该混淆后的库模块集合。
在本申请的一个实施例中,该混淆模块603,具体用于:获取该依赖库模块集合中每个该依赖库模块在该库模块仓库中的第一存储位置;根据该依赖库模块集合中每个该依赖库模块在该库模块仓库中的第一存储位置,从该库模块仓库中获取该依赖库模块集合中每个该依赖库模块的第二编译文件。
在本申请的一个实施例中,该第二获取模块602,具体用于:获取每个该发布库模块依赖的候选库模块,得到候选库模块集合;对该候选库模块集合进行去冗余操作,得到该依赖库模块集合。
在本申请的一个实施例中,该第二获取模块602,具体用于:将该候选库模块集合中所包含的发布库模块以及重复的候选库模块筛选掉,得到该依赖库模块集合。
在本申请的一个实施例中,该第二获取模块602,具体用于:对于每个该发布库模块,获取该发布库模块的依赖序列,并将该依赖序列包括的n个库模块作为该发布库模块依赖的依赖库模块;其中,该n个库模块中的第i个库模块直接依赖第i+1个库模块,该发布库模块直接依赖该n个库模块中的第1个库模块,i为小于n的正整数。
在本申请的一个实施例中,该第二获取模块602,具体用于:获取该发布库模块直接依赖的库模块;以该发布库模块直接依赖的库模块作为搜索起点,在库模块仓库中依次搜索有依赖关系的库模块,得到该发布库模块的依赖序列。
在本申请的一个实施例中,该第二获取模块602,具体用于:获取该发布库模块的Gradle脚本中的依赖配置信息,该依赖配置信息用于指示该发布库模块直接依赖的库模块的标识;根据该依赖配置信息获取该发布库模块直接依赖的库模块。
在本申请的一个实施例中,该第二获取模块602,具体用于:在搜索第j个库模块时,获取已经搜索到的第j-1个库模块在该库模块仓库中的第二存储位置,并根据该第二存储位置在该库模块仓库中获取该第j-1个库模块的依赖配置文件,该依赖配置文件用于指示该第j-1个的库模块直接依赖的库模块的标识;根据该第j-1个库模块的依赖配置文件在该库模块仓库中搜索该第j个库模块,j为大于1且小于等于n的整数。
请参考图7,本申请实施例还提供了另外一种代码混淆装置700,该代码混淆装置700除了包括代码混淆装置600包括的各模块外,可选的,该代码混淆装置700还可以包括发布模块604
该混淆后的库模块集合包括与该第一编译文件对应的第一混淆文件和与该第二编译文件对应的第二混淆文件,该发布模块604,用于对该第一混淆文件进行发布。
本申请实施例提供的代码混淆装置,可以实现上述方法实施例,其实现原理和技术效果类似,在此不再赘述。
关于代码混淆装置的具体限定可以参见上文中对于代码混淆方法的限定,在此不再赘述。上述代码混淆装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在本申请的一个实施例中,提供了一种计算机设备,该计算机设备包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现以下步骤:
获取待发布的发布库模块集合,该发布库模块集合包括至少一个发布库模块;获取每个该发布库模块依赖的依赖库模块,得到依赖库模块集合;根据该发布库模块集合和该依赖库模块集合中库模块间的依赖关系,对该发布库模块集合和该依赖库模块集合中的库模块共同进行代码混淆,得到混淆后的库模块集合。
在本申请的一个实施例中,处理器执行计算机程序时还实现以下步骤:对该发布库模块集合中的每个该发布库模块进行编译,得到每个该发布库模块的第一编译文件;对库模块仓库进行搜索,从该库模块仓库中获取该依赖库模块集合中每个该依赖库模块的第二编译文件;对每个该发布库模块的第一编译文件和每个该依赖库模块的第二编译文件共同进行代码混淆,得到该混淆后的库模块集合。
在本申请的一个实施例中,处理器执行计算机程序时还实现以下步骤:获取该依赖库模块集合中每个该依赖库模块在该库模块仓库中的第一存储位置;根据该依赖库模块集合中每个该依赖库模块在该库模块仓库中的第一存储位置,从该库模块仓库中获取该依赖库模块集合中每个该依赖库模块的第二编译文件。
该混淆后的库模块集合包括与该第一编译文件对应的第一混淆文件和与该第二编译文件对应的第二混淆文件,在本申请的一个实施例中,处理器执行计算机程序时还实现以下步骤:对该第一混淆文件进行发布。
在本申请的一个实施例中,处理器执行计算机程序时还实现以下步骤:获取每个该发布库模块依赖的候选库模块,得到候选库模块集合;对该候选库模块集合进行去冗余操作,得到该依赖库模块集合。
在本申请的一个实施例中,处理器执行计算机程序时还实现以下步骤:将该候选库模块集合中所包含的发布库模块以及重复的候选库模块筛选掉,得到该依赖库模块集合。
在本申请的一个实施例中,处理器执行计算机程序时还实现以下步骤:对于每个该发布库模块,获取该发布库模块的依赖序列,并将该依赖序列包括的n个库模块作为该发布库模块依赖的依赖库模块;其中,该n个库模块中的第i个库模块直接依赖第i+1个库模块,该发布库模块直接依赖该n个库模块中的第1个库模块,i为小于n的正整数。
在本申请的一个实施例中,处理器执行计算机程序时还实现以下步骤:获取该发布库模块直接依赖的库模块;以该发布库模块直接依赖的库模块作为搜索起点,在库模块仓库中依次搜索有依赖关系的库模块,得到该发布库模块的依赖序列。
在本申请的一个实施例中,处理器执行计算机程序时还实现以下步骤:获取该发布库模块的Gradle脚本中的依赖配置信息,该依赖配置信息用于指示该发布库模块直接依赖的库模块的标识;根据该依赖配置信息获取该发布库模块直接依赖的库模块。
在本申请的一个实施例中,处理器执行计算机程序时还实现以下步骤:在搜索第j个库模块时,获取已经搜索到的第j-1个库模块在该库模块仓库中的第二存储位置,并根据该第二存储位置在该库模块仓库中获取该第j-1个库模块的依赖配置文件,该依赖配置文件用于指示该第j-1个的库模块直接依赖的库模块的标识;根据该第j-1个库模块的依赖配置文件在该库模块仓库中搜索该第j个库模块,j为大于1且小于等于n的整数。
本申请实施例提供的计算机设备,其实现原理和技术效果与上述方法实施例类似,在此不再赘述。
在本申请的一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
获取待发布的发布库模块集合,该发布库模块集合包括至少一个发布库模块;获取每个该发布库模块依赖的依赖库模块,得到依赖库模块集合;根据该发布库模块集合和该依赖库模块集合中库模块间的依赖关系,对该发布库模块集合和该依赖库模块集合中的库模块共同进行代码混淆,得到混淆后的库模块集合。
在本申请的一个实施例中,计算机程序被处理器执行时还实现以下步骤:对该发布库模块集合中的每个该发布库模块进行编译,得到每个该发布库模块的第一编译文件;对库模块仓库进行搜索,从该库模块仓库中获取该依赖库模块集合中每个该依赖库模块的第二编译文件;对每个该发布库模块的第一编译文件和每个该依赖库模块的第二编译文件共同进行代码混淆,得到该混淆后的库模块集合。
在本申请的一个实施例中,计算机程序被处理器执行时还实现以下步骤:获取该依赖库模块集合中每个该依赖库模块在该库模块仓库中的第一存储位置;根据该依赖库模块集合中每个该依赖库模块在该库模块仓库中的第一存储位置,从该库模块仓库中获取该依赖库模块集合中每个该依赖库模块的第二编译文件。
该混淆后的库模块集合包括与该第一编译文件对应的第一混淆文件和与该第二编译文件对应的第二混淆文件,在本申请的一个实施例中,计算机程序被处理器执行时还实现以下步骤:对该第一混淆文件进行发布。
在本申请的一个实施例中,计算机程序被处理器执行时还实现以下步骤:获取每个该发布库模块依赖的候选库模块,得到候选库模块集合;对该候选库模块集合进行去冗余操作,得到该依赖库模块集合。
在本申请的一个实施例中,计算机程序被处理器执行时还实现以下步骤:将该候选库模块集合中所包含的发布库模块以及重复的候选库模块筛选掉,得到该依赖库模块集合。
在本申请的一个实施例中,计算机程序被处理器执行时还实现以下步骤:对于每个该发布库模块,获取该发布库模块的依赖序列,并将该依赖序列包括的n个库模块作为该发布库模块依赖的依赖库模块;其中,该n个库模块中的第i个库模块直接依赖第i+1个库模块,该发布库模块直接依赖该n个库模块中的第1个库模块,i为小于n的正整数。
在本申请的一个实施例中,计算机程序被处理器执行时还实现以下步骤:获取该发布库模块直接依赖的库模块;以该发布库模块直接依赖的库模块作为搜索起点,在库模块仓库中依次搜索有依赖关系的库模块,得到该发布库模块的依赖序列。
在本申请的一个实施例中,计算机程序被处理器执行时还实现以下步骤:获取该发布库模块的Gradle脚本中的依赖配置信息,该依赖配置信息用于指示该发布库模块直接依赖的库模块的标识;根据该依赖配置信息获取该发布库模块直接依赖的库模块。
在本申请的一个实施例中,计算机程序被处理器执行时还实现以下步骤:在搜索第j个库模块时,获取已经搜索到的第j-1个库模块在该库模块仓库中的第二存储位置,并根据该第二存储位置在该库模块仓库中获取该第j-1个库模块的依赖配置文件,该依赖配置文件用于指示该第j-1个的库模块直接依赖的库模块的标识;根据该第j-1个库模块的依赖配置文件在该库模块仓库中搜索该第j个库模块,j为大于1且小于等于n的整数。
本实施例提供的计算机可读存储介质,其实现原理和技术效果与上述方法实施例类似,在此不再赘述。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。