掌桥专利:专业的专利平台
掌桥专利
首页

技术领域

本申请实施例涉及应用程序的编译技术领域,具体而言,本申请实施例涉及事件注册方法、应用程序的编译方法、装置、电子设备及存储介质。

背景技术

目前应用程序的编译中,基于事件通信框架,均需要在接受事件通知的对象中手动注册用来订阅事件,以及手动反注册(也就是注销)用来取消订阅事件。而事件的注册和反注册行为是成双成对存在,缺一不可,否则会出现以下问题:(1)没有注册事件:由于没有订阅,因此会导致收取不到事件通知;(2)没有反注册事件:虽然可以收到到事件通知,但是因为没有注销会造成这个对象会一直存在内存,无法进行回收,从而造成内存泄漏并由此引起崩溃。但是,目前都是由研发人员自我进行人工确认,来保障避免以上两个问题,而人工往往总是存在疏忽从而导致上述问题的产生。一旦人工确认出现纰漏,在该应用程序的使用中则会出现上述两个问题,对应用程序的使用带来使用风险。

发明内容

为了能够解决事件订阅和事件注销的人工操作中,因人工确认出现纰漏,所可能造成的存在收取不到事件通知,和/或内存泄漏并由此引起崩溃的问题,本申请提供事件注册、应用程序的编译方法、装置、电子设备及存储介质。

第一方面,本申请实施例提供了一种事件注册方法,该方法包括以下步骤:

获取源代码文件,查找所述源代码文件所属的类型;

根据所述类型,确认注册和反注册的方法;

调用运行态SDK将所述注册和反注册的方法注入对应的事件注册代码和反注册代码,打包成可执行文件。

在第一方面的可选实施例中,所述查找所述源代码文件所属的类型的步骤,包括:

根据所述源代码文件的注解确认各个所述源代码所属的类型;

根据所述源代码文件的类型,筛选出事件通信的目标类文件;

依据预设的类型确定所述目标类文件的类型。

在第一方面的可选实施例中,所述依据预设的类型确定所述目标类文件的类型的步骤,包括:

利用gradle编译插件对所述目标类文件进行解析;

根据解析的结果确定所述目标类文件的类型。

在第一方面的可选实施例中,所述调用运行态SDK将所述注册和反注册的方法注入对应的事件注册方法和反注册代码的步骤之前,包括:

对所述源代码文件进行扫描,对所述源代码文件中的注册事件和反注册事件进行监听。

在第一方面的可选实施例中,所述对所述源代码文件中的注册事件和反注册事件进行监听的步骤,包括:

根据所述类型所对应的注册事件和反注册事件的代码,对所述源代码文件进行监听;

根据监听的结果,得到所述源代码文件是否包含所述类型对应的目标类文件。

在第一方面的可选实施例中,所述类型包括activity、fragment、view以及EventCompat中至少一种。

在第一方面的可选实施例中,所述调用运行态SDK将所述注册和反注册的方法注入对应的事件注册代码和反注册代码的步骤,包括:

从所述运行态SDK中调用对应的接口,利用所述接口调用注册和反注册的方法,并将其注入至所述事件注册代码和反注册代码;

其中,所述运行态SDK包含所述接口。

第二方面,本申请实施例还提供一种应用程序的编译方法,其包括第一方面任意一项所述的事件注册方法。

第三方面,本申请实施例还提供一种事件注册装置,其包括:

类型查找模块,用于获取源代码文件,查找所述源代码文件所属的类型;

方法确认模块,用于根据所述类型,确认注册和反注册的方法;

方法注入模块,用于调用运行态SDK将所述注册和反注册的方法注入对应的事件注册代码和反注册代码,打包成可执行文件。

第四方面,本申请实施例还一种应用程序的编译设备,其包括第三方面所述的事件注册装置。

第五方面,提供了一种电子设备,该电子设备包括:

一个或多个处理器;

存储器;

一个或多个应用程序,其中一个或多个应用程序被存储在存储器中并被配置为由一个或多个处理器执行,一个或多个程序配置用于:执行实现本申请实施例的第一方面所提供的事件注册方法,和/或第二方面所提供的应用程序的编译方法。

第六方面,提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,该程序被处理器执行时实现本申请实施例第一方面所提供的事件注册方法,和/或第二方面所提供的应用程序的编译方法。

本申请实施例提供的技术方案带来的有益效果是:

