CN107885501B - 获取Android中组件相互引用关系的方法及装置 - Google Patents
获取Android中组件相互引用关系的方法及装置 Download PDFInfo
- Publication number
- CN107885501B CN107885501B CN201711072168.3A CN201711072168A CN107885501B CN 107885501 B CN107885501 B CN 107885501B CN 201711072168 A CN201711072168 A CN 201711072168A CN 107885501 B CN107885501 B CN 107885501B
- Authority
- CN
- China
- Prior art keywords
- dependency relationship
- component
- current
- dependency
- acquiring
- 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.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 title claims abstract description 53
- 230000006870 function Effects 0.000 claims description 21
- 238000013507 mapping Methods 0.000 claims description 8
- 238000004891 communication Methods 0.000 claims description 3
- 238000012163 sequencing technique Methods 0.000 claims description 3
- 230000008569 process Effects 0.000 description 9
- 238000011161 development Methods 0.000 description 7
- 238000012545 processing Methods 0.000 description 6
- 238000010586 diagram Methods 0.000 description 4
- 238000001514 detection method Methods 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
Images
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/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
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)
- Stored Programmes (AREA)
Abstract
本发明提供获取Android中组件相互引用关系的方法及装置,所述方法包括:获取目标Android项目中所有组件的编译脚本文件;分别对各所述编译脚本文件进行解析,获取每个组件的依赖关系集合;对所述每个组件的依赖关系集合中的每项依赖关系执行以下步骤:分析该依赖关系所包含的目标组件,若所述目标组件的依赖关系集合中存在包含该组件的依赖关系,则获知所述目标组件与该组件之间存在相互引用关系。本发明能够快速给出组件之间的相互引用关系,避免了人工逐个打开组件并分析依赖关系,极大地提高了开发人员定位组件相互引用关系的效率,降低了人力成本的开销。
Description
技术领域
本发明涉及互联网开发技术领域,更具体地,涉及获取Android中组件相互引用关系的方法及装置。
背景技术
随着互联网开发技术的发展,直播平台客户端常常需要通过组件以及若干个组件之间的配合来实现相应的功能,以满足用户需求。
在直播平台Android客户端组件化开发的过程中,开发人员会将该Android客户端项目的实现分成若干个组件,对组件进行分开和隔离,每个组件会是一个独立的功能模块,在每个组件模块内部可能又会引入第三方开源组件或者其他组件。当组件之间发生了相互引用时,例如,当组件a引用组件b并且组件b也引用组件a的时,编译器就会无限循环引用下去,会导致编译器无法正常运行下去,进而导致编译失败。
开发人员要找到编译失败的原因,首先需要通过逐个打开和分析每个组件的配置文件以梳理出组件之间错综复杂的依赖关系,然后根据梳理出的依赖关系定位哪两个组件之间进行了相互引用,这项工作通常是一个非常耗时耗力的过程,尤其是在组件数量较多的情形下,会导致开发效率低下。
发明内容
为了能够解决现有实现直播平台Android客户端组件化的过程中易出现的定位组件相互引用关系效率低下的问题,本发明提供获取Android系统组件相互引用关系的方法及装置。
根据本发明的一个方面,提供获取Android中组件相互引用关系的方法,包括:
S1,获取目标Android项目中所有组件的编译脚本文件;
S2,分别对各所述编译脚本文件进行解析,获取每个组件的依赖关系集合;
S3,针对所述每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中每项依赖关系,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:分析当前依赖关系所包含的目标组件,若所述目标组件的依赖关系集合中存在包含当前组件的依赖关系,则获知所述目标组件与当前组件之间存在相互引用关系。
其中,所述步骤S2进一步包括:
分别对各个组件的编译脚本文件执行以下步骤:
通过调用readLine方法获取当前组件的编译脚本文件中每一行的内容信息;
调用contains(“dependencies”)函数以判断当前行的内容信息中是否包含关键字dependencies,若不包含则开始读取下一行数据,直到某一行中包含关键字dependencies时开始读取“dependencies{”后的依赖关系信息,直至读取到“}”时为止;
将所读取到的依赖关系信息存储至一个集合中。
其中,所述步骤S2进一步包括:
分别对各个组件的编译脚本文件执行以下步骤:
通过调用file类中的readAll方法将当前组件的编译脚本文件中的所有内容信息读取到内存中;
调用indexOf(“dependencies{”)函数以获取所述内容信息中出现“dependencies{”的索引值index;
调用seek函数将文件游标移动到index+length(“dependencies{”)所表示的位置,通过不断移动文件游标读取“dependencies{”后的依赖关系信息,直至读取到“}”时为止;
将所读取到的依赖关系信息存储至一个集合中。
其中,在步骤S3中所述分析当前依赖关系所包含的目标组件的步骤之后还包括:
若所述目标组件的依赖关系集合中不存在包含当前组件的依赖关系,则获知所述目标组件与当前组件之间不存在相互引用关系,则开始对当前组件的依赖关系集合中的下一项依赖关系进行分析。
其中,所述步骤S3进一步包括:
S31,对各个组件进行编号;
S32,分析每个组件的依赖关系集合中的每项依赖关系所包含的目标组件,并获取所述目标组件的编号,将所述每项依赖关系分别映射为所获取到的编号;
S33,按照编号从小到大对所述每个组件的依赖关系集合中的所有依赖关系进行排序;
S34,针对所述每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中的每个编号作为当前编号,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:获取当前编号所对应的目标组件的依赖关系集合中所有小于所述当前编号的依赖关系,若所获取到的所有小于所述当前编号的依赖关系中存在与所述当前组件的编号相对应的依赖关系,则获知当前组件与所述目标组件之间存在相互引用关系。
其中,所述步骤S34还包括:
若当前编号所对应的目标组件的依赖关系集合中不存在小于所述当前编号的依赖关系,则获知当前组件与所述目标组件之间不存在相互引用关系,则开始对当前组件的依赖关系集合中的下一个编号进行分析。
本发明的另一个方面,提供获取Android中组件相互引用关系的装置,包括:
第一获取模块,用于获取目标Android项目中所有组件的编译脚本文件;
第二获取模块,用于分别对各所述编译脚本文件进行解析,获取每个组件的依赖关系集合;
分析与输出模块,用于针对所述每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中的每项依赖关系,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:分析当前依赖关系所包含的目标组件,若所述目标组件的依赖关系集合中存在包含当前组件的依赖关系,则获知所述目标组件与当前组件之间存在相互引用关系。
其中,所述分析与输出模块具体用于:
对各个组件进行编号;
分析每个组件的依赖关系集合中的每项依赖关系所包含的目标组件,并获取所述目标组件的编号,将所述每项依赖关系分别映射为所获取到的编号;
按照编号从小到大对所述每个组件的依赖关系集合中的所有依赖关系进行排序;
针对所述每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中的每个编号作为当前编号,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:获取当前编号所对应的目标组件的依赖关系集合中所有小于所述当前编号的依赖关系,若所获取到的所有小于所述当前编号的依赖关系中存在与所述当前组件的编号相对应的依赖关系,则获知当前组件与所述目标组件之间存在相互引用关系。
根据本发明的另一个方面,提供获取Android中组件相互引用关系的设备,包括存储器、处理器、以及总线,
所述处理器和存储器通过所述总线完成相互间的通信;
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述存储器中的程序指令,以执行如前任一所述的方法。
根据本发明的又个方面,提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行如前任一所述的方法。
本发明提出的获取Android中组件相互引用关系的方法及装置,能够快速的将所有组件之间的依赖关系呈现出来并给出组件之间的相互引用关系,避免了人工逐个打开组件并分析依赖关系,极大地提高了开发人员定位组件相互引用关系的效率,提升了开发速度并降低了人力成本的开销。
附图说明
图1为本发明一实施例提供的获取Android中组件相互引用关系的方法的流程示意图;
图2为本发明另一实施例提供的获取Android中组件相互引用关系的装置的结构示意图;
图3为本发明另一实施例提供的获取Android中组件相互引用关系的设备的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他的实施例,都属于本发明保护的范围。
如图1所示,为本发明一实施例提供的获取Android中组件相互引用关系的方法的流程示意图,包括:
S1,获取目标Android项目中所有组件的编译脚本文件;
S2,分别对各所述编译脚本文件进行解析,获取每个组件的依赖关系集合;
S3,针对所述每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中每项依赖关系,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:分析当前依赖关系所包含的目标组件,若所述目标组件的依赖关系集合中存在包含当前组件的依赖关系,则获知所述目标组件与当前组件之间存在相互引用关系。
具体地,步骤S1,在Android项目的编译器中,一个组件所有的依赖关系都是直接编写在编译脚本文件中的,通常编译脚本文件默认是build.gradle文件,在有些时候编译脚本文件的名称会被开发者改动。对于编译脚本文件的名称为build.gradle文件时,获取当前Android项目所有组件的编译脚本文件,则可以通过File类的构造函数来实例化一个file对象,并将build.gradle文件的路径传递给File类的构造函数,那么,该file对象此时就指向build.gradle文件了。对于编译脚本文件的名称被开发者改动的情况,首先需要定位编译脚本文件,编译脚本文件有一个最大的特点就是以“.gradle”来结尾的,所以我们可以定义一个File类的file对象,并且将组件的根目录路径传递给File类的构造函数,得到一个dirFile类的实例对象,接下来我们通过dirFile实例对象中的listFiles方法列出该目录下的所有文件列表,然后通过循环的方式依次判断文件列表中的文件是否以.gradle来进行结尾的,具体是通过调用endWith(“.gradle”)方式来判定的,如果判定成功说明该文件就是编译脚本文件,如果判定不成功就继续下一次循环直到找到该文件。并且我们将找到的该文件标记为buildFile。通过上述两种方式,最终可以获取到当前Android项目所有组件的编译脚本文件。
步骤S2对所有组件的编译脚本文件进行逐一解析,以筛选出与依赖关系有关的内容,解析的结果是获得每个组件的依赖关系集合。每个组件的依赖关系都写在编译脚本文件中的关键字dependencies之后,因此,对所有组件的编译脚本文件进行逐一解析是指获取每个组件的编译脚本文件中关键字dependencies后的内容信息,并将所获取到的关键字dependencies后的内容信息存储至一个集合list中,这样对所有组件的编译脚本文件进行解析后,会获得多个依赖关系集合,每个集合均对应存储着一个组件的所有依赖关系。
步骤S3顺序对每个组件的依赖关系集合中的每项依赖关系进行分析,分析出相互引用的关系链来,然后对相互引用的关系进行输出,方便开发者能够快速定位组件之间的相互引用关系。具体地,通过分析当前组件的每项依赖关系所包含的目标组件,然后在目标组件的依赖关系集合中查找是否存在包含当前组件的依赖关系,若存在,则说明目标组件与当前组件之间存在相互引用关系,从而将该相互引用关系输出,若不存在,则说明目标组件与当前组件之间不存在相互引用关系,则继续对下一项依赖关系进行分析,直至当前组件的依赖关系集合遍历完成。依次对每个组件的依赖关系集合执行以上分析过程,最终获得并输出组件之间所有的相互引用关系。
下面结合一个简单的例子来说明本发明实施例的过程。例如一个Android项目总共有三个组件,这三个组件通过上述步骤S1和S2的处理后分别得到三个依赖关系集合list1、list2、list3。然后从list1中通过get方法取出其中的一项依赖关系item,判定该item所包含的是哪一个目标组件,例如item所包含的目标组件是组件2,那么此时需要去组件2所对应的集合list2中查找是否存在包含组件1的依赖关系,如果存在包含组件1的依赖关系,此时说明组件1和组件2之间存在相互引用关系,此时将该问题信息输出给开发者。如果list2中不存在包含组件1的依赖关系,此时则继续从list1中取出下一个依赖关系,如果该依赖关系所包含的目标组件是组件3,同理在组件3所对应的依赖关系结合list3中查找是否存在包含组件1的依赖关系信息,从而判定list1中第二个元素是否有相互引用关系的存在。以此类推,我们使用同样的方法对list1、list2、list3中的所有元素都进行相同的遍历结果,如果整个遍历过程中没有出现任何一次相互引用关系的存在,那么整个检测过程通过,没有相互引用关系,如果检测中有任意一个引用关系是有相互依赖关系的,那么就需要将这种相互引用关系进行输出给开发者,方便开发者快速的定位问题。
本发明提出的获取Android系统组件相互引用关系的方法,能够快速的将所有组件之间的依赖关系呈现出来并给出组件之间的相互引用关系,避免了人工逐个打开组件并分析依赖关系,极大地提高了开发人员定位组件相互引用关系的效率,提升了开发速度并降低了人力成本的开销。
本发明另一实施例,在上述实施例的基础上,所述步骤S2进一步包括:
分别对各个组件的编译脚本文件执行以下步骤:
通过调用readLine方法获取当前组件的编译脚本文件中每一行的内容信息;
调用contains(“dependencies”)函数以判断当前行的内容信息中是否包含关键字dependencies,若不包含则开始读取下一行数据,直到某一行中包含关键字dependencies时开始读取“dependencies{”后的依赖关系信息,直至读取到“}”时为止;
将所读取到的依赖关系信息存储至一个集合中。
具体地,对每个组件的编译文件均执行以下步骤以实现对所述编译脚本文件逐一进行解析,获得每个组件的依赖关系集合:
通过调用file类中的open方法来打开buildFile编译脚本文件;然后通过调用其中的readLine方法来读取编译脚本文件每一行的内容信息,并将当前行读取的内容信息标记为str。
通过调用str中的contains(“dependencies”)函数来判断str中是否包含用于指示依赖关系的关键字dependencies,如果不包含就读取下一行数据,直到读取到某一行中包含dependencies的信息时开始真正的读取依赖关系的内容。如果当前函数的str中包含了dependencies字符串,我们需要对接下来的内容进行解析,直到读取到的内容是一个“}”表示dependencies的内容完成。
期间每读取一行的内容就是一条依赖关系信息,为了能够存储所有读取到的依赖关系我们使用了一个集合list来存储这些依赖关系,通过list中的add方法来向集合中添加一条依赖关系的内容到集合中。当整个读取过程完成的时候整个list列表中的内容就是当前组件的所有引用关系信息了。同理,按照类似的方式可以得到其他组件的依赖关系集合list(n),通过这样的解析处理我们就将所有组件的依赖关系全部转变成了集合存放在内存之中了。
本发明另一实施例,在上述实施例的基础上,所述步骤S2进一步包括:
分别对各个组件的编译脚本文件执行以下步骤:
通过调用file类中的readAll方法将当前组件的编译脚本文件中的所有内容信息读取到内存中;
调用indexOf(“dependencies{”)函数以获取所述内容信息中出现“dependencies{”的索引值index;
调用seek函数将文件游标移动到index+length(“dependencies{”)所表示的位置,通过不断移动文件游标读取“dependencies{”后的依赖关系信息,直至读取到“}”时为止;
将所读取到的依赖关系信息存储至一个集合中。
具体地,除了通过上一实施例的方式来获取到所有组件的依赖关系集合外,本发明实施例提供更快地获取所有组件的依赖关系集合的方法。首先通过file对象中的readAll函数一次性将当前组件的整个编译脚本文件读取到内存中并将读取到内存中的内容标记为allStr,然后调用allStr中的indexOf(“dependencies{”)函数获取到allStr字符串中出现“dependencies{”的位置信息,indexof函数的返回值是字符串“dependencies{”首字符出现的位置,即字符串“dependencies{”的偏移量,一旦出现“dependencies{”表示依赖关系的开始,之所以多添加了一个“{”就是为了确保该dependencies出现的地方就是依赖关系开始的地方。
通过indexOf函数调用后知道了字符串“dependencies{”的偏移量,我们将获取到的偏移量标记为index,然后通过调用file中的seek函数将文件游标偏移到index+length(“dependencies{”)所在的位置,这样文件游标就直接指向了依赖的起始位置了,接下来通过不断移动游标的方式来读取所有的依赖关系内容,直到读取到“}”这个依赖的包结构中的结束符为止,这样就获取到了所有的依赖关系并将获取到的依赖关系保存在集合list中。
上述读取依赖关系时直接定位到了目标位置,然后通过seek函数直接将文件游标移动到目标点这样就速度会快于上一实施例中的逐行读取的速度。
通过以上两个实施例所提供的方法获取到了所有组件的依赖关系集合后,接下来要对这些依赖关系集合进行智能的分析,分析出其中哪些依赖关系可能造成了相互引用的逻辑。
基于上述实施例,在步骤S3中所述分析当前依赖关系所包含的目标组件的步骤之后还包括:
若所述目标组件的依赖关系集合中不存在包含当前组件的依赖关系,则获知所述目标组件与当前组件之间不存在相互引用关系,则开始对当前组件的依赖关系集合中的下一项依赖关系进行分析。
通过分析当前组件的每项依赖关系所包含的目标组件,然后在目标组件的依赖关系集合中查找是否存在包含当前组件的依赖关系,若存在,则说明目标组件与当前组件之间存在相互引用关系,从而将该相互引用关系输出,若不存在,则获知目标组件与当前组件之间不存在相互引用关系,则继续对当前组件的依赖关系集合中的下一项依赖关系进行分析,直至当前组件的依赖关系集合遍历完成。这样做的目的是找到当前组件所存在的所有相互引用关系。
本发明另一实施例,在上述实施例的基础上,所述步骤S3进一步包括:
S31,对各个组件进行编号;
S32,分析每个组件的依赖关系集合中的每项依赖关系所包含的目标组件,并获取所述目标组件的编号,将所述每项依赖关系分别映射为所获取到的编号;
S33,按照编号从小到大对所述每个组件的依赖关系集合中的所有依赖关系进行排序;
S34,针对所述每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中的每个编号作为当前编号,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:获取当前编号所对应的目标组件的依赖关系集合中所有小于所述当前编号的依赖关系,若所获取到的所有小于所述当前编号的依赖关系中存在与所述当前组件的编号相对应的依赖关系,则获知当前组件与所述目标组件之间存在相互引用关系。
具体地,为了能够更快速的找到组件之间的相互引用关系,将组件与数字之间建立一套一一映射关系,对每个组件进行唯一的编号处理。编号的方式分别是1、2、3…,通过这样的处理我们的组件就被命名成了数字了。相应地,分析每个组件的依赖关系集合中的每项依赖关系所包含的目标组件,这个目标组件有它对应的编号,获取所述目标组件的编号,因此,每项依赖关系也被标记为与编号有关的依赖关系了,从而可以将每项依赖关系分别映射为该项依赖关系所对应的目标组件的编号。
也就是此时将每个组件的依赖关系集合映射成了一个纯数字组成的数组,然后对该数组进行从小到大的排序处理。
针对每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中的每个编号作为当前编号,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:获取当前编号所对应的目标组件的依赖关系集合中所有小于所述当前编号的依赖关系,并在所获取到的所有小于所述当前编号的依赖关系中查找是否存在与所述当前组件的编号相对应的依赖关系,若存在,则获知当前组件与所述目标组件之间存在相互引用关系,并将所述目标组件与当前组件之间的相互引用关系进行输出。
例如一个Android项目总共有三个组件,这三个组件通过上述步骤S1和S2的处理后分别得到三个依赖关系集合list1、list2、list3。将组件1标记为1,组件2标记为2,组件3标记为3,它们分别所对应的有依赖关系集合list1、list2、list3,经过步骤S32和S33的处理后,集合中的元素即每项依赖关系都映射为数字。对于组件1,取出组件1所对应的依赖关系集合list1中的第一个元素,假如是2,即当前编号是2,所对应的目标组件是组件2,此时需要找到组件2的依赖关系集合list2,然后一次取出list2中所有小于当前编号2的依赖关系,若获取到所有小于当前编号2的依赖关系为1,而1对应当前组件的编号,则获知当前组件1与所述目标组件2之间存在相互引用关系。将该组件1与组件2之间存在相互引用关系进行输出,即提供给开发人员。
基于上述实施例,所述步骤S34还包括:
若当前编号所对应的目标组件的依赖关系集合中不存在小于所述当前编号的依赖关系,则获知当前组件与所述目标组件之间不存在相互引用关系,则开始对当前组件的依赖关系集合中的下一个编号进行分析。
结合上述实施例中的例子来进行具体说明,对于组件1,取出组件1所对应的依赖关系集合list1中的第一个元素,假如是2,即当前编号是2,所对应的目标组件是组件2,此时我们就需要找到组件2的依赖关系集合list2,然后一次取出list2中所有小于当前编号2的依赖关系,若没有获取到小于当前编号2的依赖关系,例如list2的第一个元素为3,由于已经对每个依赖关系集合按照从小到大进行了排序,则说明组件2依赖的都是编号大于等于3的组件,所以list2中肯定不会出现和list1存在相互引用关系的依赖关系,这样就不用再继续对list2中的其他元素进行遍历处理了,而是开始对当前组件1的依赖关系集合list1中的下一个编号进行分析,从而可以提高查找相互引用的效率,极大提升定位相互引用关系的速度。
如图2所示,为本发明另一实施例提供的获取Android中组件相互引用关系的装置的结构示意图,包括:第一获取模块21、第二获取模块22和分析与输出模块23,其中,
第一获取模块,用于获取目标Android项目中所有组件的编译脚本文件;
第二获取模块,用于分别对各所述编译脚本文件进行解析,获取每个组件的依赖关系集合;
分析与输出模块,用于针对所述每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中的每项依赖关系,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:分析当前依赖关系所包含的目标组件,若所述目标组件的依赖关系集合中存在包含当前组件的依赖关系,则获知所述目标组件与当前组件之间存在相互引用关系。
具体地,在Android项目的编译器中,一个组件所有的依赖关系都是直接编写在编译脚本文件中的,通常编译脚本文件默认是build.gradle文件,在有些时候编译脚本文件的名称会被开发者改动。第一获取模块21用于对于编译脚本文件的名称为build.gradle文件时,获取当前Android项目所有组件的编译脚本文件,则可以通过File类的构造函数来实例化一个file对象,并将build.gradle文件的路径传递给File类的构造函数,那么,该file对象此时就指向build.gradle文件了。第一获取模块21对于编译脚本文件的名称被开发者改动的情况,首先需要定位编译脚本文件,编译脚本文件有一个最大的特点就是以“.gradle”来结尾的,所以我们可以定义一个File类的file对象,并且将组件的根目录路径传递给File类的构造函数,得到一个dirFile类的实例对象,接下来我们通过dirFile实例对象中的listFiles方法列出该目录下的所有文件列表,然后通过循环的方式依次判断文件列表中的文件是否以.gradle来进行结尾的,具体是通过调用endWith(“.gradle”)方式来判定的,如果判定成功说明该文件就是编译脚本文件,如果判定不成功就继续下一次循环直到找到该文件。并且我们将找到的该文件标记为buildFile。通过上述两种方式,最终可以获取到当前Android项目所有组件的编译脚本文件。
第二获取模块22用于对所有组件的编译脚本文件进行逐一解析,以筛选出与依赖关系有关的内容,解析的结果是获得每个组件的依赖关系集合。每个组件的依赖关系都写在编译脚本文件中的关键字dependencies之后,因此,对所有组件的编译脚本文件进行逐一解析是指获取每个组件的编译脚本文件中关键字dependencies后的内容信息,并将所获取到的关键字dependencies后的内容信息存储至一个集合list中,这样对所有组件的编译脚本文件进行解析后,会获得多个依赖关系集合,每个集合均对应存储着一个组件的所有依赖关系。
分析与输出模块23用于顺序对每个组件的依赖关系集合中的每项依赖关系进行分析,分析出相互引用的关系链来,然后对相互引用的关系进行输出,方便开发者能够快速定位组件之间的相互引用关系。具体地,通过分析当前组件的每项依赖关系所包含的目标组件,然后在目标组件的依赖关系集合中查找是否存在包含当前组件的依赖关系,若存在,则说明目标组件与当前组件之间存在相互引用关系,从而将该相互引用关系输出,若不存在,则说明目标组件与当前组件之间不存在相互引用关系,则继续对下一项依赖关系进行分析,直至当前组件的依赖关系集合遍历完成。依次对每个组件的依赖关系集合执行以上分析过程,最终获得并输出组件之间所有的相互引用关系。
本发明提出的获取Android系统组件相互引用关系的装置,能够快速地将所有组件之间的依赖关系呈现出来并给出组件之间的相互引用关系,避免了人工逐个打开组件并分析依赖关系,极大地提高了开发人员定位组件相互引用关系的效率,提升了开发速度并降低了人力成本的开销。
本发明另一实施例,在上述实施例的基础上,所述分析与输出模块23具体用于:
其中,所述分析与输出模块具体用于:
对各个组件进行编号;
分析每个组件的依赖关系集合中的每项依赖关系所包含的目标组件,并获取所述目标组件的编号,将所述每项依赖关系分别映射为所获取到的编号;
按照编号从小到大对所述每个组件的依赖关系集合中的所有依赖关系进行排序;
针对所述每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中的每个编号作为当前编号,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:获取当前编号所对应的目标组件的依赖关系集合中所有小于所述当前编号的依赖关系,若所获取到的所有小于所述当前编号的依赖关系中存在与所述当前组件的编号相对应的依赖关系,则获知当前组件与所述目标组件之间存在相互引用关系。
具体地,为了能够更快速的找到组件之间的相互引用关系,分析与输出模块23具体用于将组件与数字之间建立一套一一映射关系,对每个组件进行唯一的编号处理。编号的方式分别是1、2、3…,通过这样的处理我们的组件就被命名成了数字了。相应地,分析每个组件的依赖关系集合中的每项依赖关系所包含的目标组件,这个目标组件有它对应的编号,获取所述目标组件的编号,因此,每项依赖关系也被标记为与编号有关的依赖关系了,从而可以将每项依赖关系分别映射为该项依赖关系所对应的目标组件的编号。
也就是此时分析与输出模块23将每个组件的依赖关系集合映射成了一个纯数字组成的数组,然后,对该数组进行从小到大的排序处理。
接下来,针对每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中的每个编号作为当前编号并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:获取当前编号所对应的目标组件的依赖关系集合中所有小于所述当前编号的依赖关系,并在所获取到的所有小于所述当前编号的依赖关系中查找是否存在与所述当前组件的编号相对应的依赖关系,若存在,则获知当前组件与所述目标组件之间存在相互引用关系,并将所述目标组件与当前组件之间的相互引用关系进行输出。
如图3所示,为本发明另一实施例提供的获取Android中组件相互引用关系的设备的结构示意图,包括存储器31、处理器32、以及总线33,
所述处理器32和存储器31通过所述总线33完成相互间的通信;
所述存储器31存储有可被所述处理器32执行的程序指令,所述处理器32调用所述存储器31中的程序指令,以执行如上述各实施例所述的方法,例如包括:S1,获取目标Android项目中所有组件的编译脚本文件;S2,分别对各所述编译脚本文件进行解析,获取每个组件的依赖关系集合;S3,针对所述每个组件的依赖关系集合执行以下步骤:顺序取出当前组件的依赖关系集合中每项依赖关系,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:分析当前依赖关系所包含的目标组件,若所述目标组件的依赖关系集合中存在包含当前组件的依赖关系,则获知所述目标组件与当前组件之间存在相互引用关系。
本发明又一实施例,在上述实施例的基础上,提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行如上述各实施例所述的方法,例如包括:S1,获取目标Android项目中所有组件的编译脚本文件;S2,分别对各所述编译脚本文件进行解析,获取每个组件的依赖关系集合;S3,针对所述每个组件的依赖关系集合执行以下步骤:顺序取出当前组件的依赖关系集合中每项依赖关系,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:分析当前依赖关系所包含的目标组件,若所述目标组件的依赖关系集合中存在包含当前组件的依赖关系,则获知所述目标组件与当前组件之间存在相互引用关系。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的获取Android中组件相互引用关系的设备实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后,本发明的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (6)
1.获取Android中组件相互引用关系的方法,其特征在于,包括:
S1,获取目标Android项目中所有组件的编译脚本文件;
S2,分别对各所述编译脚本文件进行解析,获取每个组件的依赖关系集合;
S3,针对所述每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中每项依赖关系,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:分析当前依赖关系所包含的目标组件,若所述目标组件的依赖关系集合中存在包含当前组件的依赖关系,则获知所述目标组件与当前组件之间存在相互引用关系;
其中,所述步骤S2进一步包括:
分别对各个组件的编译脚本文件执行以下步骤:
通过调用readLine方法获取当前组件的编译脚本文件中每一行的内容信息;
调用contains(“dependencies”)函数以判断当前行的内容信息中是否包含关键字dependencies,若不包含则开始读取下一行数据,直到某一行中包含关键字dependencies时开始读取“dependencies{”后的依赖关系信息,直至读取到“}”时为止;
将所读取到的依赖关系信息存储至一个集合中;或者,
所述步骤S2进一步包括:
分别对各个组件的编译脚本文件执行以下步骤:
通过调用file类中的readAll方法将当前组件的编译脚本文件中的所有内容信息读取到内存中;
调用indexOf(“dependencies{”)函数以获取所述内容信息中出现“dependencies{”的索引值index;
调用seek函数将文件游标移动到index+length(“dependencies{”)所表示的位置,通过不断移动文件游标读取“dependencies{”后的依赖关系信息,直至读取到“}”时为止;
将所读取到的依赖关系信息存储至一个集合中;
其中,所述步骤S3进一步包括:
S31,对各个组件进行编号;
S32,分析每个组件的依赖关系集合中的每项依赖关系所包含的目标组件,并获取所述目标组件的编号,将所述每项依赖关系分别映射为所获取到的编号;
S33,按照编号从小到大对所述每个组件的依赖关系集合中的所有依赖关系进行排序;
S34,针对所述每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中的每个编号作为当前编号,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:获取当前编号所对应的目标组件的依赖关系集合中所有小于所述当前编号的依赖关系,若所获取到的所有小于所述当前编号的依赖关系中存在与所述当前组件的编号相对应的依赖关系,则获知当前组件与所述目标组件之间存在相互引用关系。
2.根据权利要求1所述的方法,其特征在于,在步骤S3中所述分析当前依赖关系所包含的目标组件的步骤之后还包括:
若所述目标组件的依赖关系集合中不存在包含当前组件的依赖关系,则获知所述目标组件与当前组件之间不存在相互引用关系,则开始对当前组件的依赖关系集合中的下一项依赖关系进行分析。
3.根据权利要求1所述的方法,其特征在于,所述步骤S34还包括:
若当前编号所对应的目标组件的依赖关系集合中不存在小于所述当前编号的依赖关系,则获知当前组件与所述目标组件之间不存在相互引用关系,则开始对当前组件的依赖关系集合中的下一个编号进行分析。
4.获取Android中组件相互引用关系的装置,其特征在于,包括:
第一获取模块,用于获取目标Android项目中所有组件的编译脚本文件;
第二获取模块,用于分别对各所述编译脚本文件进行解析,获取每个组件的依赖关系集合;
分析与输出模块,用于针对所述每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中的每项依赖关系,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:分析当前依赖关系所包含的目标组件,若所述目标组件的依赖关系集合中存在包含当前组件的依赖关系,则获知所述目标组件与当前组件之间存在相互引用关系;
其中,所述第二获取模块具体用于:
分别对各个组件的编译脚本文件执行以下步骤:
通过调用readLine方法获取当前组件的编译脚本文件中每一行的内容信息;
调用contains(“dependencies”)函数以判断当前行的内容信息中是否包含关键字dependencies,若不包含则开始读取下一行数据,直到某一行中包含关键字dependencies时开始读取“dependencies{”后的依赖关系信息,直至读取到“}”时为止;
将所读取到的依赖关系信息存储至一个集合中;或者,
所述第二获取模块具体用于:
分别对各个组件的编译脚本文件执行以下步骤:
通过调用file类中的readAll方法将当前组件的编译脚本文件中的所有内容信息读取到内存中;
调用indexOf(“dependencies{”)函数以获取所述内容信息中出现“dependencies{”的索引值index;
调用seek函数将文件游标移动到index+length(“dependencies{”)所表示的位置,通过不断移动文件游标读取“dependencies{”后的依赖关系信息,直至读取到“}”时为止;
将所读取到的依赖关系信息存储至一个集合中;
其中,所述分析与输出模块具体用于:
对各个组件进行编号;
分析每个组件的依赖关系集合中的每项依赖关系所包含的目标组件,并获取所述目标组件的编号,将所述每项依赖关系分别映射为所获取到的编号;
按照编号从小到大对所述每个组件的依赖关系集合中的所有依赖关系进行排序;
针对所述每个组件的依赖关系集合执行以下步骤:
顺序取出当前组件的依赖关系集合中的每个编号作为当前编号,并执行以下步骤直至所述当前组件的依赖关系集合遍历完成:获取当前编号所对应的目标组件的依赖关系集合中所有小于所述当前编号的依赖关系,若所获取到的所有小于所述当前编号的依赖关系中存在与所述当前组件的编号相对应的依赖关系,则获知当前组件与所述目标组件之间存在相互引用关系。
5.获取Android中组件相互引用关系的设备,其特征在于,包括存储器、处理器、以及总线,
所述处理器和存储器通过所述总线完成相互间的通信;
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述存储器中的程序指令,以执行如权利要求1至3任一所述的方法。
6.一种非暂态计算机可读存储介质,其特征在于,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行如权利要求1至3任一所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711072168.3A CN107885501B (zh) | 2017-11-03 | 2017-11-03 | 获取Android中组件相互引用关系的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711072168.3A CN107885501B (zh) | 2017-11-03 | 2017-11-03 | 获取Android中组件相互引用关系的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107885501A CN107885501A (zh) | 2018-04-06 |
CN107885501B true CN107885501B (zh) | 2020-09-08 |
Family
ID=61778472
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711072168.3A Expired - Fee Related CN107885501B (zh) | 2017-11-03 | 2017-11-03 | 获取Android中组件相互引用关系的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107885501B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109189729B (zh) * | 2018-09-03 | 2024-07-19 | 五八有限公司 | 各组件间依赖关系的查找方法、装置、设备及存储介质 |
CN109725905A (zh) * | 2018-12-26 | 2019-05-07 | 苏州思必驰信息科技有限公司 | 基于源码集的软件架构及实现方法、用于编译pins组件的插件及应用方法 |
CN112214263A (zh) * | 2019-07-12 | 2021-01-12 | 中国电信股份有限公司 | 数据库脚本的调度方法和装置以及存储介质 |
CN110618931B (zh) * | 2019-08-14 | 2024-06-07 | 重庆金融资产交易所有限责任公司 | 依赖关系检测方法、装置、计算机设备及可读存储介质 |
CN110795102B (zh) * | 2019-09-27 | 2023-08-29 | 上海掌门科技有限公司 | 模块编译方法、装置、电子设备和计算机可读介质 |
CN113805887B (zh) * | 2020-06-15 | 2024-03-01 | 中国电信股份有限公司 | 文件循环引用检测方法、装置以及存储介质 |
CN111538495B (zh) * | 2020-07-13 | 2020-10-23 | 深圳开源互联网安全技术有限公司 | 识别项目中引用Python开源组件的方法及系统、设备 |
CN112256637A (zh) * | 2020-10-19 | 2021-01-22 | 贝壳技术有限公司 | 一种基于抽象语法树的文件管理方法、装置及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102360308A (zh) * | 2011-09-29 | 2012-02-22 | 用友软件股份有限公司 | 组件的分布式部署系统和方法 |
CN105184168A (zh) * | 2015-09-02 | 2015-12-23 | 青岛工业软件研究所(中国科学院软件研究所青岛分部) | Android系统源码漏洞关联影响的追踪方法 |
CN105303112A (zh) * | 2014-06-24 | 2016-02-03 | 腾讯科技(深圳)有限公司 | 组件调用漏洞的检测方法及装置 |
CN105787366A (zh) * | 2016-02-16 | 2016-07-20 | 上海交通大学 | 基于组件关系的安卓软件可视化安全分析方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10742759B2 (en) * | 2015-02-18 | 2020-08-11 | Red Hat, Inc. | Workflow-based push notifications |
-
2017
- 2017-11-03 CN CN201711072168.3A patent/CN107885501B/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102360308A (zh) * | 2011-09-29 | 2012-02-22 | 用友软件股份有限公司 | 组件的分布式部署系统和方法 |
CN105303112A (zh) * | 2014-06-24 | 2016-02-03 | 腾讯科技(深圳)有限公司 | 组件调用漏洞的检测方法及装置 |
CN105184168A (zh) * | 2015-09-02 | 2015-12-23 | 青岛工业软件研究所(中国科学院软件研究所青岛分部) | Android系统源码漏洞关联影响的追踪方法 |
CN105787366A (zh) * | 2016-02-16 | 2016-07-20 | 上海交通大学 | 基于组件关系的安卓软件可视化安全分析方法 |
Non-Patent Citations (2)
Title |
---|
Android组件化项目详细实施方案;pedestrian-one;《https://blog.csdn.net/qq_27650777/article/details/64122989》;20170320;第2-5页 * |
模块依赖关系分析-Java实现;yguoelect;《https://blog.csdn.net/yguoelect/article/details/77369267》;20170818;第1-3页 * |
Also Published As
Publication number | Publication date |
---|---|
CN107885501A (zh) | 2018-04-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107885501B (zh) | 获取Android中组件相互引用关系的方法及装置 | |
US11507354B2 (en) | Blackbox matching engine | |
CN112149399B (zh) | 基于rpa及ai的表格信息抽取方法、装置、设备及介质 | |
CN112394942B (zh) | 基于云计算的分布式软件开发编译方法及软件开发平台 | |
US9747190B2 (en) | Analysis system, analysis method, and computer program product | |
CN111190594B (zh) | Vue组件的文档生成方法及装置 | |
CN106547527B (zh) | 一种JavaScript文件构建方法及装置 | |
CN109542412A (zh) | 接口信息生成方法、装置、计算机设备和存储介质 | |
CN110795069A (zh) | 代码分析方法、智能终端及计算机可读存储介质 | |
CN112347142B (zh) | 数据处理方法及装置 | |
CN111611788B (zh) | 一种数据处理的方法及装置、电子设备、存储介质 | |
CN118245050A (zh) | 前端框架组件自动转换方法、系统、电子设备及存储介质 | |
CN112463596B (zh) | 测试用例数据的处理方法、装置、设备以及处理设备 | |
US9529573B2 (en) | Graphical user interface generation through use of a binary file | |
CN113760734A (zh) | 一种数据准备方法及装置、设备、存储介质 | |
CN111352741A (zh) | 接口调用的方法、装置、智能终端及存储装置 | |
CN112799673B (zh) | 一种网络协议数据的校核方法及装置 | |
CN113342749A (zh) | 文件路径匹配方法、装置、设备及计算机可读存储介质 | |
CN113946516A (zh) | 代码覆盖率确定方法、装置及存储介质 | |
CN114065197A (zh) | 调用序列生成方法、装置、电子设备、存储介质及产品 | |
CN112230895A (zh) | 一种el表达式解析方法、装置、设备及存储介质 | |
CN111949309A (zh) | 拉取idl文件的方法、装置、计算机设备和存储介质 | |
CN110955687B (zh) | 数据修改方法及装置 | |
CN113094040B (zh) | 一种小程序编译方法和装置 | |
CN114816425B (zh) | 将自动化语言程序转换为lua语言程序的方法和系统 |
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 | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20200908 |