一种线程检测方法、装置、设备及计算机可读存储介质与流程

文档序号:15850776发布日期:2018-11-07 09:52阅读:168来源:国知局
一种线程检测方法、装置、设备及计算机可读存储介质与流程

本发明涉及线程检测技术领域,尤其涉及一种线程检测方法、装置、设备及计算机可读存储介质。

背景技术

rxjava是安卓android开发过程中一种非常流行的技术,rxjava是rx(reactiveextensions,响应式拓展)针对于java语言的一个异步的响应式扩展编程库。rxjava可以大大提高开发效率,优化代码结构,便于线程切换。因此许多应用程序app都是通过rxjava进行开发的。在使用过程中,伴随着rxjava的优点,一些问题也日益暴露。由于rxjava的线程切换操作极其方便,因此开发者在使用过程中很容易产生线程错误的问题。例如,在rxjava中的observeon()方法决定了subscriber的执行线程,在rxjava中的subscribeon()方法决定了observable的执行线程。然而,开发者极容易把两者搞混,或是因疏忽导致线程设置错误,使代码运行在错误的线程,从而产生崩溃等问题。由于rxjava内部对错误进行了捕获,开发者很难直接定位到错误,造成了改错成本巨大,出错成本极低的情况。



技术实现要素:

本发明的主要目的在于提出一种线程检测方法、装置、设备及计算机可读存储介质,可以在编译前对线程进行检测,及时向开发者进行错误提醒,避免产生线程错误的问题。

为实现上述目的,本发明提供了一种线程检测方法,所述方法包括:

子工程获取检测规则;

所述子工程根据所述检测规则查找到响应式扩展编程库rxjava中的待检测逻辑方法,并获取所述待检测逻辑方法中的线程参数类型;

在所述待检测逻辑方法中的线程参数类型与所述检测规则中的标准线程参数类型不一致的情况下,所述子工程发送用于指出线程异常的警告信息。

可选的,所述子工程获取检测规则,包括:

所述子工程获取检测二进制归档aar文件;

所述子工程从所述检测aar文件中解析出检测java归档文件jar包;

所述子工程从所述检测jar包中编译出所述检测规则。

可选的,所述子工程获取检测aar文件,包括:

所述子工程接收由主工程通过预设接口发送来的所述检测aar文件。

可选的,当所述待检测逻辑方法为subscribeon()方法和/或observeon()方法时,所述子工程根据所述检测规则查找到rxjava中的待检测逻辑方法,并获取所述待检测逻辑方法中的线程参数类型,包括:

所述子工程查找在rxjava中调用的subscribe()方法;

所述子工程基于查找到的subscribe()方法,查找在rxjava中调用的subscribeon()方法和/或observeon()方法;

所述子工程检测subscribeon()方法和/或observeon()方法中的线程参数类型。

可选的,当所述待检测逻辑方法为subscribeon()方法和/或observeon()方法时,所述在所述待检测逻辑方法中的线程参数类型与所述检测规则中的标准线程参数类型不一致的情况下,所述子工程发送用于指出线程异常的警告信息,包括:

在subscribeon()方法中的线程参数为主线程参数,或者observeon()方法中的线程参数为子线程参数的情况下,所述子工程发送用于指出线程异常的警告信息。

此外,为实现上述目的,本发明还提出一种线程检测装置,应用于子工程中,所述装置包括:

获取模块,用于获取检测规则;

检测模块,用于根据所述检测规则查找到rxjava中的待检测逻辑方法,并获取所述待检测逻辑方法中的线程参数类型;

警告模块,用于在所述待检测逻辑方法中的线程参数类型与所述检测规则中的标准线程参数类型不一致的情况下,所述子工程发送用于指出线程异常的警告信息。

可选的,当所述待检测逻辑方法为subscribeon()方法和/或observeon()方法时,所述检测模块,具体用于:

查找在rxjava中调用的subscribe()方法;基于查找到的subscribe()方法,查找在rxjava中调用的subscribeon()方法和/或observeon()方法;检测subscribeon()方法和/或observeon()方法中的线程参数类型。

可选的,当所述待检测逻辑方法为subscribeon()方法和/或observeon()方法时,所述警告模块,具体用于:

在subscribeon()方法中的线程参数为主线程参数,或者observeon()方法中的线程参数为子线程参数的情况下,所述子工程发送用于指出线程异常的警告信息。

此外,为实现上述目的,本发明还提出一种线程检测设备,所述设备包括:处理器、存储器及通信总线;

所述通信总线用于实现所述处理器和所述存储器之间的连接通信;