本申请中所提供的事件注册方案,能够根据所获取的源代码文件,查找所涉及的类型,并确认对应的注册和反注册的方法,并调用运行态SDK将对应的注册和反注册的方法注入指对应的事件注册代码和反注册代码,形成一个可执行文件。基于该方案,在编译的过程中,只需根据源代码文件所确定的类型,从运行态SDK中调用对应的注册和反注册方法,并注入指该类型的事件注册代码和反注册代码,即可自动实现注册和反注册的功能设置,无需研发人员手动完成,从而提高了编译中的事件注册的设置效率,并且保证了注册和反注册设置的完整性,避免内存泄漏。而且,研发人员基于该方案,无需再花时间浪费进行对注册和反注册设置进行人工确认,只需关系事件接收后的业务逻辑,有助于提高研发的效率。

另外,本申请还提供了应用程序的编译方案,包括了上述所有实施例所提供的事件注册方案。基于应用程序的编译方案,可自动实现注册和反注册的功能设置,无需研发人员手动完成,从而提高了编译中的事件注册的设置效率,并且保证了注册和反注册设置的完整性,避免内存泄漏。而且,研发人员基于该方案,无需再花时间浪费进行对注册和反注册设置进行人工确认,只需关系事件接收后的业务逻辑,有助于提高研发的效率。

本申请实施例附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本申请实施例的实践了解到。

附图说明

本申请实施例上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:

图1为本申请的一个实施例所提供的事件注册方法的流程示意图;

图2为本申请的一个实施例所提供的步骤S110的详细示意图;

图3为本申请的一实施例所提供的事件注册方法的执行架构图;

图4为本申请公开的实施例所提供的事件注册装置的结构示意图;

图5为本申请公开的实施例所提供的应用程序的编译设备的结构示意图;

图6为本申请一个实施例所提供的一种事件注册和/或应用程序的编译的电子设备的结构示意图。

具体实施方式

下面详细描述本申请的实施例,实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本申请,而不能解释为对本发明的限制。

本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本申请的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。

为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。

安卓应用程序的开发中会需要在事件通信框架进行编译。目前主流的事件通信框架如EventBus。

对于如EventBus的事件通信框架下进行应用程序的开发中,在通过注册和反注册的方式来订阅事件和取消订阅事件的过程中,对于接收事件通知的对象需要手动操作。

如在以下的注册事件和反注册事件后注入对应的事件通知的对象。

注册事件:EventBus.getDefault().register(this)

反注册事件:EventBus.getDefault().unRegister(this)

在应用程序的编译中,上述对于事件的注册和反注册的行为是成双成对的,缺一不可的,否则会出现如下问题:

若没有注册事件时,由于不存在订阅的事件通知的对象,导致无法收取事件通知;

若没有反注册事件:即使能够收到事件通知,但是因没有注销会造成对应对象的数据存在内存中,且无法回收,从而造成存在泄漏并因此引起崩毁。

而目前利用人工对订阅事件和注销事件的对象进行注册和反注册的操作方式,难以避免上述两个问题的产生。

为了克服上述因人工进行对订阅事件和注销事件的对象进行注册和反注册的操作方式所造成的无法收取事件通知和存在泄漏的风险的问题,本申请提供了一种事件注册方法。参照图1,图1为本申请的一个实施例所提供的事件注册方法的流程示意图。

参考图1,该事件注册方法包括以下步骤:

S110、获取源代码文件,查找所述源代码文件所属的类型。

对于应用程序的编译过程,获取该应用程序的源代码文件,根据代码的编译方式和编译规则,确定该源代码文件所述的类型。

该类型指的是在编译过程中满足不同编译设计功能的代码类型。而其中,该类型可以包括Activity、Fragment、View以及EventCompat其中一种。

该Activity是一个Android的应用组件,它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的窗口,窗口可以充满屏幕,也可以小于屏幕并浮动在其他窗口之上。

该Fragment,为碎片、片段的类型,其目的是为了解决不同屏幕分辨率的动态和灵活UI设计。如平板的大屏幕以及如手机的小屏幕,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,此时利用fragments的类型的代码,可以来实现在不同尺寸屏幕中创建动态灵活的UI设计、在不同社保上统一UI、解决Activity间的切换不流畅,轻量切换。

该View,是Android中所有控件的基类。View是一种界面层的控件的一种抽象,它代表了一个控件,除了View还有ViewGroup,从名字来看ViewGroup可以翻译为控件组,即一组View;在Android中,ViewGroup也继承了View,这就意味着View可以是单个控件,也可以是由多个控件组成的一组控件。

