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

生成应用安装包的方法、装置、设备和介质

文献发布时间:2023-06-19 11:08:20


生成应用安装包的方法、装置、设备和介质

技术领域

本公开涉及计算机技术领域,特别涉及一种生成应用安装包的方法、装置、设备和介质。

背景技术

本部分旨在为权利要求书中陈述的本公开的实施方式提供背景或上下文。此处的描述不因为包括在本部分中就承认是现有技术。

点击行为,是用户使用应用程序(Application,APP)最常见的操作之一。例如,在Android系统中,为视图控件View设置点击事件是通过开发源代码实现,即设置好此View被点击时,需要执行的代码逻辑。

当用户由于手抖动误触,导致连续很快地点击View多次,且上一次点击事件还没有执行完毕时,很容易就会发生连续响应多次点击事件的情况。比如从新闻信息流列表,通过点击条目进入到正文页,如果用户很快的点击两下,很容易会发生先打开文章正文页,然后又打开了一个相同的正文页盖在了上面。再比如评论的点赞按钮,如果用户很快的点击两下,很容易会发生先点赞、然后立刻又取消点赞的情况。

目前为了解决上述问题,通常需要业务开发人员在开发应用程序的源代码时,在每个点击事件的方法外写注解,该注解用于标识该点击事件需要防抖动保护,即视图控件被连续很快地点击多次时,不重复响应。这样,增加了业务开发人员的开发工作量。

发明内容

本公开实施例提供一种生成应用安装包的方法、装置、设备和介质,用于识别字节码中为视图控件设置点击事件的目标方法,进而在目标方法中插入防抖动字节码片段,以实现视图控件的防抖动保护,不需要业务开发人员在源代码中添加防抖动保护的注解,减少业务开发人员的开发工作量。

第一方面,本公开提供了一种生成应用安装包的方法,包括:

将应用程序的开发源代码进行编译后,获取所述应用程序的目标字节码;

识别所述目标字节码中目标方法的字节码;其中所述目标方法的字节码用于为视图控件设置点击事件;

在所述目标方法的字节码中,插入防抖动字节码片段;

基于插入防抖动字节码片段后的目标字节码,生成所述应用程序的安装包。

在一种可选的实施方式中,所述识别所述目标字节码中的目标方法的字节码,包括:

遍历所述目标字节码中方法的字节码,确定所述方法的字节码是否包含目标特征信息;

若包含所述目标特征信息,则确定所述方法的字节码是所述目标方法的字节码。

在一种可选的实施方式中,所述目标特征信息包括以下一种或多种:

接口属性中包含第一字节码片段;

方法名称为目标名称;

方法描述包含第二字节码片段;

方法调用方式为目标方式;

方法描述以第三字节码片段结尾;

视图控件的参数位置位于方法描述中的目标位置。

在一种可选的实施方式中,所述在所述目标方法的字节码中,插入防抖动字节码片段,包括:

在所述目标方法的字节码中的第四字节码片段的前面,插入所述防抖动字节码片段;其中所述第四目标字节码片段为开始执行所述目标方法的字节码片段。

在一种可选的实施方式中,所述防抖动字节码片段的逻辑包括:

若目标视图控件被点击,则根据当前时间点之前保存的视图控件与响应视图控件被点击的时间点的对应关系,确定是否存在上一次响应所述目标视图控件被点击的目标时间点;

若存在所述目标时间点,且所述当前时间点与所述目标时间点的间隔时长小于设定时长,则拦截所述目标视图控件的点击事件。

在一种可选的实施方式中,所述防抖动字节码片段的逻辑还包括:

若存在所述目标时间点,且所述当前时间点与所述目标时间点的间隔时长大于设定时长,则响应所述目标视图控件的点击事件,并将所述目标视图控件和响应所述目标视图控件被点击的当前时间点的对应关系进行保存;或者

若不存在所述目标时间点,则响应所述视图控件的点击事件,并将所述目标视图控件和响应所述目标视图控件被点击的当前时间点的对应关系进行保存。

