控件注入方法、装置及终端设备与流程

文档序号:22427873发布日期:2020-10-02 10:04阅读:120来源:国知局
控件注入方法、装置及终端设备与流程

本申请涉及计算机技术领域,尤其涉及一种控件注入方法、装置及终端设备。



背景技术:

在android开发中,是采用资源id,即资源索引值的方式获取到界面上控件子控件,从而实现控件注入的。而在常规编码中,android工具aapt会为开发者将资源索引值保存在r类中供开发者编码时使用。其中,r类是指在android系统中,管理应用程序资源索引的一个类,该类的名字为r。

sdk的程序代码通常可以通过使用sdk包名下的r类来获取应用程序资源的索引值,从而根据该索引值进行控件的注入。但是在为接入了sdk的游戏包注入控件的融合场景中,由于融合时资源索引值会进行重构,而资源索引值每次重新构建时产生的可能不一致,导致应用程序调用sdk接口时,sdk无法找到对应的r类中的资源索引值,因而无法正常访问sdk的资源。

为解决上述问题,在为接入了sdk的游戏包注入控件的融合场景中,将通过r类获取的资源索引值来实现控件注入的方式,改为通过调用系统接口getidentifier获取的资源索引值来实现控件注入。然而,由于传入getidentifier的资源名是自定义的字符串常量,使得该资源名的准确性无法被验证,导致当该资源名出错时,无法准确查找控件,进而在游戏sdk包的融合场景中无法实现控件的注入。



技术实现要素:

本申请实施例所要解决的技术问题在于,解决通过调用系统接口getidentifier获取的资源索引值来实现控件注入时,易造成无法准确查找控件的问题。

为解决上述问题,本申请实施例提供一种控件注入方法,适于在计算装置中执行,至少包括如下步骤:

在接入代码段的sdk程序中,获取r类;其中,所述代码段用于改变所述sdk程序获取资源索引值的方式,所述资源索引值用于指引所述sdk程序获取对应的资源;

根据所述代码段中的插件,对所述r类进行扫描截取,生成基于字符串的sqr类;

将sqr类作为资源名向所述第一预设接口传递,以使所述第一预设接口根据所述资源名从所述sdk程序中获取所述资源索引值;

将获取到的所述资源索引值通过所述第二预设接口获取对应的控件。

进一步的,根据所述代码段中的插件,对所述r类中进行扫描截取,生成基于字符串的sqr类,包括:

将所述r类进行字符串过滤,获取过滤后的r类;其中,当过滤后的r类中字符串的关键字与预设的特征字具有相同特征时,则完成所述r类的字符串过滤;

对所述过滤后的r类进行正则表达式过滤,生成基于字符串的sqr类。

进一步的,所述相同特征包括所述关键字的哈希值的映射位置为所述特征字的哈希值的映射位置的子集。

进一步的,将sqr类作为资源名向所述第一预设接口传递,包括:

将所述sqr类作为第一注解参数进行扫描;

根据所述第一注解参数的扫描结果,接入所述第一预设接口,并将所述第一注解参数作为资源名向所述第一预设接口传递。

进一步的,将sqr类作为资源名向所述第一预设接口传递,包括:

将所述sqr类作为注解参数集中的任一第二注解参数,扫描所述注解参数集;其中,所述注解参数集包括由sqr类生成的至少一个第二注解参数,以及由自定义的字符串常量生成的至少一个第二注解参数;

检测扫描到的注解参数集在r类中是否有对应属性存在;其中,当未检测到所述注解参数集均在r类中有对应属性存在时,抛出异常,否则,将所述注解参数集作为资源名向所述第一预设接口传递。

进一步的,根据所述第一注解参数的扫描结果,接入所述第一预设接口,包括:

根据所述第一注解参数,将所述sdk程序获取所述资源索引值的初始方式,修改为通过所述第一预设接口获取所述资源索引值;其中,所述初始方式为在对所述sdk原始程序进行编译后所默认采用的获取所述资源索引值的方式。

进一步的,还包括:根据所述第一注解参数的扫描结果接入所述第二预设接口。