该EventCompat是兼容包的一个类,兼容包是为了让老版本的手机能运行对应于新版本SDK开发的程序,而开发出来的软件包。

S120、根据所述类型,确认注册和反注册的方法。

对于编译语言而言,每个类型的代码可以形成对应的代码文件。而该类型则有各自的注册和反注册的方法,即对应的方法代码。根据上述步骤S110所确定的类型,确认各自的注册和反注册的方法。该反注册即为注销。

S130、调用运行态SDK将所述注册和反注册的方法注入对应的事件注册代码和反注册代码,打包成可执行文件。

在运行态SDK预先存储各个类型所对应的注册方法和反注册方法的代码。从源代码文件中得到事件注册代码和反注册代码,根据对应的类型,从运行态SDK中调用对应的注册方法和反注册方法的代码,并注入对应的事件注册代码和反注册代码。完成后,打包成可执行文件。当用户使用该应用程序时,当检测到用户对应的注册或反注册指令,根据该可执行文件的设置,将解析所得到的操作请求与可执行文件中的事件注册代码或反注册代码的执行条件匹配,当匹配成功时,根据该事件的执行代码文件所属的类型,调用注册方法或反注册方法的代码,并执行。

本申请中所提供的事件注册方案,能够根据所获取的源代码文件,查找所涉及的类型,并确认对应的注册和反注册的方法,并调用运行态SDK将对应的注册和反注册的方法注入指对应的事件注册代码和反注册代码,形成一个可执行文件。基于该方案,在编译的过程中,只需根据源代码文件所确定的类型,从运行态SDK中调用对应的注册和反注册方法,并注入指该类型的事件注册代码和反注册代码,即可自动实现注册和反注册的功能设置,无需研发人员手动完成,从而提高了编译中的事件注册的设置效率,并且保证了注册和反注册设置的完整性,避免内存泄漏。另外,研发人员基于该方案,无需再花时间浪费进行对注册和反注册设置进行人工确认,只需关系事件接收后的业务逻辑,有助于提高研发的效率。

参照图2,图2为本申请的一个实施例所提供的步骤S110的详细示意图。

基于上述的实施例,对于上述的步骤S110中的查找所述源代码文件所属的类型的步骤,包括:

S111、根据所述源代码文件的注解确认各个所述源代码所属的类型;

S112、根据所述源代码文件的类型,筛选出事件通信的目标类文件;

S113、依据预设的类型确定所述目标类文件的类型。

在上述步骤S111至S113中,获取源代码文件,得到源代码对应的注解。在本实施例中,在编程过程中可能涉及的代码注解预存于运行态SDK中,获取源代码文件后,对源代码进行逐条扫描后并匹配后,将对应的注解添加至对应的源代码,形成绑定在处理接收事件的逻辑方法。

对应目标类文件的注解进行分类并存储,根据该源代码的注解确定其所添加的源代码所属的类型。在各源代码所属的类型筛选出事件通信的类型,并将该事件通信的类型的源代码文件作为目标类文件。根据预设的事件通信的类型,确定各个目标类文件的类型。

在本实施例中,根据该注解能够明确得到源代码文件所对应的类型,并以此作为注入注册方法和反注册方法的依据,从而实现自动实现注册和反注册的功能设置。

对于上述步骤S113可以进一步包括:

利用gradle编译插件对所述目标类文件的内容进行解析;根据解析的结果确定所述目标类文件的类型。

在本实施中,利用gradle编译插件对目标类文件进行一一解析,根据解析的结果得到每个目标类文件的类型,从而确认各个目标类文件是属于哪个类型。

在上述实施例中所提到的类型,包括Activity、Fragment、View以及EventCompat属于事件通信的类型。因此,若源代码文件属于上述的类型,则该源代码文件为目标文件。

参照图3,图3为本申请的一实施例所提供的事件注册方法的执行架构图。

基于确定类型的目标类文件,上述步骤S130中的调用运行态SDK将所述注册和反注册的方法注入对应的事件注册方法和反注册代码的步骤之前,包括:

对所述源代码文件进行扫描,对所述源代码文件中的注册事件和反注册事件进行监听。

在编译的过程中,通过编写一个Transform Task来接收这些输入编译所产生的源代码文件。在本实施例中通过gradle编译插件来注册所编写的Transform Task。注册后的Transform Task会被gradle包装成一个Gradle Task,而这个TransFormTask会在javacompile Task执行完毕后运行。