所述处理器用于执行所述存储器中存储的线程检测程序,以实现上述介绍的线程检测方法的步骤。

此外,为实现上述目的,本发明还提出一种计算机可读存储介质,所述计算机可读存储介质存储有线程检测程序;

当所述线程检测程序被至少一个处理器执行时,导致所述至少一个处理器执行上述介绍的线程检测方法的步骤。

本发明提出的线程检测方法、装置、设备及计算机可读存储介质,根据rxjava的线程处理特征,设置检测逻辑,从而有效检测线程中的错误。在本发明中,线程的检测逻辑与业务逻辑完全分离,可直接检测任何工程。

附图说明

图1是本发明第一实施例的线程检测方法的流程图;

图2是本发明第一实施例的rxjava的调用示意图;

图3是本发明第一实施例的在通过lint进行线程检测时,返回方法信息的类的示意图;

图4是本发明第二实施例的线程检测方法的流程图;

图5是本发明第三实施例的线程检测方法的流程图;

图6是本发明第四实施例的线程检测装置的组成结构示意图;

图7是本发明第五实施例的线程检测设备的组成结构示意图。

具体实施方式

为更进一步阐述本发明为达成预定目的所采取的技术手段及功效,以下结合附图及较佳实施例,对本发明进行详细说明如后。

本发明第一实施例,提出了一种线程检测方法,如图1所示,所述方法具体包括以下步骤:

步骤s101:子工程获取检测规则。

其中,检测规则为预先设置的用于线程检测的规则。

具体的,所述检测规则是根据lint工具生成的。

为了有效检测线程安全的问题,首先需要一款有效的线程检测工具来进行线程扫描。在本发明实施例中使用的线程检测工具为lint,因为lint直接内置在androidstudio中,有许多功能强大的原生检测逻辑,而且可以实现自定义的检测逻辑。

步骤s102:所述子工程根据所述检测规则查找到rxjava中的待检测逻辑方法,并获取所述待检测逻辑方法中的线程参数类型。

具体的,当所述待检测逻辑方法为subscribeon()方法和/或observeon()方法时,步骤s102,包括:

步骤a1:所述子工程通过lint工具查找在rxjava中调用的subscribe()方法。

步骤a2:所述子工程基于查找到的subscribe()方法,通过lint工具查找在rxjava中调用的subscribeon()方法和/或observeon()方法。

步骤a3:所述子工程通过lint工具检测subscribeon()方法和/或observeon()方法中的线程参数类型。

进一步,在本发明实施例中,通过将rxjava自身的线程处理特征与lint中线程检测接口的特点进行结合,编写用于检测线程错误的检测规则。

rxjava采用的为链式调用,如图2所示,为rxjava的调用示意图。其中,可能出现问题的为subscribeon()方法和observeon()方法。如果将这两个方法指定成错误的线程,则会造成线程错误问题。然而,通常需要将subscriber设置为在主线程中执行,将observable设置为在子线程中执行,也就是说,subscribeon()方法中的参数应该为子线程参数,observeon()方法方法中的参数应该为主线程参数。

通过lint进行线程检测时,会返回一个方法信息的类methodinvocation,如图3所示。在该类中,可以看到当前方法的属性,以及当前方法的前一个方法和后一个方法的属性。因此,lint工具正好适用于rxjava的链式调用。可以利用lint工具先查找到rxjava调用中必有的subscribe()方法,再根据subscribe()方法,查找到rxjava调用中的subscribeon()方法和observeon()方法。从而检测subscribeon()方法中的参数是否为子线程参数,以及observeon()方法中的参数是否为主线程参数。

步骤s103:在所述待检测逻辑方法中的线程参数类型与所述检测规则中的标准线程参数类型不一致的情况下,所述子工程发送用于指出线程异常的警告信息。

具体的,当所述待检测逻辑方法为subscribeon()方法和/或observeon()方法时,步骤s103,包括:

在subscribeon()方法中的线程参数为主线程参数,或者observeon()方法中的线程参数为子线程参数的情况下,所述子工程发送用于指出线程异常的警告信息。

如果subscribeon()方法中的线程参数不是子线程参数,或者observeon()方法中的线程参数不是主线程参数,则发送用于指出线程异常的警告信息,以通知开发者注意该段代码可能存在问题。

本发明第二实施例,提出了一种线程检测方法,如图4所示,所述方法具体包括以下步骤:

步骤s401:子工程从指定文件夹中获取检测aar文件。

步骤s402:所述子工程从所述检测aar文件中解析出检测jar包。

步骤s403:所述子工程从所述检测jar包中编译出检测规则。