进一步的,所述第一预设接口为getidentifier接口,所述第二预设接口为findviewbyid接口。

进一步的,还提供一种控件注入装置,包括:

数据获取模块,用于在接入代码段的sdk程序中,获取r类;其中,所述代码段用于改变所述sdk程序获取资源索引值的方式,所述资源索引值用于指引所述sdk程序获取对应的资源;

数据生成模块,用于根据所述代码段中的插件,对所述r类进行扫描截取,生成基于字符串的sqr类;

数据传递模块,用于将sqr类作为资源名向所述第一预设接口传递,以使所述第一预设接口根据所述资源名从所述sdk程序中获取所述资源索引值;

控件注入模块,用于将获取到的所述资源索引值通过所述第二预设接口获取对应的控件。

进一步的,所述数据生成模块具体用于:

将所述r类进行字符串过滤,获取过滤后的r类;其中,当过滤后的r类中字符串的关键字与预设的特征字具有相同特征时,则完成所述r类的字符串过滤;

对所述过滤后的r类进行正则表达式过滤,生成基于字符串的sqr类;其中,所述相同特征包括所述关键字的哈希值的映射位置为所述特征字的哈希值的映射位置的子集。

进一步的,述数据传递模块具体用于:将所述sqr类作为第一注解参数进行扫描;

根据所述第一注解参数的扫描结果,接入所述第一预设接口,并将所述第一注解参数作为资源名向所述第一预设接口传递。

进一步的,所述数据传递模块还用于:

将所述sqr类作为注解参数集中的任一第二注解参数,扫描所述注解参数集;其中,所述注解参数集包括由sqr类生成的至少一个第二注解参数,以及由自定义的字符串常量生成的至少一个第二注解参数;

检测扫描到的注解参数集在r类中是否有对应属性存在;其中,当未检测到所述注解参数集均在r类中有对应属性存在时,抛出异常,否则,将所述注解参数集作为资源名向所述第一预设接口传递。

进一步的,还提供一种终端设备,包括存储器和处理器,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如上述实施例所述控件注入方法的步骤。

与现有技术相比,本实施例通过对r类进行扫描截取,生成基于字符串的sqr类后,将sqr类作为资源名向第一预设接口传递,以使第一预设接口根据资源名从sdk程序中获取资源索引值,并将获取到的资源索引值通过第二预设接口获取对应的控件的方式,使得getidentifier接口的资源名由扫描r类的字符串后获得的sqr类生成,不存在由于是自定义的字符串常量而导致准确性无法被验证的问题,进而能够准确查找控件,实现控件注入。

附图说明

图1是使用r类获取资源的流程示意图;

图2是现有技术中使用getidentifier接口获取资源的流程示意图;

图3是一实施例提供的控件注入方法的流程示意图;

图4是另一实施例提供的控件注入方法的流程示意图;

图5是又一实施例提供的控件注入方法的流程示意图;

图6是一实施例提供的控件注入装置的结构示意图;

图7是一个实施例提供的终端设备的结构示意图。

具体实施方式

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

现有的控件注入方式,通常是直接使用r类来获取资源索引值后,通过资源索引值来获取到对应的控件。但在为接入了sdk的游戏包注入控件的融合场景中,如图1所示,若直接使用r类来实现控件的注入,会由于r类中的值在app模块中是常量,最后游戏方的代码编译出来的字节码文件中,根据java的规则会将常量替换到字节码文件中,即游戏方的代码中会出现如0x7f070001对应id为test的发行方sdk中的控件,在游戏方交付的游戏母包中r$id类会存在属性test对应常量0x7f070001,而发行方融合的资源中存在同样名称为test的属性。但由于r类重新生成值会改变,假如发行方中用于融合切包的资源中test对应值为0x7f070002,此时由于使用反编译后会生成public.xml会固定住游戏方id的值,回编译后资源对应的索引值不会改变,最终代码融合后用值0x7f070002会找不到资源,导致无法实现控件的注入。