在一种可选的实施方式中,所述防抖动字节码片段的逻辑还包括:

若保存的对应关系的数量超过设定数量,则按照预设规则进行清理。

在一种可选的实施方式中,所述方法还包括:

在所述目标字节码中的应用程序初始化字节码片段中设置所述设定时长。

在一种可选的实施方式中,所述目标字节码为以下一种或两种:

由开发源代码编译成的字节码、第三方软件开发工具包SDK的字节码。

在一种可选的实施方式中,所述开发源代码中相应的目标方法的源代码中设置有注解源代码,其中所述注解源代码用于表示不对所述目标方法进行防抖动保护;

所述方法还包括:

若识别的所述目标方法的字节码中包括注解字节码,则不在所述目标方法的字节码中插入所述防抖动字节码片段;其中所述注解字节码由所述注解源代码编译得到。

在一种可选的实施方式中,所述开发源代码设置在不同的代码包内,所述方法还包括:

在目标配置文件中添加目标代码包的配置信息,所述目标代码包的配置信息用于表示对所述目标代码包内的所述目标方法进行防抖动保护。

第二方面,本公开还提供了一种生成应用安装包的装置,包括:

获取模块,用于将应用程序的开发源代码进行编译后,获取所述应用程序的目标字节码;

识别模块,用于识别所述目标字节码中目标方法的字节码;其中所述目标方法的字节码用于为视图控件设置点击事件;

插入模块,用于在所述目标方法的字节码中,插入防抖动字节码片段;

生成模块,用于基于插入防抖动字节码片段后的目标字节码,生成所述应用程序的安装包。

在一种可选的实施方式中,所述识别模块还用于:

遍历所述目标字节码中方法的字节码,确定所述方法的字节码是否包含目标特征信息;

若包含所述目标特征信息,则确定所述方法的字节码是所述目标方法的字节码。

在一种可选的实施方式中,所述目标特征信息包括以下一种或多种:

接口属性中包含第一字节码片段;

方法名称为目标名称;

方法描述包含第二字节码片段;

方法调用方式为目标方式;

方法描述以第三字节码片段结尾;

视图控件的参数位置位于方法描述中的目标位置。

在一种可选的实施方式中,所述插入模块还用于:

在所述目标方法的字节码中的第四字节码片段的前面,插入所述防抖动字节码片段;其中所述第四目标字节码片段为开始执行所述目标方法的字节码片段。

在一种可选的实施方式中,所述防抖动字节码片段的逻辑包括:

若目标视图控件被点击,则根据当前时间点之前保存的视图控件与响应视图控件被点击的时间点的对应关系,确定是否存在上一次响应所述目标视图控件被点击的目标时间点;

若存在所述目标时间点,且所述当前时间点与所述目标时间点的间隔时长小于设定时长,则拦截所述目标视图控件的点击事件。

在一种可选的实施方式中,所述防抖动字节码片段的逻辑还包括:

若存在所述目标时间点,且所述当前时间点与所述目标时间点的间隔时长大于设定时长,则响应所述目标视图控件的点击事件,并将所述目标视图控件和响应所述目标视图控件被点击的当前时间点的对应关系进行保存;或者

若不存在所述目标时间点,则响应所述目标视图控件的点击事件,并将所述目标视图控件和响应所述目标视图控件被点击的当前时间点的对应关系进行保存。

在一种可选的实施方式中,所述防抖动字节码片段的逻辑还包括:

若保存的对应关系的数量超过设定数量,则按照预设规则进行清理。

在一种可选的实施方式中,所述装置还包括设置模块,用于:

在所述目标字节码中的应用程序初始化字节码片段中设置所述设定时长。

在一种可选的实施方式中,所述目标字节码为以下一种或两种:

由开发源代码编译成的字节码、第三方软件开发工具包SDK的字节码。

在一种可选的实施方式中,所述开发源代码中相应的目标方法的源代码中设置有注解源代码,其中所述注解源代码用于表示不对所述目标方法进行防抖动保护;