为了让工程容易依赖,引入lint工具的方式有很多,通常的引入方式为:将根据lint工具生成的检测jar包放置于指定文件夹中。但是,这种方式会导致本机的所有工程都会执行该检测jar包中的检测规则。在本发明实施例中,为了避免本机的所有工程都进行线程检测,先将检测规则形成检测jar包,再将检测jar包形成检测aar文件,并将检测aar文件放置于指定文件夹中,以供工程引入。因此,只有引入检测aar文件的工程才会通过检测规则进行线程检测,而没有引入检测aar文件的工程不会进行线程检测。

步骤s404:所述子工程通过所述检测规则检测在rxjava中调用的subscribeon()方法和observeon()方法中的线程参数的类型。

具体的,在本发明实施例中,通过将rxjava自身的线程处理特征与lint中线程检测接口的特点进行结合,编写用于检测线程错误的检测规则。

rxjava采用的为链式调用,如图2所示,为rxjava的调用示意图。其中,可能出现问题的为subscribeon()方法和observeon()方法。如果将这两个方法指定成错误的线程,则会造成线程错误问题。然而,通常需要将subscriber设置为在主线程中执行,将observable设置为在子线程中执行,也就是说,subscribeon()方法中的参数应该为子线程参数,observeon()方法方法中的参数应该为主线程参数。

通过lint进行线程检测时,会返回一个方法信息的类methodinvocation,如图3所示。在该类中,可以看到当前方法的属性,以及当前方法的前一个方法和后一个方法的属性。因此,lint工具正好适用于rxjava的链式调用。可以利用lint工具先查找到rxjava调用中必有的subscribe()方法,再根据subscribe()方法,查找到rxjava调用中的subscribeon()方法和observeon()方法。从而检测subscribeon()方法中的参数是否为子线程参数,以及observeon()方法中的参数是否为主线程参数。

进一步,步骤s404,包括:

步骤a1:所述子工程通过lint工具查找在rxjava中调用的subscribe()方法;

步骤a2:所述子工程基于查找到的subscribe()方法,通过lint工具查找在rxjava中调用的subscribeon()方法和observeon()方法,并通过lint检测subscribeon()方法和observeon()方法中的线程参数的类型。

步骤s405:在subscribeon()方法中的线程参数为主线程参数,或者observeon()方法中的线程参数为子线程参数的情况下,所述子工程发送警告信息。

如果subscribeon()方法中的参数不是子线程参数,或者observeon()方法中的参数不是主线程参数,则发出警告信息,以通知开发者注意该段代码可能存在问题。

本发明第三实施例,提出了一种线程检测方法,如图5所示,所述方法具体包括以下步骤:

步骤s501:子工程接收由主工程通过subprojects接口发送来的检测aar文件。

具体的,对于简单的主工程,可以逐一将检测aar文件引入到需要进行线程检测的子工程中。但是,如果主工程存在较多子工程,逐一引入检测aar文件的成本很高。为了简化引入,在本发明实施例中,并不是将检测aar文件直接引入子工程中,而是将检测aar文件引入到主工程中。主工程类似于一个包装,包着所有子工程,所以主工程可以对所有的子工程执行一些批量操作。

在主工程的build.gradle中,通过subprojects接口,对每个子工程进行批量引入检测aar文件。在subprojects接口里面定义的操作会对所有子工程执行。这样就把检测aar文件进入到了每个子工程中。

步骤s502:所述子工程从所述检测aar文件中解析出检测jar包,并从所述检测jar包中编译出检测规则。

具体的,子工程需要通过compile方法编译检测aar文件中的检测规则,但是由于在主工程的build.gradle中不支持compile方法,所以还需要单独引入java插件提供依赖。

在本发明实施例中,为了避免所有子工程都进行线程检测,先将检测规则形成检测jar包,再将检测jar包形成检测aar文件。只有引入检测aar文件的子工程才会通过检测规则进行线程检测,而没有引入检测aar文件的子工程不会进行线程检测。

步骤s503:所述子工程通过所述检测规则检测在rxjava中调用的subscribeon()方法和observeon()方法中的线程参数的类型。

具体的,在本发明实施例中,通过将rxjava自身的线程处理特征与lint中线程检测接口的特点进行结合,编写用于检测线程错误的检测规则。

rxjava采用的为链式调用,如图2所示,为rxjava的调用示意图。其中,可能出现问题的为subscribeon()方法和observeon()方法。如果将这两个方法指定成错误的线程,则会造成线程错误问题。然而,通常需要将subscriber设置为在主线程中执行,将observable设置为在子线程中执行,也就是说,subscribeon()方法中的参数应该为子线程参数,observeon()方法方法中的参数应该为主线程参数。