在编写了Transform Task后的对项目内所有源代码文件进行扫描,基于各个目标类文件的特定执行方法,对各个源代码文件中的注册事件和反注册事件进行监听,以便获取对应的事件注册代码和反注册代码。

对于关于对所述源代码文件中的注册事件和反注册事件进行监听的步骤,可进一步包括:

根据所述类型所对应的注册事件和反注册事件的代码,对所述源代码文件进行监听;

根据监听的结果,得到所述源代码文件是否包含所述类型对应的目标类文件。

参考图3,每个类型有特定的注册事件和反注册事件的代码。例如:对于类型Fragment,对应OnViewCreated/OnDestroyView的方法代码;对于类型EventCompat子类,对应OnEventBind/OnEventUnBind的方法代码;对于类型View,对应OnAttachedToWindow/OnDetachedFromWindow的方法代码;对于类型Activity,对应OnCreated/OnDestroy的方法代码。

根据上述各个类型特定的注册事件和反注册事件的方法代码,对源代码文件进行监听,所得到与上述方法代码匹配的源代码文件,得到各个类型的目标类文件。

若监听不到对应的目标类文件,则直接结束对该类型的目标类文件的监听操作。

基于上述的实施例,对上述步骤S130中的调用运行态SDK将所述注册和反注册的方法注入对应的事件注册代码和反注册代码的步骤,可以进一步包括:

从所述运行态SDK中调用对应的接口,利用所述接口调用注册和反注册的方法,并将其注入至所述事件注册代码和反注册代码。

在本实施例中,运行态SDK包含接口。该接口用于调用预存于运行态SDK内的不同类型的目标文件的注册和反注册的方法。

在本实施例中,从该运行态SDK调用该接口,并利用该接口从该运行态SDK中调用对应类型的目标类文件的注册和反注册的方法,并将该注册和反注册的方法注入至该类型的目标类文件中的事件注册代码和反注册代码。然后将完成注入的目标类文件重新打包成可执行文件。

另外,本申请还提供了应用程序的编译方案,包括了上述所有实施例所提供的事件注册方案。基于应用程序的编译方案,可自动实现注册和反注册的功能设置,无需研发人员手动完成,从而提高了编译中的事件注册的设置效率,并且保证了注册和反注册设置的完整性,避免内存泄漏。另外,研发人员基于该方案,无需再花时间浪费进行对注册和反注册设置进行人工确认,只需关系事件接收后的业务逻辑,有助于提高研发的效率。

基于与事件注册方法相同的申请构思,本申请实施例还提供了一种事件注册装置。

参考图4,图4为本申请公开的实施例所提供的事件注册装置的结构示意图。该事件注册装置300,包括:

类型查找模块310,用于获取源代码文件,查找所述源代码文件所属的类型;

方法确认模块320,用于根据所述类型,确认注册和反注册的方法;

方法注入模块330,用于调用运行态SDK将所述注册和反注册的方法注入对应的事件注册代码和反注册代码,打包成可执行文件。

本申请实施例所提供的事件注册装置300,能够根据所获取的源代码文件,查找所涉及的类型,并确认对应的注册和反注册的方法,并调用运行态SDK将对应的注册和反注册的方法注入指对应的事件注册代码和反注册代码,形成一个可执行文件。基于该方案,在编译的过程中,只需根据源代码文件所确定的类型,从运行态SDK中调用对应的注册和反注册方法,并注入指该类型的事件注册代码和反注册代码,即可自动实现注册和反注册的功能设置,无需研发人员手动完成,从而提高了编译中的事件注册的设置效率,并且保证了注册和反注册设置的完整性,避免内存泄漏。另外,研发人员基于该方案,无需再花时间浪费进行对注册和反注册设置进行人工确认,只需关系事件接收后的业务逻辑,有助于提高研发的效率。

参考图5,图5为本申请公开的实施例所提供的应用程序的编译设备的结构示意图。

另外,本申请还提供一种应用程序的编译设备400,其包括上述的事件注册装置300。

本申请所提供了应用程序的编译方案,包括了上述所有实施例所提供的事件注册方案。基于应用程序的编译方案,可自动实现注册和反注册的功能设置,无需研发人员手动完成,从而提高了编译中的事件注册的设置效率,并且保证了注册和反注册设置的完整性,避免内存泄漏。另外,研发人员基于该方案,无需再花时间浪费进行对注册和反注册设置进行人工确认,只需关系事件接收后的业务逻辑,有助于提高研发的效率。