为解决上述问题,现有游戏包融合场景的控件注入中,均通过调用getidentifier接口获取资源索引值来实现控件注入,如图2所示。但由于传入getidentifier的资源名是自定义的字符串常量,在编译过程中不会去检查资源名对应的资源是否在应用中存在,使得该资源名的准确性无法被验证,导致当该资源名出错时,无法准确查找控件,进而导致无法注入控件。

为解决上述问题,在一实施例中,提供了一种控件注入方法。本实施例以该方法通过计算机设备执行来举例说明。如图3所示,该控件注入方法包括:

步骤s11,在接入代码段的sdk程序中,获取r类。

其中,代码段用于改变sdk程序获取资源索引值的方式,资源索引值用于指引sdk程序获取对应的资源。

在一实施例中,代码段为sqinject框架,r类是由android的自动打包工具aapt生成,值都为int类型,并且当工程为app类型时为常量有r类,当工程为lib类型时,会生成r.txt,内容是资源名称对应一个int值。

步骤s12,根据代码段中的插件,对r类进行扫描截取,生成基于字符串的sqr类。

具体的,利用sqinject框架中的gradle插件sqrgenerator,通过正则表达式对由aapt生成的r类进行扫描截取,生成基于字符串的sqr类。

步骤s13,将sqr类作为资源名向第一预设接口传递,以使第一预设接口根据资源名从sdk程序中获取资源索引值。

在一实施例中,第一预设接口为getidentifier接口。将sqr类作为资源名替代自定义的字符串常量向getidentifier接口传递,即将sqr.id.test作为资源名向getidentifier接口进行传递,而非使用自定义的“test”作为getidentifier接口接收的资源名,避免了资源名的出错,从而在无法验证资源名的情况下,能够保证资源名的准确性。

步骤s14,将获取到的资源索引值通过第二预设接口获取对应的控件。

在一实施例中,第二预设接口为findviewbyid接口。

本实施例通过正则表达式对r类的字符串进行扫描截取,生成基于字符串的sqr类后,将sqr类作为资源名向第一预设接口传递,以使第一预设接口根据资源名从sdk程序中获取资源索引值,并将获取到的资源索引值通过第二预设接口获取对应的控件的方式,使得getidentifier接口的资源名由通过正则表达式扫描r类的字符串后获得的sqr类生成,使得资源名对应的资源在应用中必然存在,不存在由于是自定义的字符串常量而导致资源名的准确性无法被验证的问题,进而能够准确查找控件,实现控件注入。

在采用正则表达式扫描r类生成对应的资源名时,由于正则表达式的运算复杂度与内容的复杂度成正比,因此当r类中的内容过多时,在生产资源名时的运算复杂度就会相对增加。为解决上述问题,在另一实施例中,提供了一种控件注入方法,如图4所示,包括:

步骤s21,在接入代码段的sdk程序中,获取r类。

其中,代码段用于改变sdk程序获取资源索引值的方式,资源索引值用于指引sdk程序获取对应的资源。

在本实施例中,步骤s21的运行过程与上述实施例中步骤s11类似,在此不多赘述。

步骤s22,将r类进行字符串过滤,获取过滤后的r类后,对所述过滤后的r类通过正则表达式进行扫描截取,生成基于字符串的sqr类。

其中,当过滤后的r类中字符串的关键字与预设的特征字具有相同特征时,则完成r类的字符串过滤。

在一实施例中,先对r类中的字符串进行过滤,再通过正则表达式对这些过滤后的字符串进行扫描截取,每个过滤过程中采用对应的字符串匹配或者正则表达式匹配采用的算法,这样就相当于对r类中的字符串首先进行分组,而每个分组的长度较短,对应的正则表达式较少,相比于将整个r类整体进行正则表达式过滤,可以降低运算复杂度,从而提高资源名的生成速度。

由于正则表达式匹配的效率更高,因此目前通常的输入规则都是正则表达式,为了进行字符串匹配,需要在为正则表达式的输入规则中提取出字符串,利用提取出的字符串进行字符串匹配,其中,提取出的字符串称为特征字。作为本实施例的一个举例,假定r;类中字符串的最大长度为l,则可以将为正则表达式的输入规则中的第一个长度为l的字符串作为特征字,如果输入规则中不能提取出长度为l的字符串,也可以将长度最接近l的字符串作为特征字。