通过lint进行线程检测时,会返回一个方法信息的类methodinvocation,如图3所示。在该类中,可以看到当前方法的属性,以及当前方法的前一个方法和后一个方法的属性。因此,lint工具正好适用于rxjava的链式调用。可以利用lint工具先查找到rxjava调用中必有的subscribe()方法,再根据subscribe()方法,查找到rxjava调用中的subscribeon()方法和observeon()方法。从而检测subscribeon()方法中的参数是否为子线程参数,以及observeon()方法中的参数是否为主线程参数。

进一步,步骤s503,包括:

步骤a1:所述子工程通过lint工具查找在rxjava中调用的subscribe()方法;

步骤a2:所述子工程基于查找到的subscribe()方法,通过lint工具查找在rxjava中调用的subscribeon()方法和observeon()方法,并通过lint检测subscribeon()方法和observeon()方法中的线程参数的类型。

步骤s504:在subscribeon()方法中的线程参数为主线程参数,或者observeon()方法中的线程参数为子线程参数的情况下,所述子工程发送警告信息。

如果subscribeon()方法中的线程参数不是子线程参数,或者observeon()方法中的线程参数不是主线程参数,则发出警告信息,以通知开发者注意该段代码可能存在问题。

本发明第四实施例,提出了一种线程检测装置,应用于子工程中,如图6所示,所述装置具体包括以下组成部分:

获取模块601,用于获取检测规则;

检测模块602,用于根据所述检测规则查找到rxjava中的待检测逻辑方法,并获取所述待检测逻辑方法中的线程参数类型。

警告模块603,用于在所述待检测逻辑方法中的线程参数类型与所述检测规则中的标准线程参数类型不一致的情况下,所述子工程发送用于指出线程异常的警告信息。

具体的,获取模块601,用于:

获取检测aar文件;从所述检测aar文件中解析出检测jar包;从所述检测jar包中编译出所述检测规则。

优选的,子工程接收由主工程通过预设接口发送来的所述检测aar文件。

进一步的,所述检测规则是根据lint工具生成的。

进一步的,当所述待检测逻辑方法为subscribeon()方法和/或observeon()方法时,检测模块602,具体用于:

所述子工程通过lint工具查找在rxjava中调用的subscribe()方法;所述子工程基于查找到的subscribe()方法,通过lint工具查找在rxjava中调用的subscribeon()方法和/或observeon()方法;所述子工程通过lint工具检测subscribeon()方法和/或observeon()方法中的线程参数类型。

进一步的,所述待检测逻辑方法为subscribeon()方法和/或observeon()方法时,警告模块603,具体用于:

在subscribeon()方法中的线程参数为主线程参数,或者observeon()方法中的线程参数为子线程参数的情况下,所述子工程发送用于指出线程异常的警告信息。

本发明第五实施例,提出了一种线程检测设备,应用于子程序中,如图7所示,所述设备包括:处理器701、存储器702及通信总线;

通信总线用于实现处理器701和存储器702之间的连接通信;

处理器701用于执行存储器702中存储的线程检测程序,以实现以下步骤:

子工程获取检测规则;

所述子工程根据所述检测规则查找到rxjava中的待检测逻辑方法,并获取所述待检测逻辑方法中的线程参数类型;

在所述待检测逻辑方法中的线程参数类型与所述检测规则中的标准线程参数类型不一致的情况下,所述子工程发送用于指出线程异常的警告信息。

本发明的第六实施例,提出了一种计算机可读存储介质,应用于子程序中,所述计算机可读存储介质存储有线程检测程序;

当所述线程检测程序被至少一个处理器执行时,导致所述至少一个处理器执行以下步骤操作:

子工程获取检测规则;

所述子工程根据所述检测规则查找到rxjava中的待检测逻辑方法,并获取所述待检测逻辑方法中的线程参数类型;

在所述待检测逻辑方法中的线程参数类型与所述检测规则中的标准线程参数类型不一致的情况下,所述子工程发送用于指出线程异常的警告信息。

本发明实施例中介绍的线程检测方法、装置、设备及计算机可读存储介质,通过现有的lint线程检测工具,对线程进行检测。并根据rxjava的线程处理特征,设置检测逻辑,从而有效检测线程中的错误。在本发明中,线程的检测逻辑与业务逻辑完全分离,可直接检测任何工程。

通过具体实施方式的说明,应当可对本发明为达成预定目的所采取的技术手段及功效得以更加深入且具体的了解,然而所附图示仅是提供参考与说明之用,并非用来对本发明加以限制。

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