本申请涉及代码处理技术领域,特别是涉及一种插件sdk生成方法、装置、计算机设备和存储介质。
背景技术:
sdk(softwaredevelopmentkit,软件开发工具包)是指辅助开发某一特定的app(application,应用软件)时提供的相关文档、范例和开发工具的集合,包括用于调试和其他用途的实用工具。它可以简单的为某个程序设计语言提供应用程序接口api(applicationprogramminginterface,应用程序接口)的一些文件,也可能包括能与某种嵌入式系统通讯的复杂的硬件,还可能包括示例代码、支持性的技术注解或者其他的为基本参考资料澄清疑点的支持文档。
游戏app发行中,涉及到研发sdk代码、发行方sdk代码以及渠道方sdk代码这三方代码的结合。因此实现插件化时需要考虑当多方方案冲突时的回退方案。比如渠道方sdk使用了插件化技术,发行方在提供游戏app代码时也使用了插件化技术,则技术实现上存在冲突,需要发行方将插件sdk回退为非插件的方式。反之,发行方对外提供插件sdk。在此情况下,发行方实现一套插件版本和一套非插件版本的sdk在后续维护上,成本将会很高。同时需要提供一套插件版本的sdk和一套非插件版本的sdk,以便于匹配两种方案。因此研发需要生成两套sdk代码,不仅造成资源浪费并且需要耗费的人工量大。
技术实现要素:
基于此,有必要针对上述技术问题,提供一种能够减少sdk代码的生成量以降低资源浪费并减少人工维护游戏app代码的维护成本的插件sdk生成方法、装置、计算机设备和存储介质。
一种插件sdk生成方法,该方法包括:获取非插件版的sdk代码;查询非插件版的sdk代码中系统类的第一代码以及第一对外接口类的第一名称;将第一代码转换为非组件基类的第二代码,将第一名称转换为预设的第二名称,以使得名称转换后第一对外接口类的名称和宿主中与第一对外接口类对应的第二对外接口类的名称不同,得到待转换代码;根据待转换代码生成插件版的插件sdk,插件sdk通过宿主的第二对外接口类对外通信。
在其中一个实施例中,系统类包括activity组件的类、service组件的类、contentprovider组件的类、broadcastreceiver组件的类和application类中的一个或多个,将第一代码转换为非组件基类的第二代码,包括:在gradle插件的transform环节中,将activity组件的类的代码或service组件的类的代码或contentprovider组件的类的代码或broadcastreceiver组件的类的代码或application类的代码转换为非组件基类的第二代码。
优选地,将第一名称转换为预设的第二名称,包括:在gradle插件的transform环节中,采用javassist的修改java字节码技术将第一名称转换为预先的第二名称。
在其中一个实施例中,一种插件sdk生成方法还包括:生成宿主的宿主代码,宿主代码中第二对外接口类的名称与非插件版的sdk代码中第三对外接口类的名称相同,非插件版的sdk代码通过第三对外接口类对外通信。
在其中一个实施例中,一种插件sdk生成方法还包括:获取插件sdk中的类的标识信息;获取宿主代码中与插件sdk中的类对应的代理类;将插件sdk中的类的标识信息和代理类关联,以使得代理类通过标识信息加载插件sdk中的类。
在其中一个实施例中,将插件sdk中的类的标识信息和代理类关联,以使得代理类通过标识信息加载插件sdk中的类,包括:控制代理类通过识别标识信息并采用反射的方式调用插件sdk中的类,以加载插件sdk中的类。
在其中一个实施例中,一种插件sdk生成方法还包括:获取非插件版的sdk代码的第一资源包;获取插件sdk中第一资源包对应的第一文件包;将第一资源包替换插件sdk中的第一文件包,得到非插件版的替换后的sdk代码。
优选地,获取非插件版的sdk代码的第一资源包之前,还包括:从非插件版的sdk代码提取一个或多个第一目标资源包,得到第一资源包,第一资源包包含一个或多个第一目标资源包。
在其中一个实施例中,将第一资源包替换插件sdk中的第一文件包,得到非插件版的替换后的sdk代码之后,还包括:获取插件sdk的第二资源包;获取非插件版的替换后的sdk代码中第二资源包对应的第二文件包;将第二资源包替换非插件版的替换后的sdk代码的第二文件包,得到插件版的替换后的sdk。
优选地,获取插件sdk的第二资源包,包括:从插件sdk中提取一个或多个第二目标资源包,得到第二资源包,第二资源包包含一个或多个第二目标资源包。
一种插件sdk生成装置,该装置包括:获取模块,用于获取非插件版的sdk代码;查询模块,用于查询非插件版的sdk代码中系统类的第一代码以及第一对外接口类的第一名称;转换模块,用于将第一代码转换为非组件基类的第二代码,将第一名称转换为预设的第二名称,以使得名称转换后第一对外接口类的名称和宿主中与第一对外接口类对应的第二对外接口类的名称不同,得到待转换代码;生成模块,用于根据待转换代码生成插件版的插件sdk,插件sdk通过宿主的第二对外接口类对外通信。
一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现上述任一实施例方法的步骤。
一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述任一实施例方法的步骤。
上述插件sdk生成方法、装置、计算机设备和存储介质,发行方系统获取非插件版的sdk代码,查询非插件版的sdk代码中系统类的第一代码以及第一对外接口类的第一名称,将第一代码转换为非组件基类的第二代码,将第一名称转换为预设的第二名称,以使得名称转换后第一对外接口类的名称和宿主中与第一对外接口类对应的第二对外接口类的名称不同,得到待转换代码。最终,根据待转换代码生成插件版的插件sdk,插件sdk通过宿主的第二对外接口类对外通信。因此,在需要对外提供插件sdk和非插件sdk时,系统内部只需要维护一套非插件版的sdk代码即可。当对外提供非插件版的sdk代码进行测试,发现可以对外使用插件sdk时,将系统内维护的非插件版的sdk代码中系统类的第一代码以及第一对外接口类的第一名称进行修改,生成对应的插件sdk。由于第一对外接口类的转换后的第二名称与宿主的第二对外接口类的名称不同,即可实现插件sdk通过宿主的第二对外接口类进行对外通信,从而实现将非插件版的sdk代码转化为插件sdk,无需再单独设置一套插件sdk,减少了系统内资源的浪费。同时,系统也无需同时维护两套sdk,减少了人工维护游戏app代码的维护成本。
附图说明
图1为一个实施例中一种插件sdk生成方法的应用环境图;
图2为一个实施例中一种插件sdk生成方法的流程示意图;
图3为一个实施例中一种插件sdk的应用方法的流程示意图;
图4为一个实施例中一种插件sdk生成装置的结构框图;
图5为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
本申请提供的一种插件sdk生成方法,应用于如图1所示的应用环境中。在游戏app发行中,涉及到研发系统104提供的研发sdk代码、发行方系统106提供的发行方sdk代码以及渠道方系统102提供的渠道方sdk代码这三方代码的结合。当任一方使用到插件化方案时,其他方不能再使用插件化技术。比如渠道方sdk代码使用了插件化技术,发行方系统106提供的发行方sdk代码为避免技术存在冲突不能再使用插件化技术。反之,若其他方没有使用插件化技术,发行方系统106提供的发行方sdk代码可使用插件化技术。本申请中,发行方系统106用于实现本申请的一种插件sdk生成方法,发行方系统106只需维护一套非插件版的sdk代码即可实现在非插件版的sdk与插件sdk之间的转换。具体地,发行方系统106从数据库108中获取非插件版的sdk代码,获取非插件版的sdk代码中系统类的第一代码以及第一对外接口类的第一名称。进一步地,将第一代码转换为非组件基类的第二代码,将第一名称转换为预设的第二名称,以使得名称转换后第一对外接口类的名称和宿主中与第一对外接口类对应的第二对外接口类的名称不同,得到待转换代码。最终,根据待转换代码生成插件版的插件sdk。其中,插件sdk通过宿主对外通信,宿主通过第二对外接口类对外通信。因此,外部系统在对发行方系统106内的插件sdk进行调用时,直接调用宿主的第二对外接口类,与宿主进行通信。宿主再调用插件sdk的第一对外接口类,进而调用插件sdk,以实现插件sdk内的功能。由于插件sdk中的系统类已转换为非组件基类,在实现宿主调用时,不会与宿主内的系统类产生冲突。同时,由于插件sdk中第一对外接口类与宿主的第二对外接口类名称不同,外部系统在调用宿主时,也不会产生矛盾冲突。由此,实现了发行方系统106将内部的非插件版的sdk代码转换得到插件sdk。
在一个实施例中,如图2所示,提供了一种插件sdk生成方法,以该方法应用于图1中的发行方系统106为例进行说明,包括以下步骤:
s102,获取非插件版的sdk代码。
在本实施例中,非插件版的sdk代码存储于数据库中,系统内维护一套非插件版的sdk代码。在测试过程中,系统采用非插件版的sdk代码进行测试检验。当检验到对外可使用插件化技术时,系统对外提供插件sdk。非插件版的sdk代码中的类包含系统类和非系统类。系统类指的是包含系统的属性和方法的类,在运行过程中系统类依据其内部的系统的属性执行内部的方法,以实现系统操作上的业务逻辑。其中,非插件版的sdk代码中系统类的方法在实现过程会调用系统类的方法。具体地,非插件版的sdk代码中系统类包括四大组件的类,四大组件包括android中的activity组件、service组件、contentprovider组件、broadcastreceiver组件组件。系统类还包括application类。非插件版的sdk代码中非系统类可以是非组件的基类。非组件的基类的方法在实现过程,无需调用系统类的方法,其接口为空实现,用于被系统类调用。
s104,查询非插件版的sdk代码中系统类的第一代码以及第一对外接口类的第一名称。
在本实施例中,系统查询非插件版的sdk代码中系统类的第一代码以及非插件版的sdk代码对外的第一对外接口类。系统类指的是在运行过程中调用系统方法并执行系统功能的类,系统类由系统的类加载器进行加载。系统类的第一代码包括activity组件的代码、service组件的代码、contentprovider组件的代码、broadcastreceiver组件组件的代码,第一代码还包括application类的代码。具体地,系统在加载系统类的第一代码时,会校验第一代码由哪个类加载器进行加载。由于第一代码属于系统类的代码,此时第一代码由系统的类加载器进行加载。另外,非插件版的sdk代码的第一对外接口类为与外部系统进行通信时调用的接口类,外部系统通过调用第一对外接口类与非插件版的sdk代码生成的sdk进行通信,同时非插件版的sdk代码生成的sdk通过调用第一对外接口类与外部系统进行通信。具体地,系统对应的服务通过调用非插件版的sdk代码的第一对外接口类以及非插件版的sdk代码内系统类的第一代码和其他非系统类的代码实现对应的功能。
s106,将第一代码转换为非组件基类的第二代码,将第一名称转换为预设的第二名称,以使得名称转换后第一对外接口类的名称和宿主中与第一对外接口类对应的第二对外接口类的名称不同,得到待转换代码。
在本实施例中,非插件版的sdk代码为系统对应的服务调用的用于实现特定的非插件功能的代码。非插件版的sdk代码中系统类的第一代码属于系统类的代码,第一代码由系统的类加载器进行加载。在将非插件版的sdk代码转换生成插件sdk的过程中,若第一代码的属性没有改变,系统在检测到第一代码由系统的类加载器进行加载,与其对应的宿主apk不是由同一个类加载器进行加载,则系统会异常报错。将第一代码转换为非组件基类的第二代码后,非插件版的sdk代码中系统类将变成普通的可被调用的类,可以通过宿主中代理类调用的方式调用转换后的第二代码。此时,第二代码和宿主apk由同一个类加载器进行加载,从而实现插件sdk的功能。在具体应用场景中,将第一代码转换为非组件基类的第二代码的具体操作为:获取非插件版的sdk代码中的父类,从父类中筛选出系统类。如从父类中筛选出四大组件的类以及application类,将这些父类修改为非组件基类。
举个activity类的例子进行说明:将非插件版的sdk代码中的sdkactivity类的父类替换为普通基类,此时sdkactivity类则只是个普通的java类。宿主中定义proxyactivity类,该类为真正的activity类,属于系统类。在proxyactivity类中对应的方法,比如oncreate方法中调用sdkactivity类的oncreate方法,则可以用proxyactivity类来代理执行sdkactivity类。因此,可以实现非插件版的sdk代码的插件化代理。此时,系统可以直接将内部维护的非插件版的sdk转换为插件sdk进行使用。
此外,非插件版的sdk代码中第一对外接口类的名称,也即是第一名称,与宿主中对外通信的第二对外接口类的名称相同。为了宿主能够通过第二对外接口类对外通信而不产生异常,需将非插件版的sdk代码中第一对外接口类的第一名称改为预设的第二名称。第二名称与第二对外接口类的名称不同,因此在调用宿主的第二对外接口类时不会出现调用异常。本实施例中,将非插件版的sdk代码中第一对外接口类的第一名称转换为预设的第二名称,使得非插件版的sdk代码中第一对外接口类的名称与宿主的第二对外接口类的名称不同,能够为后续生成的插件sdk在使用宿主对外通信时不会产生异常调用。需要说明的是,该步骤中的宿主可以是已经生成的宿主,已生成的宿主中设置有第二对外接口类及其第二名称。
后续生成插件sdk后,在实现插件sdk的功能时,外部系统通过第二对外接口类调用宿主,宿主中的代理类通过第一对外接口类调用插件sdk,从而运行插件sdk中的业务逻辑。
s108,根据待转换代码生成插件版的插件sdk,插件sdk通过宿主的第二对外接口类对外通信。
在本实施例中,系统根据待转换代码生成插件版的插件sdk。具体地,待转换代码包含转换得到的第二代码和第二名称,以及非插件版的sdk代码中没有发生转换的其他代码,将待转换代码编译成apk文件,得到插件版的插件sdk。也即是,编译后得到的apk文件可作为插件使用。
其中,生成的插件sdk通过宿主对外通信,宿主通过第二对外接口类对外通信。也即是,插件sdk在使用过程中,需设置在宿主内。宿主中的代理类通过第一对外接口类调用插件sdk,实现插件sdk中的业务逻辑后通过第二对外接口类对外通信。需要再次说明的是,在步骤s106中,将第一名称转换为预设的第二名称,以使得名称转换后第一对外接口类的名称和宿主中与第一对外接口类对应的第二对外接口类的名称不同。目的正是为了在后续插件sdk应用过程中,插件sdk的对外接口的名称不能与宿主的对外接口的名称相同以避免调用异常。
上述插件sdk生成方法,系统获取非插件版的sdk代码,查询非插件版的sdk代码中系统类的第一代码以及第一对外接口类的第一名称,将第一代码转换为非组件基类的第二代码,将第一名称转换为预设的第二名称,以使得名称转换后第一对外接口类的名称和宿主中与第一对外接口类对应的第二对外接口类的名称不同,得到待转换代码。最终,根据待转换代码生成插件版的插件sdk,插件sdk通过宿主的第二对外接口类对外通信。因此,在需要对外提供插件sdk和非插件sdk时,系统内部只需要维护一套非插件版的sdk代码即可。当对外提供非插件版的sdk代码进行测试,发现可以对外使用插件sdk时,将系统内维护的非插件版的sdk代码中系统类的第一代码以及第一对外接口类的第一名称进行修改,生成对应的插件sdk。由于第一对外接口类的转换后的第二名称与宿主的第二对外接口类的名称不同,即可实现插件sdk通过宿主的第二对外接口类进行对外通信,从而实现将非插件版的sdk代码转化为插件sdk,无需再单独设置一套插件sdk,减少了系统内资源的浪费。同时,系统也无需同时维护两套sdk,减少了人工维护游戏app代码的维护成本。
在一实施例中,系统类包括activity组件的类、service组件的类、contentprovider组件的类、broadcastreceiver组件的类和application类中的一个或多个。s106中,将第一代码转换为非组件基类的第二代码,包括:在gradle插件的transform环节中,将activity组件的类的代码或service组件的类的代码或contentprovider组件的类的代码或broadcastreceiver组件的类的代码或application类的代码转换为非组件基类的第二代码。s106中,将第一名称转换为预设的第二名称,包括:在gradle插件的transform环节中,采用javassist的修改java字节码技术将第一名称转换为预先的第二名称。
在该实施例中,系统类包括四大组件的类。四大组件指的是android中的activity组件、service组件、contentprovider组件、broadcastreceiver组件组件。具体地,系统类包括以四大组件的组件类作为的父类,以及application相关的父类。android系统会加载这四大组件并且会校验由哪个类加载器进行加载。如果不是和宿主apk同一个类加载器会报异常。将四大组件的类替换为非组件基类,是因为四大组件是系统的类,类中的方法会调用系统类的方法,由于不是宿主的类加载器会抛出异常。而替换为非组件基类后,非插件版的sdk代码中的系统类就只是普通的java类了。举个activity类的例子,activity组件的类为系统类的activity类。当将activity类转换为非组件基类baseactivity类时,非组件基类baseactivity类和原始的activity类有相同的api接口,都是空实现。api接口为空实现的目的是:若系统运行的activity类为系统类,系统会检测到activity类中的oncreate方法的super.oncreate()方法不是宿主类加载器加载抛出异常。而采用代理的方式时,系统先调用宿主中的代理类proxyactivity类中的oncreate方法,执行oncreate方法中的super.oncreate。由于super.oncreate存在宿主中,执行完成后再执行加载出来的插件sdk的sdkactivity类的oncreate方法就不会出现问题。因此,可实现将内部的非插件版的sdk代码转换得到插件sdk,并能够使用插件sdk。
在gradle插件的transform环节中,采用javassist的修改java字节码技术将第一名称转换为预先的第二名称。具体地,采用javassist的修改java字节码技术调整插件sdk对外api类的名称。如将插件sdk的第一名称sqwancore修改为第二名称sqwancoreimpl。此时,宿主中的第二对外接口类的名称仍可保留为sqwancore,非插件版的sdk代码的对外接口的名称也为sqwancore。因此,系统对外提供的插件版sdk和非插件版的sdk代码两者的名称一致。此时,插件sdk的第一名称与宿主中对应的名称不相同,不会发生调用冲突,实现了系统将内部的非插件版的sdk代码转换为对应的插件sdk进行使用,又无需修改对外提供的代码调用的名称。如采用上述sqwancore作为代码调用的名称,将sqwancore作为调用参数即可实现调用插件sdk或者非插件版的sdk代码。
在一实施例中,s102之前,还包括:生成宿主的宿主代码,宿主代码中第二对外接口类的名称与非插件版的sdk代码中第三对外接口类的名称相同,非插件版的sdk代码通过第三对外接口类对外通信。
在该实施例中,在生成插件sdk之前,生成宿主的宿主代码。在其他实施例中,还可以在s108步骤之后,执行生成宿主的宿主代码的操作。但此时,需要在生成宿主的宿主代码之前,设定宿主代码中第二对外接口类的名称,由此才可保证步骤s106中将第一名称转换为预设的第二名称,以使得名称转换后第一对外接口类的名称与宿主中与第一对外接口类对应的第二对外接口类的名称不同,这个操作能够实现。
具体地,编写插件sdk的宿主的宿主代码。同时,宿主代码中第二对外接口类的名称与非插件版的sdk代码中第三对外接口类的名称相同。因此,系统可以通过同一名称调用插件sdk或者非插件版的sdk代码。在具体的实现过程中,第三对外接口类与第一对外接口类相同,都是非插件版的sdk代码的对外通信接口。在步骤s102中,获取非插件版的sdk代码可以是通过复制的方式得到非插件版的sdk代码,系统内仍然保留有非插件版的sdk代码。在生成插件sdk过程中,修改的是复制得到的非插件版的sdk代码中的第一对外接口类的第一名称,系统存储的非插件版的sdk代码的第三外接口类的名称保持不变。此时第一对外接口类与第三对外接口类指的是同一个性质的接口。当宿主代码中第二对外接口类的名称与非插件版的sdk代码中第三对外接口类的名称相同时,系统可以通过同一名称调用插件sdk或者非插件版的sdk代码。
也即是,编写和非插件版的sdk代码相同的对外api的类加载,从而使得系统在加载非插件版的sdk代码和插件sdk时接入的步骤一致,无需对新生成的插件sdk开发新的接入步骤,减少了研发的工作量,同时也减少系统代码的维护量。
在一实施例中,s108之后,还包括:获取插件sdk中的类的标识信息;获取宿主代码中与插件sdk中的类对应的代理类;将插件sdk中的类的标识信息和代理类关联,以使得代理类通过标识信息加载插件sdk中的类。
在该实施例中,由于插件sdk为新生成的插件,需要设置其内部类与宿主的代理类关联,以便于宿主的代理类能够调用插件sdk内的类。具体地,为插件sdk中的类设置标识信息。标识信息可以是类的类名。将插件sdk中的类的类名与宿主中对应的代理类关联,以使得代理类通过插件sdk中的类的类名加载插件sdk中的类。具体可以是,将插件sdk中的类的类名作为参数,传入代理类中,代理类通过插件sdk中的类的类名加载插件sdk中的类,执行插件sdk中的类的方法。
例如,如图3所示。系统判断执行的是插件sdk中的activity类,执行的步骤如下:
步骤1:获取到要启动的插件sdk中的activity类名称,如activitya,作为参数写入到intent中。intent为android中常用于存储数据的数据库。
步骤2:启动代理activity类。代理activity类为宿主中的代理类。执行代理activity类的super.oncreate方法,此时流程走系统的oncreate逻辑。
步骤3:根据步骤1存储的参数,加载插件sdk中的activitya类,执行activitya类的oncreate方法。由于activitya类的父类已经被改为基类baseactivity,其内super.oncreate是空实现,流程走到oncreate方法。
根据上述步骤1,2,3可知,当启动插件sdk中的activitya类时,先调起代理activity类,然后执行代理activity类的父类,也即是是系统activity类的oncreate方法,再执行插件sdk的activitya类的oncreate方法,运行业务逻辑代码。此步骤的流程和启动非插件的sdk代码的activity类的流程一致,先走系统activity类的oncreate方法,再走业务逻辑。因此,系统可实现插件sdk的功能。
在一实施例中,将插件sdk中的类的标识信息和代理类关联,以使得代理类通过标识信息加载插件sdk中的类,包括:控制代理类通过识别标识信息并采用反射的方式调用插件sdk中的类,以加载插件sdk中的类。
在该实施例中,在生成宿主的宿主代码时,创建插件sdk中的类对应的代理类,并控制代理类通过识别标识信息并采用反射的方式调用插件sdk中的类。可以是,标识信息为插件sdk中的类的类名,将插件sdk中的类的类名作为代理类的入参,代理类通过入参进行反射调用插件sdk中的类。具体地,java类加载中不能加载两个相同名称的类,要把插件sdk中的sqwancore类换名称为sqwancoreimpl类,在插件版sdk的宿主中再写个sqwancore类,通过反射的方式调用sqwancoreimpl类的方法,从而实现宿主调用插件版sdk以实现插件版sdk的功能。
在一实施例中,s108之后,还包括:获取非插件版的sdk代码的第一资源包;获取插件sdk中第一资源包对应的第一文件包;将第一资源包替换插件sdk中的第一文件包,得到非插件版的替换后的sdk代码。优选地,获取非插件版的sdk代码的第一资源包之前,还包括:从非插件版的sdk代码提取一个或多个第一目标资源包,得到第一资源包,第一资源包包含一个或多个第一目标资源包。
在该实施例中,系统分析非插件版的sdk代码,从非插件版的sdk代码中获取一个或多个第一目标资源包,得到第一资源包。其中,第一目标资源包可用于替换插件sdk中对应的资源文件。进一步地,系统获取插件sdk中第一资源包对应的第一文件包,将第一资源包替换插件sdk中的第一文件包,得到非插件版的替换后的sdk代码。具体地,对非插件版的sdk代码进行切包处理,采用普通sdk工程生成非插件资源。此处的非插件资源也即是第一资源包。通过资源替换的方式,将第一资源包替换掉插件版sdk中对应第一文件包,即可得到非插件版的替换后的sdk代码。因此,可实现插件版sdk与非插件版的sdk代码的转换,并提高插件版sdk与非插件版的sdk代码的转换效率。
在一实施例中,将第一资源包替换插件sdk中的第一文件包,得到非插件版的替换后的sdk代码之后,还包括:获取插件sdk的第二资源包;获取非插件版的替换后的sdk代码中第二资源包对应的第二文件包;将第二资源包替换非插件版的替换后的sdk代码的第二文件包,得到插件版的替换后的sdk代码。优选地,获取插件sdk的第二资源包,包括:从插件sdk中提取一个或多个第二目标资源包,得到包含第二资源包,第二资源包包含一个或多个第二目标资源包。
在该实施例中,当生成插件sdk之后,从插件sdk中提取一个或多个第二目标资源包。其中,第二目标资源包可用于替换非插件版的sdk代码中对应的资源文件。进一步地,获取非插件版的替换后的sdk代码中第二资源包对应的第二文件包,将第二资源包替换第二文件包即可得到插件版的替换后的sdk,从而可实现插件版sdk与非插件版的sdk代码的转换,并提高插件版sdk与非插件版的sdk代码的转换效率。
具体地,在切包环节准备两种类型的资源:用普通sdk工程生成非插件的sdk代码的第一资源包,也即是非插件版资源。用插件sdk以及宿主代码生成的第二目标资源包,也即是插件版资源。其中,切包时可按需切包,如果和渠道冲突不能使用插件sdk,则使用非插件版资源替换插件sdk中对应文件包的方式,生成非插件版的sdk代码进行使用。否则使用插件版资源替换非插件版的sdk代码中对应文件包的方式,生成插件sdk进行使用。如果和研发母包冲突,则按照旧方式向研发提供插件版sdk供研发接入,同时切包时使用非插件版资源。
因此,可根据实际要求实现两种代码的快速转换。
应该理解的是,虽然流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,附图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
本申请还提供一种插件sdk生成装置,如图4所示,该装置包括获取模块10、查询模块20、转换模块30以及生成模块40。获取模块10,用于获取非插件版的sdk代码;查询模块20,用于查询非插件版的sdk代码中系统类的第一代码以及第一对外接口类的第一名称;转换模块30,用于将第一代码转换为非组件基类的第二代码,将第一名称转换为预设的第二名称,以使得名称转换后第一对外接口类的名称和宿主中与第一对外接口类对应的第二对外接口类的名称不同,得到待转换代码;生成模块40,用于根据待转换代码生成插件版的插件sdk,插件sdk通过宿主的第二对外接口类对外通信。
在其中一个实施例中,系统类包括activity组件的类、service组件的类、contentprovider组件的类、broadcastreceiver组件的类和application类中的一个或多个;转换模块30具体用于在gradle插件的transform环节中,将activity组件的类的代码或service组件的类的代码或contentprovider组件的类的代码或broadcastreceiver组件的类的代码或application类的代码转换为非组件基类的第二代码。
优选地,转换模块30具体还用于在gradle插件的transform环节中,采用javassist的修改java字节码技术将第一名称转换为预先的第二名称。
在其中一个实施例中,一种插件sdk生成装置还包括宿主代码生成模块,用于生成宿主的宿主代码,宿主代码中第二对外接口类的名称与非插件版的sdk代码中第三对外接口类的名称相同,非插件版的sdk代码通过第三对外接口类对外通信。
在其中一个实施例中,一种插件sdk生成装置还包括关联模块,用于获取插件sdk中的类的标识信息;获取宿主代码中与插件sdk中的类对应的代理类;将插件sdk中的类的标识信息和代理类关联,以使得代理类通过标识信息加载插件sdk中的类。
在其中一个实施例中,将插件sdk中的类的标识信息和代理类关联,以使得代理类通过标识信息加载插件sdk中的类,包括:控制代理类通过识别标识信息并采用反射的方式调用插件sdk中的类,以加载插件sdk中的类。
在其中一个实施例中,一种插件sdk生成装置还包括替换模块,用于获取非插件版的sdk代码的第一资源包;获取插件sdk中第一资源包对应的第一文件包;将第一资源包替换插件sdk中的第一文件包,得到非插件版的替换后的sdk代码。
优选地,获取非插件版的sdk代码的第一资源包之前,还包括:从非插件版的sdk代码提取一个或多个第一目标资源包,得到第一资源包,第一资源包包含一个或多个第一目标资源包。
在其中一个实施例中,将第一资源包替换插件sdk中的第一文件包,得到非插件版的替换后的sdk代码之后,还包括:获取插件sdk的第二资源包;获取非插件版的替换后的sdk代码中第二资源包对应的第二文件包;将第二资源包替换非插件版的替换后的sdk代码的第二文件包,得到插件版的替换后的sdk。
优选地,从插件sdk中提取一个或多个第二目标资源包,得到第二资源包,第二资源包包含一个或多个第二目标资源包。
关于插件sdk生成装置的具体限定可以参见上文中对于插件sdk生成方法的限定,在此不再赘述。上述插件sdk生成装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是支持发行方系统106运行的服务器,其内部结构图可以如图5所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的数据库连接,以读取数据库中的非插件版的sdk代码。该计算机程序被处理器执行时以实现一种插件sdk生成方法。
本领域技术人员可以理解,图5中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:获取非插件版的sdk代码;查询非插件版的sdk代码中系统类的第一代码以及第一对外接口类的第一名称;将第一代码转换为非组件基类的第二代码,将第一名称转换为预设的第二名称,以使得名称转换后第一对外接口类的名称和宿主中与第一对外接口类对应的第二对外接口类的名称不同,得到待转换代码;根据待转换代码生成插件版的插件sdk,插件sdk通过宿主的第二对外接口类对外通信。
在其中一个实施例中,系统类包括activity组件的类、service组件的类、contentprovider组件的类、broadcastreceiver组件的类和application类中的一个或多个。处理器执行计算机程序实现上述的将第一代码转换为非组件基类的第二代码的步骤时,具体实现以下步骤:在gradle插件的transform环节中,将activity组件的类的代码或service组件的类的代码或contentprovider组件的类的代码或broadcastreceiver组件的类的代码或application类的代码转换为非组件基类的第二代码。
在其中一个实施例中,处理器执行计算机程序实现上述的将第一名称转换为预设的第二名称的步骤时,具体实现以下步骤:在gradle插件的transform环节中,采用javassist的修改java字节码技术将第一名称转换为预先的第二名称。
在其中一个实施例中,处理器执行计算机程序时还实现以下步骤:生成宿主的宿主代码,宿主代码中第二对外接口类的名称与非插件版的sdk代码中第三对外接口类的名称相同,非插件版的sdk代码通过第三对外接口类对外通信。
在其中一个实施例中,处理器执行计算机程序时还实现以下步骤:获取插件sdk中的类的标识信息;获取宿主代码中与插件sdk中的类对应的代理类;将插件sdk中的类的标识信息和代理类关联,以使得代理类通过标识信息加载插件sdk中的类。
在其中一个实施例中,处理器执行计算机程序实现上述的将插件sdk中的类的标识信息和代理类关联,以使得代理类通过标识信息加载插件sdk中的类的步骤时,具体实现以下步骤:控制代理类通过识别标识信息并采用反射的方式调用插件sdk中的类,以加载插件sdk中的类。
在其中一个实施例中,处理器执行计算机程序时还实现以下步骤:获取非插件版的sdk代码的第一资源包;获取插件sdk中第一资源包对应的第一文件包;将第一资源包替换插件sdk中的第一文件包,得到非插件版的替换后的sdk代码。
在其中一个实施例中,处理器执行计算机程序时还实现以下步骤:从非插件版的sdk代码提取一个或多个第一目标资源包,得到第一资源包,第一资源包包含一个或多个第一目标资源包。
在其中一个实施例中,处理器执行计算机程序时还实现以下步骤:获取插件sdk的第二资源包;获取插件sdk的第二资源包;获取非插件版的替换后的sdk代码中第二资源包对应的第二文件包;将第二资源包替换非插件版的替换后的sdk代码的第二文件包,得到插件版的替换后的sdk。
在其中一个实施例中,处理器执行计算机程序实现上述的获取插件sdk的第二资源包的步骤时,具体实现以下步骤:从插件sdk中提取一个或多个第二目标资源包,得到第二资源包,第二资源包包含一个或多个第二目标资源包。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:获取非插件版的sdk代码;查询非插件版的sdk代码中系统类的第一代码以及第一对外接口类的第一名称;将第一代码转换为非组件基类的第二代码,将第一名称转换为预设的第二名称,以使得名称转换后第一对外接口类的名称和宿主中与第一对外接口类对应的第二对外接口类的名称不同,得到待转换代码;根据待转换代码生成插件版的插件sdk,插件sdk通过宿主的第二对外接口类对外通信。
在其中一个实施例中,系统类包括activity组件的类、service组件的类、contentprovider组件的类、broadcastreceiver组件的类和application类中的一个或多个。计算机程序被处理器执行实现上述的将第一代码转换为非组件基类的第二代码的步骤时,具体实现以下步骤:在gradle插件的transform环节中,将activity组件的类的代码或service组件的类的代码或contentprovider组件的类的代码或broadcastreceiver组件的类的代码或application类的代码转换为非组件基类的第二代码。
在其中一个实施例中,计算机程序被处理器执行实现上述的将第一名称转换为预设的第二名称的步骤时,具体实现以下步骤:在gradle插件的transform环节中,采用javassist的修改java字节码技术将第一名称转换为预先的第二名称。
在其中一个实施例中,计算机程序被处理器执行时还实现以下步骤:生成宿主的宿主代码,宿主代码中第二对外接口类的名称与非插件版的sdk代码中第三对外接口类的名称相同,非插件版的sdk代码通过第三对外接口类对外通信。
在其中一个实施例中,计算机程序被处理器执行时还实现以下步骤:获取插件sdk中的类的标识信息;获取宿主代码中与插件sdk中的类对应的代理类;将插件sdk中的类的标识信息和代理类关联,以使得代理类通过标识信息加载插件sdk中的类。
在其中一个实施例中,计算机程序被处理器执行实现上述的将插件sdk中的类的标识信息和代理类关联,以使得代理类通过标识信息加载插件sdk中的类的步骤时,具体实现以下步骤:控制代理类通过识别标识信息并采用反射的方式调用插件sdk中的类,以加载插件sdk中的类。
在其中一个实施例中,计算机程序被处理器执行时还实现以下步骤:获取非插件版的sdk代码的第一资源包;获取插件sdk中第一资源包对应的第一文件包;将第一资源包替换插件sdk中的第一文件包,得到非插件版的替换后的sdk代码。
在其中一个实施例中,计算机程序被处理器执行时还实现以下步骤:从非插件版的sdk代码提取一个或多个第一目标资源包,得到第一资源包,第一资源包包含一个或多个第一目标资源包。
在其中一个实施例中,计算机程序被处理器执行时还实现以下步骤:获取插件sdk的第二资源包;获取插件sdk的第二资源包;获取非插件版的替换后的sdk代码中第二资源包对应的第二文件包;将第二资源包替换非插件版的替换后的sdk代码的第二文件包,得到插件版的替换后的sdk。
在其中一个实施例中,计算机程序被处理器执行实现上述的获取插件sdk的第二资源包的步骤时,具体实现以下步骤:从插件sdk中提取一个或多个第二目标资源包,得到第二资源包,第二资源包包含一个或多个第二目标资源包。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
1.一种插件sdk生成方法,所述方法包括:
获取非插件版的sdk代码;
查询所述非插件版的sdk代码中系统类的第一代码以及第一对外接口类的第一名称;
将所述第一代码转换为非组件基类的第二代码,将所述第一名称转换为预设的第二名称,以使得名称转换后所述第一对外接口类的名称和宿主中与所述第一对外接口类对应的第二对外接口类的名称不同,得到待转换代码;
根据所述待转换代码生成插件版的插件sdk,所述插件sdk通过所述宿主的所述第二对外接口类对外通信。
2.根据权利要求1所述的方法,其特征在于,所述系统类包括activity组件的类、service组件的类、contentprovider组件的类、broadcastreceiver组件的类和application类中的一个或多个,所述将所述第一代码转换为非组件基类的第二代码,包括:
在gradle插件的transform环节中,将所述activity组件的类的代码或所述service组件的类的代码或所述contentprovider组件的类的代码或所述broadcastreceiver组件的类的代码或所述application类的代码转换为非组件基类的第二代码;
优选地,所述将所述第一名称转换为预设的第二名称,包括:
在gradle插件的transform环节中,采用javassist的修改java字节码技术将所述第一名称转换为预先的第二名称。
3.根据权利要求1所述的方法,其特征在于,所述方法还包括:
生成所述宿主的宿主代码,所述宿主代码中所述第二对外接口类的名称与所述非插件版的sdk代码中第三对外接口类的名称相同,所述非插件版的sdk代码通过所述第三对外接口类对外通信。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
获取所述插件sdk中的类的标识信息;
获取所述宿主代码中与所述插件sdk中的类对应的代理类;
将所述插件sdk中的类的标识信息和所述代理类关联,以使得所述代理类通过所述标识信息加载所述插件sdk中的类。
5.根据权利要求4所述的方法,其特征在于,所述将所述插件sdk中的类的标识信息和所述代理类关联,以使得所述代理类通过所述标识信息加载所述插件sdk中的类,包括:
控制所述代理类通过识别所述标识信息并采用反射的方式调用所述插件sdk中的类,以加载所述插件sdk中的类。
6.根据权利要求1所述的方法,其特征在于,所述方法还包括:
获取所述非插件版的sdk代码的第一资源包;
获取所述插件sdk中所述第一资源包对应的第一文件包;
将所述第一资源包替换所述插件sdk中的第一文件包,得到非插件版的替换后的sdk代码;
优选地,所述获取所述非插件版的sdk代码的第一资源包之前,还包括:
从所述非插件版的sdk代码提取一个或多个第一目标资源包,得到所述第一资源包,所述第一资源包包含一个或多个所述第一目标资源包。
7.根据权利要求6所述的方法,其特征在于,所述将所述第一资源包替换所述插件sdk中的第一文件包,得到非插件版的替换后的sdk代码之后,还包括:
获取所述插件sdk的第二资源包;
获取所述非插件版的替换后的sdk代码中所述第二资源包对应的第二文件包;
将所述第二资源包替换所述非插件版的替换后的sdk代码的第二文件包,得到插件版的替换后的sdk;
优选地,所述获取所述插件sdk的第二资源包,包括:
从所述插件sdk中提取一个或多个第二目标资源包,得到所述第二资源包,所述第二资源包包含所述一个或多个第二目标资源包。
8.一种插件sdk生成装置,其特征在于,所述装置包括:
获取模块,用于获取非插件版的sdk代码;
查询模块,用于查询所述非插件版的sdk代码中系统类的第一代码以及第一对外接口类的第一名称;
转换模块,用于将所述第一代码转换为非组件基类的第二代码,将所述第一名称转换为预设的第二名称,以使得名称转换后所述第一对外接口类的名称和宿主中与所述第一对外接口类对应的第二对外接口类的名称不同,得到待转换代码;
生成模块,用于根据所述待转换代码生成插件版的插件sdk,所述插件sdk通过所述宿主的所述第二对外接口类对外通信。
9.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至7中任一项所述方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至7中任一项所述的方法的步骤。
技术总结