由于通过字符串过滤后的还要进行正则表达式的过滤,而正则表达式过滤已被证明效率及精度都很高,所以之前的字符串过滤是无需十分精确的,且精确的字符串过滤需要占用大量的存储空间及多次的查找。因此,作为上述实施例的改进,在通过正则表达式获取资源名的过程中,为减少在过滤字符串时由于保存关键字造成的存储资源占用,以及减少比较关键字和特征字时的运算量,提高系统的性能,在一实施例中,当过滤后的r类中关键字的哈希值的映射位置为特征字的哈希值的映射位置的子集时,则完成r类的字符串过滤。通过这种方式,使得字符串在过滤时不需要关键字与特征字完全一致,因此不需要保存关键字和进行关键字与特征字的比对,从而节省存储空间,提高性能。

步骤s23,将sqr类作为资源名向第一预设接口传递,以使第一预设接口根据资源名从sdk程序中获取资源索引值。

在本实施例中,步骤s23的运行过程与上述实施例中步骤s13类似,在此不多赘述。

步骤s24,将获取到的资源索引值通过第二预设接口获取对应的控件。

在本实施例中,步骤s24的运行过程与上述实施例中步骤s14类似,在此不多赘述。

在完成资源名传递后,控件注入需要通过调用getidentifier及findviewbyid接口来查找控件。而当需要注入的控件过多时,原sdk程序需要多次调用getidentifier及findviewbyid接口查找控件代码,导致编码过程繁琐。因此,在又一实施例中,提供了一种控件注入方法。如图5所示,包括:

步骤s31,在接入代码段的sdk程序中,获取r类。

其中,代码段用于改变sdk程序获取资源索引值的方式,资源索引值用于指引sdk程序获取对应的资源。

在本实施例中,步骤s31的运行过程与上述实施例中步骤s11或步骤s21类似,在此不多赘述。

步骤s32,根据代码段中的插件,对r类进行扫描截取,生成基于字符串的sqr类。

在本实施例中,步骤s32的运行过程与上述实施例中步骤s12或步骤s22类似,在此不多赘述。

步骤s33,将sqr类作为第一注解参数进行扫描后,根据第一注解参数的扫描结果,接入第一预设接口,并将第一注解参数作为资源名向第一预设接口传递。

在一实施例中,通过java注解处理器,将sqr类作为第一注解参数进行传递,使注解处理器根据第一注解参数生成相应的代码从而接入getidentifier接口,同时,根据第一注解参数的扫描结果接入findviewbyid接口。如通过@bindview注解传递一个注解参数sqr.id.tv,只需要增加一个注解@bindview()及一个注入点sqinject.bind即可,在多控件注入的情况下无需多次编写调用getidentifier及findviewbyid接口的程序代码。而由于sqr类是根据扫描r类或者r.txt文件生成的,因此对应的资源在应用中必然存在。

由于通过注解传递的注解参数除了使用上述sqinject框架生成的sqr类外,还可以传递自定义的常量字符串,如@bindview(“test”)。因此在通过注解传递多个资源名时,可能存在某个资源名的准确性无法被验证的问题。

因此,作为上述实施例的改进,在一实施例中,将sqr类作为注解参数集中的任一第二注解参数,扫描注解参数集。其中,注解参数集包括由sqr类生成的至少一个第二注解参数,以及由自定义的字符串常量生成的至少一个第二注解参数。检测扫描到的注解参数集在r类中是否有对应属性存在,其中,当未检测到注解参数集均在r类中有对应属性存在时,抛出异常,否则,将注解参数集作为资源名向第一预设接口传递,以使第一预设接口根据由各第二注解参数生成的各资源名从sdk程序中获取对应的资源索引值。