所述装置还包括禁止插入模块:

若识别的所述目标方法的字节码中包括注解字节码,则不在所述目标方法的字节码中插入所述防抖动字节码片段;其中所述注解字节码由所述注解源代码编译得到。

在一种可选的实施方式中,所述开发源代码设置在不同的代码包内,所述装置还包括配置模块,用于:

在目标配置文件中添加目标代码包的配置信息,所述目标代码包的配置信息用于表示对所述目标代码包内的所述目标方法进行防抖动保护。

第三方面,本公开还提供了一种电子设备,包括存储器和处理器,所述存储器上存储有可在所述处理器上运行的计算机程序,当所述计算机程序被所述处理器执行时,使得所述处理器实现第一方面任一种生成应用安装包的方法的步骤。

第四方面,本公开还提供了一种计算机可读存储介质,所述计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时,实现第一方面任一种生成应用安装包的方法的步骤。

根据本公开实施例提供的方案,在将应用程序的开发源代码进行编译后,可以获取应用程序的目标字节码,然后识别目标字节码中为视图控件设置点击事件的目标方法,进而在目标方法中插入防抖动字节码片段,以实现视图控件的防抖动保护,不需要业务开发人员在源代码中添加防抖动保护的注解,减少业务开发人员的开发工作量。

本公开的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本公开而了解。本公开的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。

附图说明

为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本公开实施例提供的一种生成应用安装包的方法的流程图;

图2为本公开实施例提供的另一种生成应用安装包的方法的流程图;

图3为本公开实施例提供的一种防抖动保护逻辑的流程图;

图4为本公开实施例提供的一种生成应用安装包的装置的示意图;

图5为本公开实施例提供的电子设备的结构示意图。

具体实施方式

为了使本公开的目的、技术方案和优点更加清楚,下面将结合附图对本公开作进一步地详细描述,显然,所描述的实施例仅仅是本公开的一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。

需要说明的是,本公开的说明书和权利要求书中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。

此外,术语“包括”和“具有”以及它们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

为了方便理解,下面对本申请实施例中涉及的部分概念进行解释。

应用程序(Application,APP):是指安装在手机等智能设备上的程序,一般需要与服务端互相配合运行。常见的应用主要分两类。一类是预装的系统应用,比如短信、照片等;还有一类是第三方应用,比如资讯类的网易新闻、社交类的微信等。

视图控件(VIEW):在Android的APP中,所有的用户界面元素都是由View和ViewGroup构成的,View是绘制在屏幕上的用户能与之交互的一个对象,ViewGroup是一个用于存放其他View和ViewGroup的视图容器。本公开实施例将视图控件简称为VIEW。

页面抖动:用户在使用APP时,如果很快地连续点击VIEW,可能会发生响应多次点击事件的情况,效果可能是连续打开多个页面、连续发送多次请求等,这种情况称为页面抖动。

点击事件(CLICKEVENT):在Android中,包含五种给View设置点击事件的方式,本质都是指定View被点击时,需要执行的方法(一段源代码)。其中,动态设置包括四种方式:内部类、实现点击事件接口、Lambda表达式、方法引用。静态设置可以在布局xml(Extensible Markup Language,可扩展标记语言)文件中声明。

SDK:Software Development Kit,软件开发工具包。Android开发中有两种格式:JAR、AAR,可以直接集成到工程中,来源一般是:(1)Android提供的SDK,即每个系统版本对应的源代码,如上述View的具体实现。(2)第三方开发者提供的SDK,即已经包装好的业务实现,可以直接集成到工程中,如第三方推送服务。

打包编译:Android打包编译,是指工程从开发人员书写的代码变成可在手机上运行的APK文件的过程,其中有若干步骤,如把.java文件变成.class文件等。一般通过gradle工具完成。

字节码文件:Android开发中,一般是指.class格式的文件,它由开发人员写的.java.kotlin代码经编译器编译而来。它与平台无关,是为独立于底层主机平台提供的二进制形式的服务。