基于与本申请实施例中所示的方法相同的原理,本申请实施例中还提供了一种电子设备,该电子设备可以包括但不限于:处理器和存储器;存储器,用于存储计算机操作指令;处理器,用于通过调用计算机操作指令执行实施例所示的方法。与现有技术相比,本申请实施例中的电子设备能够根据所获取的源代码文件,查找所涉及的类型,并确认对应的注册和反注册的方法,并调用运行态SDK将对应的注册和反注册的方法注入指对应的事件注册代码和反注册代码,形成一个可执行文件。基于该方案,在编译的过程中,只需根据源代码文件所确定的类型,从运行态SDK中调用对应的注册和反注册方法,并注入指该类型的事件注册代码和反注册代码,即可自动实现注册和反注册的功能设置,无需研发人员手动完成,从而提高了编译中的事件注册的设置效率,并且保证了注册和反注册设置的完整性,避免内存泄漏。而且,研发人员基于该方案,无需再花时间浪费进行对注册和反注册设置进行人工确认,只需关系事件接收后的业务逻辑,有助于提高研发的效率。

另外,本申请实施例中的电子设备,能够执行包括上述所有实施例所提供的事件注册方案。基于应用程序的编译方案,可自动实现注册和反注册的功能设置,无需研发人员手动完成,从而提高了编译中的事件注册的设置效率,并且保证了注册和反注册设置的完整性,避免内存泄漏。而且,研发人员基于该方案,无需再花时间浪费进行对注册和反注册设置进行人工确认,只需关系事件接收后的业务逻辑,有助于提高研发的效率。

参照图6,图6为本申请一个实施例所提供的一种事件注册和/或应用程序的编译的电子设备的结构示意图。

在一个可选实施例中提供了一种电子设备,如图6所示,图6所示的电子设备500包括:处理器501和存储器503。其中,处理器501和存储器503相连,如通过总线502相连。可选地,电子设备500还可以包括收发器504。需要说明的是,实际应用中收发器504不限于一个,该电子设备500的结构并不构成对本申请实施例的限定。

其中,电子设备包括但不限于:移动电话、笔记本电脑、数字广播接收器、PDA(个人数字助理)、PAD(平板电脑)、PMP(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字TV、台式计算机等等的固定终端。图6示出的电子设备仅仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。

本申请实施例提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,当其在计算机上运行时,使得计算机可以执行前述方法实施例中相应内容。与现有技术相比,本申请实施例中的计算机可读存储介质能够根据所获取的源代码文件,查找所涉及的类型,并确认对应的注册和反注册的方法,并调用运行态SDK将对应的注册和反注册的方法注入指对应的事件注册代码和反注册代码,形成一个可执行文件。基于该方案,在编译的过程中,只需根据源代码文件所确定的类型,从运行态SDK中调用对应的注册和反注册方法,并注入指该类型的事件注册代码和反注册代码,即可自动实现注册和反注册的功能设置,无需研发人员手动完成,从而提高了编译中的事件注册的设置效率,并且保证了注册和反注册设置的完整性,避免内存泄漏。而且,研发人员基于该方案,无需再花时间浪费进行对注册和反注册设置进行人工确认,只需关系事件接收后的业务逻辑,有助于提高研发的效率。

另外,本申请实施例中的电子设备,能够执行包括上述所有实施例所提供的事件注册方案。基于应用程序的编译方案,可自动实现注册和反注册的功能设置,无需研发人员手动完成,从而提高了编译中的事件注册的设置效率,并且保证了注册和反注册设置的完整性,避免内存泄漏。而且,研发人员基于该方案,无需再花时间浪费进行对注册和反注册设置进行人工确认,只需关系事件接收后的业务逻辑,有助于提高研发的效率。

上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。

上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备执行上述实施例所示的方法。

应该理解的是,虽然附图的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,其可以以其他的顺序执行。而且,附图的流程图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,其执行顺序也不必然是依次进行,而是可以与其他步骤或者其他步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。

以上描述仅为本申请的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本申请中所涉及的公开范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述公开构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本申请中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。

相关技术
  • 事件注册方法、应用程序的编译方法、装置、电子设备
  • 应用程序预编译的方法、装置以及电子设备
技术分类

06120113023402