在一实施例中,通过java注解处理器正在编译阶段读入注解传递的注解参数集,将注解参数集中各个第二注解参数和相应的r类属性名称做对比。若某一第二注解参数在r类中找不到对应的属性,则判断该第二注解参数出现异常,报出异常信息;若注解参数集中各个第二注解参数在r类中均能找到对应的属性,则将第二注解参数集中的各第二注解参数分别作为资源名向第一预设接口传递。通过上述方式,能够验证自定义的字符串常量的准确性,从而能够准确查到对应控件。除此之外,由于java注解处理器可以用已编译的字节码作为输入,生成新代码文件作为输出,因此采用java注解处理器读取各个注解传递的资源名后,利用注解处理器就能够在编译期生成新代码加入到已生成的代码中,最后打包进应用包体中。

步骤s24,将获取到的资源索引值通过第二预设接口获取对应的控件。

在一实施例中,提供了一种控件注入装置。如图6所示,包括:

数据获取模块101,用于在接入代码段的sdk程序中,获取r类。其中,代码段用于改变sdk程序获取资源索引值的方式,资源索引值用于指引sdk程序获取对应的资源。

数据生成模块102,用于根据代码段中的插件,对r类进行扫描截取,生成基于字符串的sqr类。

数据传递模块103,用于将sqr类作为资源名向第一预设接口传递,以使第一预设接口根据资源名从sdk程序中获取资源索引值。

控件注入模块104,用于将获取到的资源索引值通过第二预设接口获取对应的控件。

其中,第一预设接口为getidentifier接口,第二预设接口为findviewbyid接口。

上述实施例的控件注入装置,通过正则表达式对r类的字符串进行扫描截取,生成基于字符串的sqr类后,将sqr类作为资源名向第一预设接口传递,以使第一预设接口根据资源名从sdk程序中获取资源索引值,并将获取到的资源索引值通过第二预设接口获取对应的控件的方式,使得getidentifier接口的资源名由通过正则表达式扫描r类的字符串后获得的sqr类生成,使得资源名对应的资源在应用中必然存在,不存在由于是自定义的字符串常量而导致资源名的准确性无法被验证的问题,进而能够准确查找控件,实现控件注入。

在一实施例中,数据生成模块102具体用于,将所述r类进行字符串过滤,获取过滤后的r类。其中,当过滤后的r类中字符串的关键字与预设的特征字具有相同特征时,则完成所述r类的字符串过滤。对所述过滤后的r类通过正则表达式进行扫描截取,生成基于字符串的sqr类。其中,所述相同特征包括所述关键字的哈希值的映射位置为所述特征字的哈希值的映射位置的子集。

通过上述实施例,使得字符串在过滤时不需要关键字与特征字完全一致,因此不需要保存关键字和进行关键字与特征字的比对,从而节省存储空间,提高性能。

在一实施例中,数据传递模块103还用于,将sqr类作为第一注解参数进行扫描,根据第一注解参数的扫描结果,接入第一预设接口,并将第一注解参数作为资源名向第一预设接口传递。

通过上述实施例,使得在多控件注入的情况下无需多次编写调用getidentifier及findviewbyid接口的程序代码。而由于sqr类是根据扫描r类或者r.txt文件生成的,因此对应的资源在应用中必然存在。

在一实施例中,数据传递模块103还用于,将sqr类作为注解参数集中的任一第二注解参数,扫描注解参数集;其中,注解参数集包括由sqr类生成的至少一个第二注解参数,以及由自定义的字符串常量生成的至少一个第二注解参数。检测扫描到的注解参数集在r类中是否有对应属性存在,其中,当未检测到注解参数集均在r类中有对应属性存在时,抛出异常,否则,将注解参数集作为资源名向第一预设接口传递。

通过上述实施例,使得在进行多个注解参数的传递时,能够验证自定义的字符串常量的准确性,从而能够准确查到对应控件。

在一实施例中,提供了一种终端设备的结构示意图。如图7所示,该终端设备包括通过系统总线连接的处理器、存储器、输入/输出接口和数据库。其中,该终端设备的处理器用于提供计算和控制能力。该终端设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该终端设备的网络接口用于与外部的数据库连接,以接收数据库中的组件数据。该终端设备在处理器执行时以实现上述实施例所述的控件注入方法。本领域技术人员可以理解,图7中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的终端设备的限定,具体的终端设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

以上所述是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本申请的保护范围。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)或随机存储记忆体(randomaccessmemory,ram)等。

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