Gradle Transform:Android提供的打包编译的一个过程,开发者可以自定义,输入是工程和SDK编译后的字节码,开发者可完成自己的逻辑。

ASM:是一个字节码操作框架,可以用来动态生成字节码或者对现有的类进行加强。ASM可以直接生成二进制class字节码,也可以在其被加载前动态改变其行为,如方法执行前后插入代码等等。

ClassVisitor:ASM中支持自定义触发事件的.class字节码访问者,支持自定义注释解析、方法解析等。

MethodVisitor:ASM中支持自定义触发事件的方法访问者,如方法的属性、参数的属性等。

下面对本申请实施例的设计思想进行介绍。

针对页面抖动的问题,目前通常需要业务开发人员在开发应用程序的源代码时,在每个点击事件的方法外写注解,该注解用于标识该点击事件需要防抖动保护,即视图控件被连续很快地点击多次时,只响应第一次,不重复响应。但是这样,增加了业务开发人员的开发工作量。

为了改善上述情况,本申请实施例提供一种生成应用安装包的方法、装置、设备和介质,在将应用程序的开发源代码进行编译后,可以获取应用程序的目标字节码,然后识别目标字节码中为视图控件设置点击事件的目标方法,进而在目标方法的字节码中插入防抖动字节码片段,以实现视图控件的防抖动保护,不需要业务开发人员在源代码中添加防抖动保护的注解,减少业务开发人员的开发工作量。

下面结合附图和具体实施例对本申请的生成应用安装包的方法进行介绍。

参考图1,本申请实施例提供了一种生成应用安装包的方法,可应用于安装有编译环境的编译设备。生成应用安装包的方法可以包括以下步骤:

步骤S101,将应用程序的开发源代码进行编译后,获取应用程序的目标字节码。

其中,开发源代码为业务开发人员在APP开发过程中书写的代码,例如在AndroidAPP开发中,开发源代码可以是.java格式的代码、.kotlin格式的代码等。对于开发完成的源代码,需要进行打包编译,以生成在智能设备上运行的APK文件,在这个过程中,可以将开发源代码通过编译器进行编译,得到字节码,例如.class格式的代码。

上述应用程序的目标字节码可以包括应用程序本身的开发源代码编译后的字节码,还可以包括第三方SDK的字节码,例如第三方推送服务的字节码。还可以同时包括开发源代码编译后的字节码和第三方SDK的字节码。

需要说明的是,上述APP开发可以基于Android系统,也可以基于其他操作系统,本公开实施例对此不作限定。下面实施例以基于Android系统进行APP开发为例进行说明。

步骤S102,识别目标字节码中目标方法的字节码;其中目标方法的字节码用于为视图控件设置点击事件。

该步骤中,可以根据目标方法的字节码的特征信息识别目标方法,例如特征信息可以包括方法描述、方法名称、接口属性信息等等。目标方法可以包括多种设置方式,例如包括如下设置方式:内部类、实现点击事件接口、Lambda表达式、方法引用等,不同设置方式下,目标方法的字节码的特征信息也不同,具体可以根据相应的设置方式确定。

步骤S103,在目标方法的字节码中,插入防抖动字节码片段。

该步骤中,可以在目标方法的字节码中的指定位置插入防抖动字节码片段,例如,可以在目标方法的字节码中的第四字节码片段的前面,插入防抖动字节码片段,其中第四目标字节码片段为开始执行目标方法的字节码片段。

示例性的,在插入防抖动字节码片段前,将目标方法的字节码反编译后,得到的源代码如下:

在插入防抖动字节码片段后,将目标方法的字节码反编译后,得到的源代码如下:

其中,防抖动字节码片段对应的源代码为“if(!ClickGuarder.INSTANCE.watch(view)){”,可以看出,在源代码片段“public void onClick(View view){”之后,开始执行目标方法,因此,该源代码片段编译后的字节码片段可以是上述第四目标字节码片段。

步骤S104,基于插入防抖动字节码片段后的目标字节码,生成应用程序的安装包。

该步骤中,在得到插入防抖动字节码片段后的目标字节码后,可以将目标字节码所在的多个字节码文件整合成一个DEX文件,进而将DEX文件打包生成APK应用安装包。其中,DEX文件是Android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。

示例性的,如图2所示,应用模块中的源码文件包括开发完成的源代码,应用依赖可以是第三方SDK,该第三方SDK中为字节码,将开发完成的源代码进行编译后得到应用本身的字节码,然后可以将应用本身的字节码文件和第三方SDK中的字节码文件整合成DEX文件,进而将DEX文件打包生成APK应用安装包。

本公开实施例中,在将应用程序的开发源代码进行编译后,可以获取应用程序的目标字节码,然后识别目标字节码中为视图控件设置点击事件的目标方法,进而在目标方法的字节码中插入防抖动字节码片段,以实现视图控件的防抖动保护,不需要业务开发人员在源代码中添加防抖动保护的注解,减少业务开发人员的开发工作量,并且业务开发人员也不需要了解防抖动字节码片段的逻辑,使其对防抖动保护无感。

另外,APP开发通常需要引入第三方SDK,如果采用在源代码中添加防抖动保护的注解的方式,则无法给第三方SDK中的点击事件提供防抖动保护,因为第三方SDK中为编译后的字节码,而本公开实施例不仅可以为APP的开发源代码中的点击事件提供防抖动保护,也可以为第三方SDK中的点击事件提供防抖动保护。

在一些实施例中,步骤S102可以通过如下步骤实现:

a、遍历目标字节码中方法的字节码,确定方法的字节码是否包含目标特征信息。

b、若包含目标特征信息,则确定方法的字节码是目标方法的字节码。

本公开实施例中,开发源代码的打包编译可以通过gradle工具完成,在打包编译过程中,将开发源代码通过编译器进行编译后,可以增加Gradle Transform的过程。例如图2中,在编译完成至生成DEX文件的过程中,增加Gradle Transform的过程,进而可以在字节码操作框架ASM中自定义ClassVisitor,通过ClassVisitor遍历目标字节码,在访问到方法的字节码(即visitMethod时机)时,通过判断方法的字节码中是否包含目标特征信息,确定方法是否为目标方法,即为视图控件设置点击事件的方法。其中,目标特征信息可以根据目标方法的设置方式确定。

在一种可选的实施方式中,目标特征信息包括以下一种或多种:

接口属性中包含第一字节码片段;

方法名称为目标名称;

方法描述包含第二字节码片段;

方法调用方式为目标方式;

方法描述以第三字节码片段结尾;

视图控件的参数位置位于方法描述中的目标位置。

示例性的,目标方法可以包括以下四种:第一种,通过内部类设置的目标方法;第二种,通过实现点击事件接口设置的目标方法;第三种,通过Lambda表达式设置的目标方法;第四种,通过方法引用设置的目标方法。下面介绍一下这四种目标方法的目标特征信息。

第一种目标方法和第二种目标方法的目标特征信息相同,可以包括:接口属性中包含“android/view/View$OnClickListener”,即上述第一字节码片段;方法名称为“onClick”,即上述目标名称;方法描述为“(Landroid/view/View;)V”,即上述第二字节码片段。

第三种目标方法和第四种目标方法的目标特征信息相同,包括:方法调用方式为“invokeDynamic”,即上述目标方式;方法名称为“onClick”;方法描述以“)Landroid/view/View$OnClickListener;”结尾,即上述第三字节码片段;在方法描述中会声明它有一个或多个参数,视图控件view的参数位置为声明的参数中的最后一位,即第一个参数的参数位置从0开始,view的参数位置为参数数量减一,例如参数数量为4,view的参数位置为3;若只有一个参数view,那么它的参数位置为0。

相关技术中,采用在源代码中添加防抖动保护的注解的方式,无法为上述第三种目标方法和第四种目标方法提供防抖动保护,因为这两种目标方法不支持添加注解,而本公开实施例可以为上述四种目标方法提供防抖动保护。

进一步地,基于上述实施例的Gradle Transform过程,步骤S103可以通过如下方式实现:在ASM中自定义MethodVisitor,在识别到目标方法时,可以通过MethodVisitor提供的书写字节码的能力,在目标方法的指定位置动态插入防抖动的字节码片段。

示例性的,通过MethodVisitor动态插入防抖动的字节码片段可以通过如下字节码实现:

Label l0=new Label();

mv.visitLabel(l0);

mv.visitFieldInsn(GETSTATIC,"com/netease/parkinson/ClickGuarder",

"INSTANCE","Lcom/netease/parkinson/ClickGuarder;");

mv.visitVarInsn(ALOAD,mParamPosition);

mv.visitMethodInsn(INVOKEVIRTUAL,

"com/netease/parkinson/ClickGuarder","watch","(Ljava/lang/Object;)Z",false);

Label l1=new Label();

mv.visitJumpInsn(IFEQ,l1);

Label l2=new Label();

mv.visitLabel(l2);

mv.visitInsn(RETURN);

mv.visitLabel(l1);

mv.visitFrame(Opcodes.F_SAME,0,null,0,null);

其中,mv为MethodVisitor提供的可以书写字节码的类,mParamPosition为view参数所在的索引。

在一些实施例中,上述防抖动字节码片段的逻辑可以包括如下步骤:

(1)若目标视图控件被点击,则根据当前时间点之前保存的视图控件与响应视图控件被点击的时间点的对应关系,确定是否存在上一次响应目标视图控件被点击的目标时间点。

该步骤中,例如可以缓存一个最大数量为设定数量的View点击被响应的时间戳的Key-Value关系图,Key-Value即视图控件与视图控件被点击的时间点的对应关系,其中,Key可以是视图控件对应的哈希编码,例如可以对视图控件的标识进行哈希运算,得到哈希编码,Value为时间点。

示例性的,当视图控件1被点击时,首先确定该视图控件的哈希编码Key1,然后从缓存的关系图中,查找是否存在Key1,如果存在,则可以确定Key1对应的最近的时间点Value1,即上一次响应视图控件1被点击的目标时间点。

(2)若存在目标时间点,且当前时间点与目标时间点的间隔时长小于设定时长,则拦截目标视图控件的点击事件。

其中,设定时长可以根据需要设定,例如可以为400毫秒,本公开实施例对此不作限定,如果当前时间点与目标时间点的间隔时长小于设定时长,则认为视图控件被误触,强制返回,不响应该视图控件的点击事件。

进一步地,响应目标视图控件的点击事件的情况包括如下两种:

第一种,若当前时间点与目标时间点的间隔时长大于设定时长,则响应目标视图控件的点击事件,并将目标视图控件和响应目标视图控件被点击的当前时间点的对应关系进行保存。

第二种,若不存在目标时间点,则响应目标视图控件的点击事件,并将目标视图控件和响应目标视图控件被点击的当前时间点的对应关系进行保存。

例如,目标视图控件为上述视图控件1,如果缓存的关系图中不存在Key1,则表示不存在上一次响应视图控件1被点击的目标时间点,此时需要响应视图控件1的点击事件,并将视图控件1和视图控件1被点击的当前响应时间点的对应关系进行保存。

在保存上述对应关系时,还可以确定缓存中的对应关系的数量是否超过设定数量,若超过设定数量,则按照预设规则进行清理。

其中,设定数量可以根据需要进行设置,例如可以为10。在清理时,可以将最先保存的几个对应关系删除,例如缓存的最大数量为10,可以将前面5个对应关系删除,删除的数量可以根据需要进行设置,本公开实施例对此不作限定。

在一些实施例中,为了便于设置上述设定时长,可以在目标字节码中的应用程序初始化字节码片段中设置设定时长。

示例性的,在APP初始化时,可以通过如下方法设置设定时长:

ClickGuarder.INSTANCE.setup(400L);

其中,400L指的是设定时长。

下面以图3为例,对防抖动字节码片段的逻辑进行示例性介绍。

参照图3所示,如果目标视图控件被点击,则执行如下步骤:

步骤S301,查询上一次响应目标视图控件被点击的目标时间点;

步骤S302,如果存在目标时间点,则判断当前时间点与目标时间点的间隔时长是否小于设定时长;如果是,则执行步骤S303,否则执行步骤S304-步骤S306;

步骤S303,拦截目标视图控件的点击事件;

步骤S304,响应目标视图控件的点击事件;

步骤S305,记录目标视图控件和本次响应目标视图控件的时间点的对应关系;

步骤S306,判断缓存中的对应关系的数量是否超过设定数量,如果是,则执行步骤S307;

步骤S307,按照预设规则进行清理。

在一些实施例中,一些目标方法可能不需要进行防抖动保护,例如直播场景中,观众对主播连续点赞时,对于点赞控件的连续点击,需要重复响应,此时,可以在开发源代码中相应的目标方法的源代码中设置注解源代码,其中注解源代码用于表示不对目标方法进行防抖动保护。

示例性的,注解源代码可以为“@Parkinson(needGuard=false)”,下面的源代码为设置有注解源代码的目标方法的源代码。

进一步地,若识别的目标方法的字节码中包括注解字节码,则不在目标方法的字节码中插入防抖动字节码片段;其中注解字节码由注解源代码编译得到。

在一种可选的实施方式中,开发源代码设置在不同的代码包内,为了设置插入防抖动字节码片段的范围,可以在目标配置文件中添加目标代码包的配置信息,目标代码包的配置信息用于表示对目标代码包内的目标方法进行防抖动保护。

例如,可以在工程最外层的build.gradle文件的ext部分增加如下配置:

ext{

clickGuarderScope=[‘com.netease.newsreader’,‘com.netease.nr’]

}

其中,‘com.netease.newsreader’,‘com.netease.nr’表示代码包的名称,这些代码包内的目标方法需要进行防抖动保护。

基于相同的发明构思,本公开还提供了一种生成应用安装包的装置,该装置解决问题的原理与上述实施例的方法相似,因此该装置的实施可以参见方法的实施,重复之处不再赘述。参照图4所示,该生成应用安装包的装置包括:

获取模块41,用于将应用程序的开发源代码进行编译后,获取应用程序的目标字节码;

识别模块42,用于识别目标字节码中目标方法的字节码;其中目标方法的字节码用于为视图控件设置点击事件;

插入模块43,用于在目标方法的字节码中,插入防抖动字节码片段;

生成模块44,用于基于插入防抖动字节码片段后的目标字节码,生成应用程序的安装包。

在一种可选的实施方式中,识别模块42还可以用于:

遍历目标字节码中方法的字节码,确定方法的字节码是否包含目标特征信息;

若包含目标特征信息,则确定方法的字节码是目标方法的字节码。

在一种可选的实施方式中,目标特征信息可以包括以下一种或多种:

接口属性中包含第一字节码片段;

方法名称为目标名称;

方法描述包含第二字节码片段;

方法调用方式为目标方式;

方法描述以第三字节码片段结尾;

视图控件的参数位置位于方法描述中的目标位置。

在一种可选的实施方式中,插入模块43还可以用于:

在目标方法的字节码中的第四字节码片段的前面,插入防抖动字节码片段;其中第四目标字节码片段为开始执行目标方法的字节码片段。

在一种可选的实施方式中,防抖动字节码片段的逻辑可以包括:

若目标视图控件被点击,则根据当前时间点之前保存的视图控件与响应视图控件被点击的时间点的对应关系,确定是否存在上一次响应目标视图控件被点击的目标时间点;

若存在目标时间点,且当前时间点与目标时间点的间隔时长小于设定时长,则拦截目标视图控件的点击事件。

在一种可选的实施方式中,防抖动字节码片段的逻辑还可以包括:

若存在目标时间点,且当前时间点与目标时间点的间隔时长大于设定时长,则响应目标视图控件的点击事件,并将目标视图控件和响应目标视图控件被点击的当前时间点的对应关系进行保存;或者

若不存在目标时间点,则响应目标视图控件的点击事件,并将目标视图控件和响应目标视图控件被点击的当前时间点的对应关系进行保存。

在一种可选的实施方式中,防抖动字节码片段的逻辑还可以包括:

若保存的对应关系的数量超过设定数量,则按照预设规则进行清理。

在一种可选的实施方式中,装置还可以包括设置模块,用于:

在目标字节码中的应用程序初始化字节码片段中设置设定时长。

在一种可选的实施方式中,目标字节码可以为以下一种或两种:

由开发源代码编译成的字节码、第三方软件开发工具包SDK的字节码。

在一种可选的实施方式中,开发源代码中相应的目标方法的源代码中设置有注解源代码,其中注解源代码用于表示不对目标方法进行防抖动保护;

装置还可以包括禁止插入模块:

若识别的目标方法的字节码中包括注解字节码,则不在目标方法的字节码中插入防抖动字节码片段;其中注解字节码由注解源代码编译得到。

在一种可选的实施方式中,开发源代码设置在不同的代码包内,装置还可以包括配置模块,用于:

在目标配置文件中添加目标代码包的配置信息,目标代码包的配置信息用于表示对目标代码包内的目标方法进行防抖动保护。

基于相同的发明构思,本申请实施例还提供了一种电子设备,该电子设备解决问题的原理与上述实施例的方法相似,因此该电子设备的实施可以参见方法的实施,重复之处不再赘述。图5示出了本申请实施例提供的一种电子设备的结构示意图。

参阅图5所示,电子设备可以包括处理器502和存储器501。存储器501向处理器502提供存储器501中存储的程序指令和数据。在本申请实施例中,存储器501可以用于存储本申请实施例中生成应用安装包的程序。

处理器502通过调用存储器501存储的程序指令,处理器502用于执行上述任意方法实施例中的生成应用安装包的方法,例如图1所示的实施例提供的一种生成应用安装包的方法。

本申请实施例中不限定上述存储器501和处理器502之间的具体连接介质。本申请实施例在图5中以存储器501和处理器502之间通过总线503连接,总线503在图5中以粗线表示,其它部件之间的连接方式,仅是进行示意性说明,并不引以为限。总线503可以分为地址总线、数据总线、控制总线等。为便于表示,图5中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。

存储器可以包括只读存储器(Read-Only Memory,ROM)和随机存取存储器(RandomAccess Memory,RAM),还可以包括非易失性存储器(Non-Volatile Memory,NVM),例如至少一个磁盘存储器。可选地,存储器还可以是至少一个位于远离前述处理器的存储装置。

上述处理器可以是通用处理器,包括中央处理器、网络处理器(NetworkProcessor,NP)等;还可以是数字指令处理器(Digital Signal Processing,DSP)、专用集成电路、现场可编程门陈列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。

本申请实施例还提供了一种计算机存储介质,该计算机可读存储介质内存储有计算机程序,计算机设备的处理器从计算机可读存储介质读取该计算机程序,处理器执行该计算机程序,使得该计算机设备执行上述任意方法实施例中的生成应用安装包的方法。

在具体的实施过程中,计算机存储介质可以包括:通用串行总线闪存盘(USB,Universal Serial Bus Flash Drive)、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的存储介质。

在一些可能的实施方式中,本申请提供的生成应用安装包的方法的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当所述程序产品在计算机设备上运行时,所述程序代码用于使所述计算机设备执行本说明书上述描述的根据本申请各种示例性实施方式的生成应用安装包的步骤,例如,所述计算机设备可以执行如图1所示的步骤S101-步骤S104中的生成应用安装包的流程。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

相关技术
  • 应用程序运行方法、安装包生成方法、装置、设备及介质
  • 应用程序安装包的生成方法、装置、电子设备及存储介质
技术分类

06120112811359