CN113407165A - Sdk的生成和自升级方法、装置、可读介质和设备 - Google Patents

Sdk的生成和自升级方法、装置、可读介质和设备 Download PDF

Info

Publication number
CN113407165A
CN113407165A CN202110726857.1A CN202110726857A CN113407165A CN 113407165 A CN113407165 A CN 113407165A CN 202110726857 A CN202110726857 A CN 202110726857A CN 113407165 A CN113407165 A CN 113407165A
Authority
CN
China
Prior art keywords
plug
host
file
public
sdk
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202110726857.1A
Other languages
English (en)
Other versions
CN113407165B (zh
Inventor
魏君成
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing ByteDance Network Technology Co Ltd
Original Assignee
Beijing ByteDance Network Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing ByteDance Network Technology Co Ltd filed Critical Beijing ByteDance Network Technology Co Ltd
Priority to CN202110726857.1A priority Critical patent/CN113407165B/zh
Publication of CN113407165A publication Critical patent/CN113407165A/zh
Application granted granted Critical
Publication of CN113407165B publication Critical patent/CN113407165B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Computing Systems (AREA)
  • Stored Programmes (AREA)

Abstract

本公开涉及一种SDK的生成和自升级方法、装置、可读介质和设备,涉及电子信息技术领域,该方法包括:编译得到宿主SDK,并获取宿主SDK的宿主依赖文件和宿主映射文件,根据宿主依赖文件和宿主映射文件,编译得到依赖于宿主SDK的公共插件,并获取公共插件的去重依赖文件和公共映射文件,去重依赖文件为在公共依赖关系中去除与宿主依赖文件相同的依赖关系得到的,根据宿主依赖文件、宿主映射文件、去重依赖文件和公共映射文件,编译得到依赖于宿主SDK和公共插件的功能插件,根据宿主SDK、公共插件和功能插件,生成目标SDK。本公开能够有效减少功能插件的体积,优化目标SDK的结构。

Description

SDK的生成和自升级方法、装置、可读介质和设备
技术领域
本公开涉及电子信息技术领域,具体地,涉及一种SDK的生成和自升级方法、装置、可读介质和设备。
背景技术
随着电子信息技术的不断发展,应用市场上出现了各种各样的应用程序(英文:Application,缩写:APP),以满足用户多样化的需求。在安卓系统应用软件的开发过程中,为了减少重复的工作量,会通过引入SDK(英文:Software Development Kit,中文:软件开发工具包)的方式来使用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的结构。
本公开的其他特征和优点将在随后的具体实施方式部分予以详细说明。
附图说明
结合附图并参考以下具体实施方式,本公开各实施例的上述和其他特征、优点及方面将变得更加明显。贯穿附图中,相同或相似的附图标记表示相同或相似的元素。应当理解附图是示意性的,原件和元素不一定按照比例绘制。在附图中:
图1是根据一示例性实施例示出的一种SDK的生成方法的流程图;
图2是根据一示例性实施例示出的一种目标SDK结构的示意图;
图3是根据一示例性实施例示出的另一种SDK的生成方法的流程图;
图4是根据一示例性实施例示出的另一种SDK的生成方法的流程图;
图5是根据一示例性实施例示出的一种SDK的自升级方法的流程图;
图6是根据一示例性实施例示出的另一种SDK的自升级方法的流程图;
图7是根据一示例性实施例示出的一种SDK的生成装置的框图;
图8是根据一示例性实施例示出的另一种SDK的生成装置的框图;
图9是根据一示例性实施例示出的另一种SDK的生成装置的框图;
图10是根据一示例性实施例示出的一种SDK的自升级装置的框图;
图11是根据一示例性实施例示出的另一种SDK的自升级装置的框图;
图12是根据一示例性实施例示出的一种电子设备的框图。
具体实施方式
下面将参照附图更详细地描述本公开的实施例。虽然附图中显示了本公开的某些实施例,然而应当理解的是,本公开可以通过各种形式来实现,而且不应该被解释为限于这里阐述的实施例,相反提供这些实施例是为了更加透彻和完整地理解本公开。应当理解的是,本公开的附图及实施例仅用于示例性作用,并非用于限制本公开的保护范围。
应当理解,本公开的方法实施方式中记载的各个步骤可以按照不同的顺序执行,和/或并行执行。此外,方法实施方式可以包括附加的步骤和/或省略执行示出的步骤。本公开的范围在此方面不受限制。
本文使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”;术语“一些实施例”表示“至少一些实施例”。其他术语的相关定义将在下文描述中给出。
需要注意,本公开中提及的“第一”、“第二”等概念仅用于对不同的装置、模块或单元进行区分,并非用于限定这些装置、模块或单元所执行的功能的顺序或者相互依存关系。
需要注意,本公开中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
本公开实施方式中的多个装置之间所交互的消息或者信息的名称仅用于说明性的目的,而并不是用于对这些消息或信息的范围进行限制。
图1是根据一示例性实施例示出的一种SDK的生成方法的流程图,如图1所示,该方法包括:
步骤101,编译得到宿主SDK,并获取宿主SDK的宿主依赖文件和宿主映射文件。
举例来说,本公开实施例的应用场景可以为目标SDK的生成场景,目标SDK的形式例如可以是.aar文件。目标SDK中包括了宿主SDK、公共插件(可以表示为common plugin)和多个功能插件(可以表示为feature plugin)。其中,宿主SDK的形式例如可以是.aar文件,公共插件和功能插件的形式例如可以是.apk文件。宿主SDK可以理解为,能够对外提供外部API(英文:Application Programming Interface,中文:应用程序接口),应用程序可以通过外部API来使用目标SDK提供的功能。公共插件可以理解为,对宿主SDK提供内部的API,功能插件具体实现目标SDK所提供的功能。宿主SDK通过内部API加载功能插件,以调用功能插件实现的功能。目标SDK中宿主SDK、公共插件和功能插件的结构可以如图2所示。
要生成目标SDK,首先需要确定用于编译宿主SDK的代码,其中可以包括预先编写的,实现宿主SDK加载公共插件、功能插件的执行逻辑、外部API的执行逻辑等(即宿主SDK本身的代码),还可以包括根据宿主SDK本身的宿主依赖关系确定的代码,例如外部的第三方库(例如:multidex库、support库等)。其中,宿主SDK的依赖关系可以是根据具体需求预先编写的。之后,对上述代码进行编译,可以得到宿主SDK。编译过程可以理解为,将代码编译为能够运行的文件,即宿主SDK(可以是.aar文件)。具体的,可以利用预设的编译工具,建立相应的编译工程,将代码输入到编译工程中,并启动编译。在编译过程中,还可以获取宿主SDK的宿主依赖文件和宿主映射文件,其中,宿主依赖文件中记录了宿主依赖关系,宿主映射文件(即mapping文件)中记录了宿主SDK的混淆规则。
步骤102,根据宿主依赖文件和宿主映射文件,编译得到依赖于宿主SDK的公共插件,并获取公共插件的去重依赖文件和公共映射文件,去重依赖文件为在公共依赖关系中去除与宿主依赖文件相同的依赖关系得到的。
示例的,在得到宿主SDK之后,可以根据宿主依赖文件和宿主映射文件,编译得到依赖于宿主SDK的公共插件。具体的,可以先确定用于编译公共插件的代码和资源,其中可以包括预先编写的,实现公共插件调用功能插件的执行逻辑、内部API的执行逻辑、展示页面的布局文件、图片、动画、字符串、颜色等资源(即公共插件本身的代码和资源),还可以包括根据第一去重依赖关系确定的代码,和/或资源。需要说明的是,用于编译公共插件的代码和资源,可以是根据具体需求确定的,更新频率较低的代码和资源,还可以是一些内部的,较大体积的内部基础库。其中,第一去重依赖关系,是根据宿主依赖文件,和公共插件本身的公共依赖关系确定的,可以理解为将公共依赖关系中,去除与宿主依赖文件所记录的宿主依赖关系相同的依赖关系得到的,或者说将公共依赖关系中,与宿主依赖文件中重复的部分删除,即可得到第一去重依赖关系。也就是说,第一去重依赖关系,与宿主依赖关系不重复,或者说不相交。公共依赖关系,是根据具体需求预先编写的,也就是说,其反映了原始的公共插件与其他代码、资源的依赖,开发人员在编写相应的代码时,不需要为宿主SDK和公共插件的拆分做额外的修改。例如,宿主依赖关系中指示宿主SDK依赖于:multidex库和support库,公共依赖关系中指示公共插件依赖于:multidex库和okhttp3库,其中,multidex库是重复的,那么第一去重依赖关系为:okhttp3库,这样根据第一去重依赖关系确定的代码和资源,就不需要重复引入multidex库,减少了公共插件的体积。也就是说,用于编译公共插件的代码,不会与用于编译宿主SDK的代码重复。
之后,对上述代码和资源进行编译,可得到依赖于宿主SDK的公共插件。编译过程可以理解为,将代码和资源编译为能够运行的文件,即公共插件(可以是.apk文件)。具体的,在编译公共插件时,为了使公共插件能够使用宿主SDK中的代码,可以在公共插件自身的混淆规则的基础上,按照宿主映射文件记录的宿主SDK的混淆规则对编译结果进行增量混淆(即applymapping),这样,得到的公共插件能够调用宿主SDK中的代码,即公共插件依赖于宿主SDK,同时公共插件中包括的代码与宿主SDK中包括的代码不重叠,降低了代码的耦合度,从而能够分别对公共插件、宿主SDK进行更新,提高了更新的成功率。在编译过程中,还可以得到去重依赖文件和公共映射文件,其中,去重依赖文件中记录了第一去重依赖关系,公共映射文件(即mapping文件)中记录了公共插件自身的混淆规则。
步骤103,根据宿主依赖文件、宿主映射文件、去重依赖文件和公共映射文件,编译得到依赖于宿主SDK和公共插件的功能插件。
示例的,在得到宿主SDK、和公共插件之后,可以根据宿主依赖文件、宿主映射文件、去重依赖文件和公共映射文件,编译得到依赖于宿主SDK和公共插件的功能插件。具体的,可以先确定用于编译功能插件的代码和资源,其中可以包括预先编写的,实现目标SDK能够提供的一个功能的执行逻辑、展示页面的布局文件,还可以是图片、动画、字符串、颜色等资源(即功能插件本身的代码和资源),还可以包括根据第二去重依赖关系确定的代码,和/或资源。需要说明的是,功能插件可以对应目标SDK的一个功能,其更新频率要高于公共插件。其中,第二去重依赖关系,是根据去重依赖文件中记录的第一去重依赖关系、宿主依赖文件中记录的宿主依赖关系,和功能插件本身的功能依赖关系确定的。可以理解为,在功能依赖关系中,去除与宿主依赖文件所记录的宿主依赖关系、去重依赖文件中记录的第一去重依赖关系相同的依赖关系得到的,或者说将公共依赖关系中,与宿主依赖文件、去重依赖文件中重复的部分删除,即可得到第二去重依赖关系。也就是说,第二去重依赖关系,与宿主依赖关系、第一去重依赖关系不重复,或者说不相交。功能依赖关系,是根据具体需求预先编写的,也就是说,其反映了原始的功能插件与其他代码、资源的依赖,开发人员在编写相应的代码时,不需要为宿主SDK、公共插件、功能插件的拆分做额外的修改。例如,宿主依赖关系中指示宿主SDK依赖于:multidex库和support库,公共依赖关系中指示公共插件依赖于:multidex库和okhttp3库,功能依赖关系中指示功能插件依赖于multidex库、okhttp3库和A图片,那么第二去重依赖关系为:A图片,这样根据第二去重依赖关系确定的代码和资源,就不需要重复引入multidex库和okhttp3库,有效减少了功能插件的体积。也就是说,用于编译功能插件的代码和资源,不会与用于编译宿主SDK的代码重复,也不会与用于编译公共插件的代码和资源重复。
之后,对上述代码和资源进行编译,可以得到依赖于宿主SDK、公共插件的功能插件。编译过程可以理解为,将代码和资源编译为能够运行的文件,即功能插件(可以是.apk文件)。具体的,在编译功能插件时,为了使功能插件能够使用宿主SDK中的代码,和公共插件中的代码和资源,可以在功能插件自身的混淆规则的基础上,按照宿主映射文件记录的宿主SDK的混淆规则、和公共映射文件记录的公共插件的混淆规则,对编译结果进行增量混淆,这样,得到的功能插件能够调用宿主SDK和公共插件中的代码,同时能够使用公共插件中的资源,即功能插件依赖于宿主SDK和公共插件,同时功能插件中包括的代码,与宿主SDK和公共插件中包括的代码不重叠,且功能插件中包括的资源,与公共插件中包括的资源不重叠,降低了代码的耦合度,从而能够分别对功能插件、公共插件、宿主SDK进行更新,进一步提高了更新的成功率。进一步的,在编译过程中,还可以得到功能映射文件(即mapping文件),其中记录了功能插件自身的混淆规则。
需要说明的是,功能插件可以有多个,针对每个功能插件,都可以通过步骤103来进行编译。每个功能插件对应目标SDK的一个功能,相应的,该功能插件的代码和资源仅为实现该功能的代码和资源,也就是说多个功能插件之间是相互独立的,代码和资源不重复,多个功能插件之间不会相互依赖。例如:目标SDK提供支付功能、登录功能、推送功能等,那么目标SDK可以包括支付功能插件、登录功能插件、推送功能插件等。
步骤104,根据宿主SDK、公共插件和功能插件,生成目标SDK。
示例的,通过上述三个步骤编译得到了宿主SDK、公共插件和功能插件(可以包括多个功能插件),那么可以将宿主SDK、公共插件和功能插件整合打包为目标SDK(可以是.aar文件)。具体的,可以将公共插件和功能插件放置在宿主SDK中,以作为目标SDK,也可以将宿主SDK、公共插件和功能插件重新打包为目标SDK,本公开对此不作具体限定。这样,通过各自的依赖关系,可以自动拆分为代码互不重叠的宿主SDK、公共插件、功能插件分别进行编译。由于宿主SDK、公共插件和功能插件之间的依赖关系是逐层依赖的,即同一层之间多个功能插件是相互独立的,并且宿主SDK、公共插件和功能插件之间的代码、资源均不重复,因此有效减少了公共插件、功能插件的体积,优化了目标SDK的结构。对于开发人员来说,可以按照正常的开发流程来编写代码,而不需为宿主SDK、公共插件和功能插件的拆分,对代码进行额外的修改,不会增加额外的开发工作量。进一步的,由于减少了公共插件、功能插件的体积,在针对功能插件或者公共插件进行更新时,消耗的流量大大减少,能够有效提高更新的成功率。
综上所述,本公开首先编译得到宿主SDK,并获取宿主SDK的宿主依赖文件和宿主映射文件。之后,根据宿主依赖文件和宿主映射文件,编译得到依赖于宿主SDK的公共插件,同时获取公共插件的去重依赖文件和公共映射文件,其中,通过在公共依赖关系中去除与宿主依赖文件相同的依赖关系得到去重依赖文件。再根据宿主依赖文件、宿主映射文件、去重依赖文件和公共映射文件,编译得到依赖于宿主SDK和公共插件的功能插件。最后,根据宿主SDK、公共插件和功能插件,生成目标SDK。本公开能够将目标SDK自动拆分为宿主SDK、公共插件、功能插件分别进行编译,在不增加额外开发工作量的前提下,能够有效减少功能插件的体积,优化目标SDK的结构。
图3是根据一示例性实施例示出的另一种SDK的生成方法的流程图,如图3所示,步骤102可以包括:
步骤1021,根据公共依赖关系确定公共插件所依赖的代码、资源。
步骤1022,根据公共插件的代码、资源和公共插件所依赖的代码、资源,进行编译检查。
步骤1023,在公共插件所依赖的代码、资源中,去除与宿主依赖文件匹配的代码、资源,以得到公共去重代码,和公共去重资源。
步骤1024,在公共依赖关系中,去除与宿主依赖文件相同的依赖关系,以得到去重依赖文件。
步骤1025,根据宿主映射文件,确定宿主SDK的混淆规则。
步骤1026,对公共插件的代码、资源、公共去重代码,和公共去重资源进行编译,并利用宿主SDK的混淆规则进行增量混淆,以得到公共插件和公共映射文件。
举例来说,在编译公共插件的过程中,可以利用预设的编译工具(例如:Gradle工具),建立相应的编译工程,将对应的代码和资源输入到编译工程中,并启动编译。具体的,在进行编译之前,需要进行编译检查,可以先根据公共依赖关系确定公共插件所依赖的代码、资源,从而根据公共插件的代码、资源和公共插件所依赖的代码、资源,进行编译检查。其中,公共插件所依赖的代码、资源中,还包括了公共依赖关系中与宿主依赖关系重复的部分。也就是说,公共插件的代码、资源和公共插件所依赖的代码、资源,涵盖了公共插件所需的全部代码和资源,因此,能够通过编译检查。
在通过编译检查之后,在公共插件所依赖的代码、资源中,去除与宿主依赖文件匹配的代码、资源,以得到公共去重代码,和公共去重资源。也可以理解为,利用第一去重依赖关系确定公共去重代码,和公共去重资源,公共去重代码,和公共去重资源,与宿主SDK中的代码不重叠。具体的,可以利用Hook机制,在编译工程执行至公共依赖关系时,判断该依赖关系与宿主依赖关系是否重复,若重复,则不引入该依赖关系指示的代码和资源,若不重复,则引入该依赖关系指示的代码和资源。同时,还可以建立去重依赖文件,以记录第一去重依赖关系。
之后,再从宿主映射文件中,解析出宿主SDK的混淆规则。最后,对公共插件的代码、资源、公共去重代码,和公共去重资源进行编译。在编译时,编译工具会为公共插件设置自身的混淆规则,以对编译结果进行混淆,为了使公共插件能够调用宿主SDK中的代码,可以在公共插件自身的混淆规则基础上,利用宿主SDK的混淆规则进行增量混淆,从而打包得到公共插件,并记录生成公共映射文件。
图4是根据一示例性实施例示出的另一种SDK的生成方法的流程图,如图4所示,步骤103可以通过以下步骤来实现:
步骤1031,根据功能依赖关系确定功能插件所依赖的代码、资源。
步骤1032,根据功能插件的代码、资源和功能插件所依赖的代码、资源,进行编译检查。
步骤1033,在功能插件所依赖的代码、资源中,去除与宿主依赖文件、去重依赖文件匹配的代码、资源,以得到功能去重代码,和功能去重资源。
步骤1034,根据宿主映射文件、公共映射文件,确定宿主SDK的混淆规则、公共插件的混淆规则。
步骤1035,对功能插件的代码、资源、功能去重代码,和功能去重资源进行编译,并利用宿主SDK的混淆规则、公共插件的混淆规则进行增量混淆,以得到功能插件。
举例来说,在编译功能插件的过程中,可以利用编译工具(例如:Gradle工具),建立相应的编译工程,将对应的代码和资源输入到编译工程中,并启动编译。具体的,在进行编译之前,需要进行编译检查,可以先根据功能插依赖关系确定功能插件所依赖的代码、资源,从而根据功能插件的代码、资源和功能插件所依赖的代码、资源,进行编译检查。其中,功能插件所依赖的代码、资源,还包括了功能依赖关系中,与宿主依赖关系、公共依赖关系重复的部分。也就是说,功能插件的代码、资源和功能插件所依赖的代码、资源,涵盖了功能插件所需的全部对象,因此,能够通过编译检查。
在通过编译检查之后,可以在功能插件所依赖的代码、资源中,去除与宿主依赖文件、去重依赖文件匹配的代码、资源,以得到功能去重代码,和功能去重资源。也可以理解为,利用第二去重依赖关系,确定功能去重代码,和功能去重资源,功能去重代码,和功能去重资源与宿主SDK、公共插件中包括的代码、资源均不重叠。具体的,可以先对宿主依赖关系、公共依赖关系进行合并,然后利用Hook机制,在编译工程执行至功能依赖关系时,判断该依赖关系与合并后的依赖关系是否重复,若重复,则不引入该依赖关系指示的代码和资源,若不重复,则引入该依赖关系指示的代码和资源。
之后,再从宿主映射文件中,解析出宿主SDK的混淆规则,并从公共映射文件中,解析出公共插件的混淆规则,并将宿主SDK的混淆规则和公共插件的混淆规则进行合并。最后,对功能插件的代码、资源、功能去重代码,和功能去重资源进行编译。在编译时,编译工具会为功能插件设置自身的混淆规则,以对编译结果进行混淆,为了使功能插件能够调用宿主SDK中的代码,和公共插件中的代码、资源,可以在功能插件自身的混淆规则基础上,利用合并后的混淆规则进行增量混淆,从而打包得到功能插件。
在一种实现方式中,步骤1035可以通过以下步骤来实现:
步骤1)在执行对功能插件的资源和功能去重资源进行编译的编译任务时,指定公共插件包括的资源文件的路径,并将编译任务的包名修改公共插件的包名。
步骤2)将编译任务生成的资源文件中记载的包名修改为功能插件的包名。
步骤3)对功能插件的代码和功能去重代码进行编译,以得到功能插件。
示例的,在编译生成功能插件的过程中,是先对功能插件的资源和功能去重资源进行编译,再对功能插件的代码和功能去重代码进行编译,可以理解为,为资源和代码分别设置两个编译任务。由于功能去重代码,和功能去重资源是根据第二去重依赖关系确定的,因此可能缺少生成功能插件所需的资源,这些资源包括在公共插件中。因此在执行对资源进行编译的编译任务时,可以指定公共插件包括的资源文件的路径。并且,为了编译工具能够正确找到公共插件包括的资源文件,可以将编译任务的包名修改公共插件的包名。其中,公共插件包括的资源文件,可以理解为生成公共插件时产生的.ap文件。具体的,对资源进行编译的编译任务通常是由AAPT2(全称:Android Asset Packaging Tool)来执行的,可以将其中的aapt2_I参数设置为公共插件的.ap文件所在的路径,这样,AAPT2能够获知公共插件包括的资源。
在编译任务生成功能插件的资源文件(即.ap文件)时,可以再将功能插件的资源文件中记载的包名修改为功能插件的包名。通常情况下,资源文件中的arsc文件记录了包名,因此可以将功能插件的资源文件中的arsc文件中记录的包名再改回功能插件的包名,以通过安卓资源管理器针对shared-library资源库的校验机制,从而使得功能插件中的资源文件能够使用公共插件中的资源。最后,对功能插件的代码和功能去重代码进行编译并打包,以得到功能插件。
在另一种实现方式中,在步骤3)之前,步骤1035还可以包括:
步骤4)将公共插件包括的第一R文件和编译任务生成的第二R文件进行合并,以得到第三R文件。
相应的,步骤3)的实现方式可以为:
根据第三R文件,对功能插件的代码和功能去重代码进行编译。
进一步的,在对功能插件的代码和功能去重代码进行编译之前,还需要将公共插件包括的第一R文件和编译任务生成的第二R文件进行合并,以得到第三R文件。其中,第一R文件,可以理解为生成公共插件时产生的R.txt,第二R文件,可以理解为编译任务生成的R.txt。第三R文件,可以理解为将两个R.txt进行合并,生成可以执行的R.java文件。这样,在对功能插件的代码和功能去重代码进行编译时,可以利用第三R文件,对功能插件的代码和功能去重代码进行编译,使得功能插件的代码中的资源ID与公共插件的代码中的资源ID能够统一,以使功能插件能够使用公共插件中的资源。
综上所述,本公开首先编译得到宿主SDK,并获取宿主SDK的宿主依赖文件和宿主映射文件。之后,根据宿主依赖文件和宿主映射文件,编译得到依赖于宿主SDK的公共插件,同时获取公共插件的去重依赖文件和公共映射文件,其中,通过在公共依赖关系中去除与宿主依赖文件相同的依赖关系得到去重依赖文件。再根据宿主依赖文件、宿主映射文件、去重依赖文件和公共映射文件,编译得到依赖于宿主SDK和公共插件的功能插件。最后,根据宿主SDK、公共插件和功能插件,生成目标SDK。本公开能够将目标SDK自动拆分为宿主SDK、公共插件、功能插件分别进行编译,在不增加额外开发工作量的前提下,能够有效减少功能插件的体积,优化目标SDK的结构。
图5是根据一示例性实施例示出的一种SDK的自升级方法的流程图,如图5所示,该方法应用于根据上述SDK的生成方法生成的目标SDK,可以包括以下步骤:
步骤201,根据宿主依赖文件、宿主映射文件、去重依赖文件、公共映射文件,以及更新后的功能插件的代码、资源,编译得到更新后的功能插件。
步骤202,将更新后的功能插件发送至目标SDK,以更新目标SDK。
举例来说,在生成目标SDK之后,若需要对其中包括的某个功能插件进行更新,那么可以根据宿主依赖文件、宿主映射文件、去重依赖文件、公共映射文件,以及更新后的功能插件的代码、资源,编译得到更新后的功能插件。其中,功能依赖关系也可以被更新。之后,可以将更新后的功能插件发送至目标SDK,以更新目标SDK,由于减少了功能插件的体积,在针对功能插件进行更新时,消耗的流量大大减少,能够有效提高更新的成功率。具体的,可以主动将更新后的功能插件发送至目标SDK,也可以由目标SDK发送更新请求,之后再将更新后的功能插件发送至目标SDK,本公开对此不作具体限定。
图6是根据一示例性实施例示出的另一种SDK的自升级方法的流程图,如图6所示,功能插件包括标识信息,标识信息用于标识所依赖的公共插件的版本号。例如,可以在功能插件包括的AndroidManifest文件中,通过meta数据记录功能插件当前依赖的公共插件的版本号。
相应的,该方法还可以包括:
步骤203,根据宿主依赖文件、宿主映射文件,以及更新后的公共插件的代码、资源,编译得到更新后的公共插件。
步骤204,在检测到更新指令时,将更新后的公共插件发送至目标SDK,以更新目标SDK,更新指令为在应用程序通过目标SDK加载功能插件的情况下,根据功能插件的标识信息,和目标SDK加载的公共插件的版本号,确定目标SDK加载的公共插件需要更新时触发的。
示例的,在生成目标SDK之后,若需要对公共插件进行更新,那么可以根据宿主依赖文件、宿主映射文件,以及更新后的公共插件的代码、资源,编译得到更新后的公共插件。其中,公共依赖关系也可以被更新。在一种实现方式中,可以直接将更新后的公共插件发送至目标SDK,以更新目标SDK。在另一种实现方式中,可以在检测到更新指令时,再将更新后的公共插件发送至目标SDK,以更新目标SDK。其中,更新指令是应用程序发出的,具体的,应用程序通过目标SDK加载功能插件,首先会比较功能插件的标识信息,和目标SDK当前加载的公共插件的版本号,若功能插件的标识信息中标识的所依赖的公共插件的版本号,高于目标SDK当前加载的公共插件的版本号,那么表示需要对目标SDK当前加载的公共插件进行更新,应用程序可以发出更新指令。若功能插件的标识信息中标识的所依赖的公共插件的版本号,低于或等于目标SDK当前加载的公共插件的版本号,那么表示不需要对目标SDK当前加载的公共插件进行更新。
综上所述,本公开在目标SDK包括了宿主SDK、公共插件和功能插件的基础上,能够根据宿主依赖文件、宿主映射文件、去重依赖文件、公共映射文件,以及更新后的功能插件的代码、资源,编译得到更新后的功能插件,从而将更新后的功能插件发送至目标SDK,以更新目标SDK。其中,通过在公共依赖关系中去除与宿主依赖文件相同的依赖关系得到去重依赖文件。本公开在将目标SDK自动拆分为宿主SDK、公共插件、功能插件的基础上,能够单独更新小体积的功能插件,减少了更新消耗的流量,从而提高更新的成功率。
图7是根据一示例性实施例示出的一种SDK的生成装置的框图,如图7所示,该装置300包括:
第一编译模块301,用于编译得到宿主SDK,并获取宿主SDK的宿主依赖文件和宿主映射文件。
第二编译模块302,用于根据宿主依赖文件和宿主映射文件,编译得到依赖于宿主SDK的公共插件,并获取公共插件的去重依赖文件和公共映射文件,去重依赖文件为在公共依赖关系中去除与宿主依赖文件相同的依赖关系得到的。
第三编译模块303,用于根据宿主依赖文件、宿主映射文件、去重依赖文件和公共映射文件,编译得到依赖于宿主SDK和公共插件的功能插件。
生成模块304,用于根据宿主SDK、公共插件和功能插件,生成目标SDK。
图8是根据一示例性实施例示出的另一种SDK的生成装置的框图,如图8所示,第二编译模块302可以包括:
第一检查子模块3021,用于根据公共依赖关系确定公共插件所依赖的代码、资源。根据公共插件的代码、资源和公共插件所依赖的代码、资源,进行编译检查。
第一确定子模块3022,用于在公共插件所依赖的代码、资源中,去除与宿主依赖文件匹配的代码、资源,以得到公共去重代码,和公共去重资源。在公共依赖关系中,去除与宿主依赖文件相同的依赖关系,以得到去重依赖文件。
第二确定子模块3023,用于根据宿主映射文件,确定宿主SDK的混淆规则。
第一编译子模块3024,用于对公共插件的代码、资源、公共去重代码,和公共去重资源进行编译,并利用宿主SDK的混淆规则进行增量混淆,以得到公共插件和公共映射文件。
图9是根据一示例性实施例示出的另一种SDK的生成装置的框图,如图9所示,第三编译模块303可以包括:
第二检查子模块3031,用于根据功能依赖关系确定功能插件所依赖的代码、资源。根据功能插件的代码、资源和功能插件所依赖的代码、资源,进行编译检查。
第三确定子模块3032,用于在功能插件所依赖的代码、资源中,去除与宿主依赖文件、去重依赖文件匹配的代码、资源,以得到功能去重代码,和功能去重资源。
第四确定子模块3033,用于根据宿主映射文件、公共映射文件,确定宿主SDK的混淆规则、公共插件的混淆规则。
第二编译子模块3034,用于对功能插件的代码、资源、功能去重代码,和功能去重资源进行编译,并利用宿主SDK的混淆规则、公共插件的混淆规则进行增量混淆,以得到功能插件。
在一种实现方式中,第二编译子模块3034可以用于执行以下步骤:
步骤1)在执行对功能插件的资源和功能去重资源进行编译的编译任务时,指定公共插件包括的资源文件的路径,并将编译任务的包名修改公共插件的包名。
步骤2)将编译任务生成的资源文件中记载的包名修改为功能插件的包名。
步骤3)对功能插件的代码和功能去重代码进行编译,以得到功能插件。
在另一种实现方式中,第二编译子模块3034还可以用于执行以下步骤:
步骤4)在对功能插件的代码和功能去重代码进行编译之前,将公共插件包括的第一R文件和编译任务生成的第二R文件进行合并,以得到第三R文件。
相应的,步骤3)的实现方式可以为:
根据第三R文件,对功能插件的代码和功能去重代码进行编译。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
综上所述,本公开首先编译得到宿主SDK,并获取宿主SDK的宿主依赖文件和宿主映射文件。之后,根据宿主依赖文件和宿主映射文件,编译得到依赖于宿主SDK的公共插件,同时获取公共插件的去重依赖文件和公共映射文件,其中,通过在公共依赖关系中去除与宿主依赖文件相同的依赖关系得到去重依赖文件。再根据宿主依赖文件、宿主映射文件、去重依赖文件和公共映射文件,编译得到依赖于宿主SDK和公共插件的功能插件。最后,根据宿主SDK、公共插件和功能插件,生成目标SDK。本公开能够将目标SDK自动拆分为宿主SDK、公共插件、功能插件分别进行编译,在不增加额外开发工作量的前提下,能够有效减少功能插件的体积,优化目标SDK的结构。
图10是根据一示例性实施例示出的一种SDK的自升级装置的框图,如图10所示,该装置400应用于根据上述SDK的生成方法生成的目标SDK,可以包括:
第一更新模块401,用于根据宿主依赖文件、宿主映射文件、去重依赖文件、公共映射文件,以及更新后的功能插件的代码、资源,编译得到更新后的功能插件。
发送模块402,用于将更新后的功能插件发送至目标SDK,以更新目标SDK。
图11是根据一示例性实施例示出的另一种SDK的自升级装置的框图,如图11所示,功能插件包括标识信息,标识信息用于标识所依赖的公共插件的版本号。该装置400还可以包括:
第二更新模块403,用于根据宿主依赖文件、宿主映射文件,以及更新后的公共插件的代码、资源,编译得到更新后的公共插件。
发送模块402,还用于在检测到更新指令时,将更新后的公共插件发送至目标SDK,以更新目标SDK,更新指令为在应用程序通过目标SDK加载功能插件的情况下,根据功能插件的标识信息,和目标SDK加载的公共插件的版本号,确定目标SDK加载的公共插件需要更新时触发的。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
综上所述,本公开在目标SDK包括了宿主SDK、公共插件和功能插件的基础上,能够根据宿主依赖文件、宿主映射文件、去重依赖文件、公共映射文件,以及更新后的功能插件的代码、资源,编译得到更新后的功能插件,从而将更新后的功能插件发送至目标SDK,以更新目标SDK。其中,通过在公共依赖关系中去除与宿主依赖文件相同的依赖关系得到去重依赖文件。本公开在将目标SDK自动拆分为宿主SDK、公共插件、功能插件的基础上,能够单独更新小体积的功能插件,减少了更新消耗的流量,从而提高更新的成功率。
下面参考图12,其示出了适于用来实现本公开实施例的电子设备(即上述SDK的生成方法、自升级方法的执行主体,可以是终端设备,也可以是服务器)500的结构示意图。本公开实施例中的终端设备可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、PDA(个人数字助理)、PAD(平板电脑)、PMP(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字TV、台式计算机等等的固定终端。图12示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图12所示,电子设备500可以包括处理装置(例如中央处理器、图形处理器等)501,其可以根据存储在只读存储器(ROM)502中的程序或者从存储装置508加载到随机访问存储器(RAM)503中的程序而执行各种适当的动作和处理。在RAM 503中,还存储有电子设备500操作所需的各种程序和数据。处理装置501、ROM 502以及RAM 503通过总线504彼此相连。输入/输出(I/O)接口505也连接至总线504。
通常,以下装置可以连接至I/O接口505:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置506;包括例如液晶显示器(LCD)、扬声器、振动器等的输出装置507;包括例如磁带、硬盘等的存储装置508;以及通信装置509。通信装置509可以允许电子设备500与其他设备进行无线或有线通信以交换数据。虽然图12示出了具有各种装置的电子设备500,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。
特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在非暂态计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置509从网络上被下载和安装,或者从存储装置508被安装,或者从ROM 502被安装。在该计算机程序被处理装置501执行时,执行本公开实施例的方法中限定的上述功能。
需要说明的是,本公开上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、RF(射频)等等,或者上述的任意合适的组合。
在一些实施方式中,终端设备、服务器可以利用诸如HTTP(HyperText TransferProtocol,超文本传输协议)之类的任何当前已知或未来研发的网络协议进行通信,并且可以与任意形式或介质的数字数据通信(例如,通信网络)互连。通信网络的示例包括局域网(“LAN”),广域网(“WAN”),网际网(例如,互联网)以及端对端网络(例如,ad hoc端对端网络),以及任何当前已知或未来研发的网络。
上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。
上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备:编译得到宿主SDK,并获取所述宿主SDK的宿主依赖文件和宿主映射文件;根据所述宿主依赖文件和所述宿主映射文件,编译得到依赖于所述宿主SDK的公共插件,并获取所述公共插件的去重依赖文件和公共映射文件,所述去重依赖文件为在公共依赖关系中去除与所述宿主依赖文件相同的依赖关系得到的;根据所述宿主依赖文件、所述宿主映射文件、所述去重依赖文件和所述公共映射文件,编译得到依赖于所述宿主SDK和所述公共插件的功能插件;根据所述宿主SDK、所述公共插件和所述功能插件,生成目标SDK。
或者,上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备:根据所述宿主依赖文件、所述宿主映射文件、所述去重依赖文件、所述公共映射文件,以及更新后的所述功能插件的代码、资源,编译得到更新后的所述功能插件;将更新后的所述功能插件发送至所述目标SDK,以更新所述目标SDK。
可以以一种或多种程序设计语言或其组合来编写用于执行本公开的操作的计算机程序代码,上述程序设计语言包括但不限于面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言——诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)——连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本公开实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。其中,模块的名称在某种情况下并不构成对该模块本身的限定,例如,第一编译模块还可以被描述为“编译宿主编译对象的模块”。
本文中以上描述的功能可以至少部分地由一个或多个硬件逻辑部件来执行。例如,非限制性地,可以使用的示范类型的硬件逻辑部件包括:现场可编程门阵列(FPGA)、专用集成电路(ASIC)、专用标准产品(ASSP)、片上系统(SOC)、复杂可编程逻辑设备(CPLD)等等。
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦除可编程只读存储器(EPROM或快闪存储器)、光纤、便捷式紧凑盘只读存储器(CD-ROM)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
根据本公开的一个或多个实施例,示例1提供了一种SDK的生成方法,包括:编译得到宿主SDK,并获取所述宿主SDK的宿主依赖文件和宿主映射文件;根据所述宿主依赖文件和所述宿主映射文件,编译得到依赖于所述宿主SDK的公共插件,并获取所述公共插件的去重依赖文件和公共映射文件,所述去重依赖文件为在公共依赖关系中去除与所述宿主依赖文件相同的依赖关系得到的;根据所述宿主依赖文件、所述宿主映射文件、所述去重依赖文件和所述公共映射文件,编译得到依赖于所述宿主SDK和所述公共插件的功能插件;根据所述宿主SDK、所述公共插件和所述功能插件,生成目标SDK。
根据本公开的一个或多个实施例,示例2提供了示例1的方法,所述根据所述宿主依赖文件和所述宿主映射文件,编译得到依赖于所述宿主SDK的公共插件,并获取所述公共插件的重依赖文件和公共映射文件,包括:根据所述公共依赖关系确定所述公共插件所依赖的代码、资源;根据所述公共插件的代码、资源和所述公共插件所依赖的代码、资源,进行编译检查;在所述公共插件所依赖的代码、资源中,去除与所述宿主依赖文件匹配的代码、资源,以得到公共去重代码,和公共去重资源;在所述公共依赖关系中,去除与所述宿主依赖文件相同的依赖关系,以得到所述去重依赖文件;根据所述宿主映射文件,确定所述宿主SDK的混淆规则;对所述公共插件的代码、资源、所述公共去重代码,和所述公共去重资源进行编译,并利用所述宿主SDK的混淆规则进行增量混淆,以得到所述公共插件和所述公共映射文件。
根据本公开的一个或多个实施例,示例3提供了示例1的方法,所述根据所述宿主依赖文件、所述宿主映射文件、所述去重依赖文件和所述公共映射文件,编译得到依赖于所述宿主SDK和所述公共插件的功能插件,包括:根据功能依赖关系确定所述功能插件所依赖的代码、资源;根据所述功能插件的代码、资源和所述功能插件所依赖的代码、资源,进行编译检查;在所述功能插件所依赖的代码、资源中,去除与所述宿主依赖文件、所述去重依赖文件匹配的代码、资源,以得到功能去重代码,和功能去重资源;根据所述宿主映射文件、所述公共映射文件,确定所述宿主SDK的混淆规则、所述公共插件的混淆规则;对所述功能插件的代码、资源、所述功能去重代码,和所述功能去重资源进行编译,并利用所述宿主SDK的混淆规则、所述公共插件的混淆规则进行增量混淆,以得到所述功能插件。
根据本公开的一个或多个实施例,示例4提供了示例3的方法,所述对所述功能插件的代码、资源、所述功能去重代码,和所述功能去重资源进行编译,包括:在执行对所述功能插件的资源和所述功能去重资源进行编译的编译任务时,指定所述公共插件包括的资源文件的路径,并将所述编译任务的包名修改所述公共插件的包名;将所述编译任务生成的资源文件中记载的包名修改为所述功能插件的包名;对所述功能插件的代码和所述功能去重代码进行编译,以得到所述功能插件。
根据本公开的一个或多个实施例,示例5提供了示例4的方法,在所述对所述功能插件的代码和所述功能去重代码进行编译之前,所述对所述功能插件的代码、资源、所述功能去重代码,和所述功能去重资源进行编译,还包括:将所述公共插件包括的第一R文件和所述编译任务生成的第二R文件进行合并,以得到第三R文件;所述对所述功能插件的代码和所述功能去重代码进行编译,包括:根据所述第三R文件,对所述功能插件的代码和所述功能去重代码进行编译。
根据本公开的一个或多个实施例,示例6提供了一种SDK的自升级方法,应用于根据示例1-5的方法生成的所述目标SDK,包括:根据所述宿主依赖文件、所述宿主映射文件、所述去重依赖文件、所述公共映射文件,以及更新后的所述功能插件的代码、资源,编译得到更新后的所述功能插件;将更新后的所述功能插件发送至所述目标SDK,以更新所述目标SDK。
根据本公开的一个或多个实施例,示例7提供了示例6的方法,所述功能插件包括标识信息,所述标识信息用于标识所依赖的所述公共插件的版本号;所述方法还包括:根据所述宿主依赖文件、所述宿主映射文件,以及更新后的所述公共插件的代码、资源,编译得到更新后的所述公共插件;在检测到更新指令时,将更新后的所述公共插件发送至所述目标SDK,以更新所述目标SDK,所述更新指令为在应用程序通过所述目标SDK加载所述功能插件的情况下,根据所述功能插件的所述标识信息,和所述目标SDK加载的所述公共插件的版本号,确定所述目标SDK加载的所述公共插件需要更新时触发的。
根据本公开的一个或多个实施例,示例8提供了一种SDK的生成装置,包括:第一编译模块,用于编译得到宿主SDK,并获取所述宿主SDK的宿主依赖文件和宿主映射文件;第二编译模块,用于根据所述宿主依赖文件和所述宿主映射文件,编译得到依赖于所述宿主SDK的公共插件,并获取所述公共插件的去重依赖文件和公共映射文件,所述去重依赖文件为在公共依赖关系中去除与所述宿主依赖文件相同的依赖关系得到的;第三编译模块,用于根据所述宿主依赖文件、所述宿主映射文件、所述去重依赖文件和所述公共映射文件,编译得到依赖于所述宿主SDK和所述公共插件的功能插件;生成模块,用于根据所述宿主SDK、所述公共插件和所述功能插件,生成目标SDK。
根据本公开的一个或多个实施例,示例9提供了一种SDK的自升级装置,应用于根据示例1-5的方法生成的所述目标SDK,包括:第一更新模块,用于根据所述宿主依赖文件、所述宿主映射文件、所述去重依赖文件、所述公共映射文件,以及更新后的所述功能插件的代码、资源,编译得到更新后的所述功能插件;发送模块,用于将更新后的所述功能插件发送至所述目标SDK,以更新所述目标SDK。
根据本公开的一个或多个实施例,示例10提供了一种计算机可读介质,其上存储有计算机程序,该程序被处理装置执行时实现示例1至示例7中所述方法的步骤。
根据本公开的一个或多个实施例,示例11提供了一种电子设备,包括:存储装置,其上存储有计算机程序;处理装置,用于执行所述存储装置中的所述计算机程序,以实现示例1至示例7中所述方法的步骤。
以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的公开范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述公开构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
此外,虽然采用特定次序描绘了各操作,但是这不应当理解为要求这些操作以所示出的特定次序或以顺序次序执行来执行。在一定环境下,多任务和并行处理可能是有利的。同样地,虽然在上面论述中包含了若干具体实现细节,但是这些不应当被解释为对本公开的范围的限制。在单独的实施例的上下文中描述的某些特征还可以组合地实现在单个实施例中。相反地,在单个实施例的上下文中描述的各种特征也可以单独地或以任何合适的子组合的方式实现在多个实施例中。
尽管已经采用特定于结构特征和/或方法逻辑动作的语言描述了本主题,但是应当理解所附权利要求书中所限定的主题未必局限于上面描述的特定特征或动作。相反,上面所描述的特定特征和动作仅仅是实现权利要求书的示例形式。关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。

Claims (11)

1.一种SDK的生成方法,其特征在于,所述方法包括:
编译得到宿主SDK,并获取所述宿主SDK的宿主依赖文件和宿主映射文件;
根据所述宿主依赖文件和所述宿主映射文件,编译得到依赖于所述宿主SDK的公共插件,并获取所述公共插件的去重依赖文件和公共映射文件,所述去重依赖文件为在公共依赖关系中去除与所述宿主依赖文件相同的依赖关系得到的;
根据所述宿主依赖文件、所述宿主映射文件、所述去重依赖文件和所述公共映射文件,编译得到依赖于所述宿主SDK和所述公共插件的功能插件;
根据所述宿主SDK、所述公共插件和所述功能插件,生成目标SDK。
2.根据权利要求1所述的方法,其特征在于,所述根据所述宿主依赖文件和所述宿主映射文件,编译得到依赖于所述宿主SDK的公共插件,并获取所述公共插件的去重依赖文件和公共映射文件,包括:
根据所述公共依赖关系确定所述公共插件所依赖的代码、资源;
根据所述公共插件的代码、资源和所述公共插件所依赖的代码、资源,进行编译检查;
在所述公共插件所依赖的代码、资源中,去除与所述宿主依赖文件匹配的代码、资源,以得到公共去重代码,和公共去重资源;
在所述公共依赖关系中,去除与所述宿主依赖文件相同的依赖关系,以得到所述去重依赖文件;
根据所述宿主映射文件,确定所述宿主SDK的混淆规则;
对所述公共插件的代码、资源、所述公共去重代码,和所述公共去重资源进行编译,并利用所述宿主SDK的混淆规则进行增量混淆,以得到所述公共插件和所述公共映射文件。
3.根据权利要求1所述的方法,其特征在于,所述根据所述宿主依赖文件、所述宿主映射文件、所述去重依赖文件和所述公共映射文件,编译得到依赖于所述宿主SDK和所述公共插件的功能插件,包括:
根据功能依赖关系确定所述功能插件所依赖的代码、资源;
根据所述功能插件的代码、资源和所述功能插件所依赖的代码、资源,进行编译检查;
在所述功能插件所依赖的代码、资源中,去除与所述宿主依赖文件、所述去重依赖文件匹配的代码、资源,以得到功能去重代码,和功能去重资源;
根据所述宿主映射文件、所述公共映射文件,确定所述宿主SDK的混淆规则、所述公共插件的混淆规则;
对所述功能插件的代码、资源、所述功能去重代码,和所述功能去重资源进行编译,并利用所述宿主SDK的混淆规则、所述公共插件的混淆规则进行增量混淆,以得到所述功能插件。
4.根据权利要求3所述的方法,其特征在于,所述对所述功能插件的代码、资源、所述功能去重代码,和所述功能去重资源进行编译,包括:
在执行对所述功能插件的资源和所述功能去重资源进行编译的编译任务时,指定所述公共插件包括的资源文件的路径,并将所述编译任务的包名修改所述公共插件的包名;
将所述编译任务生成的资源文件中记载的包名修改为所述功能插件的包名;
对所述功能插件的代码和所述功能去重代码进行编译,以得到所述功能插件。
5.根据权利要求4所述的方法,其特征在于,在所述对所述功能插件的代码和所述功能去重代码进行编译之前,所述对所述功能插件的代码、资源、所述功能去重代码,和所述功能去重资源进行编译,还包括:
将所述公共插件包括的第一R文件和所述编译任务生成的第二R文件进行合并,以得到第三R文件;
所述对所述功能插件的代码和所述功能去重代码进行编译,包括:
根据所述第三R文件,对所述功能插件的代码和所述功能去重代码进行编译。
6.一种SDK的自升级方法,其特征在于,应用于根据权利要求1-5中任一项所述SDK的生成方法生成的所述目标SDK;
所述方法包括:
根据所述宿主依赖文件、所述宿主映射文件、所述去重依赖文件、所述公共映射文件,以及更新后的所述功能插件的代码、资源,编译得到更新后的所述功能插件;
将更新后的所述功能插件发送至所述目标SDK,以更新所述目标SDK。
7.根据权利要求6所述的方法,其特征在于,所述功能插件包括标识信息,所述标识信息用于标识所依赖的所述公共插件的版本号;
所述方法还包括:
根据所述宿主依赖文件、所述宿主映射文件,以及更新后的所述公共插件的代码、资源,编译得到更新后的所述公共插件;
在检测到更新指令时,将更新后的所述公共插件发送至所述目标SDK,以更新所述目标SDK,所述更新指令为在应用程序通过所述目标SDK加载所述功能插件的情况下,根据所述功能插件的所述标识信息,和所述目标SDK加载的所述公共插件的版本号,确定所述目标SDK加载的所述公共插件需要更新时触发的。
8.一种SDK的生成装置,其特征在于,所述装置包括:
第一编译模块,用于编译得到宿主SDK,并获取所述宿主SDK的宿主依赖文件和宿主映射文件;
第二编译模块,用于根据所述宿主依赖文件和所述宿主映射文件,编译得到依赖于所述宿主SDK的公共插件,并获取所述公共插件的去重依赖文件和公共映射文件,所述去重依赖文件为在公共依赖关系中去除与所述宿主依赖文件相同的依赖关系得到的;
第三编译模块,用于根据所述宿主依赖文件、所述宿主映射文件、所述去重依赖文件和所述公共映射文件,编译得到依赖于所述宿主SDK和所述公共插件的功能插件;
生成模块,用于根据所述宿主SDK、所述公共插件和所述功能插件,生成目标SDK。
9.一种SDK的自升级装置,其特征在于,应用于根据权利要求1-5中任一项所述SDK的生成方法生成的所述目标SDK;
所述装置包括:
第一更新模块,用于根据所述宿主依赖文件、所述宿主映射文件、所述去重依赖文件、所述公共映射文件,以及更新后的所述功能插件的代码、资源,编译得到更新后的所述功能插件;
发送模块,用于将更新后的所述功能插件发送至所述目标SDK,以更新所述目标SDK。
10.一种计算机可读介质,其上存储有计算机程序,其特征在于,该程序被处理装置执行时实现权利要求1-5,或者6-7中任一项所述方法的步骤。
11.一种电子设备,其特征在于,包括:
存储装置,其上存储有计算机程序;
处理装置,用于执行所述存储装置中的所述计算机程序,以实现权利要求1-5,或者6-7中任一项所述方法的步骤。
CN202110726857.1A 2021-06-29 2021-06-29 Sdk的生成和自升级方法、装置、可读介质和设备 Active CN113407165B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110726857.1A CN113407165B (zh) 2021-06-29 2021-06-29 Sdk的生成和自升级方法、装置、可读介质和设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110726857.1A CN113407165B (zh) 2021-06-29 2021-06-29 Sdk的生成和自升级方法、装置、可读介质和设备

Publications (2)

Publication Number Publication Date
CN113407165A true CN113407165A (zh) 2021-09-17
CN113407165B CN113407165B (zh) 2023-04-07

Family

ID=77680101

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110726857.1A Active CN113407165B (zh) 2021-06-29 2021-06-29 Sdk的生成和自升级方法、装置、可读介质和设备

Country Status (1)

Country Link
CN (1) CN113407165B (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023202299A1 (zh) * 2022-04-20 2023-10-26 北京字跳网络技术有限公司 一种sdk升级方法、装置以及计算机设备
WO2023207418A1 (zh) * 2022-04-26 2023-11-02 北京字跳网络技术有限公司 一种sdk升级方法、装置以及计算机设备

Citations (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050192917A1 (en) * 2004-02-03 2005-09-01 Jedidia Lubbers Helpset build system and method
US20080072211A1 (en) * 2006-09-20 2008-03-20 Rothman Michael A Method and system for firmware image size reduction
US20100153920A1 (en) * 2008-12-17 2010-06-17 Michael Stavros Bonnet Method for building and packaging sofware
US20150248288A1 (en) * 2014-02-28 2015-09-03 Red Hat, Inc. Compiled file normalization
CN106155724A (zh) * 2015-04-14 2016-11-23 阿里巴巴集团控股有限公司 一种升级方法及装置
CN107168749A (zh) * 2017-05-31 2017-09-15 腾讯科技(深圳)有限公司 一种编译方法、装置、设备和计算机可读存储介质
CN108052314A (zh) * 2017-12-26 2018-05-18 无线生活(杭州)信息科技有限公司 一种基于Gradle的插件打包的方法及装置
US20180165080A1 (en) * 2016-12-09 2018-06-14 Vmware, Inc. Methods and apparatus to reduce application deployments sizes
US20180181482A1 (en) * 2016-12-22 2018-06-28 SafeDK Mobile Ltd. Monitoring Activity of Software Development Kits Using Stack Trace Analysis
CN108536444A (zh) * 2018-02-26 2018-09-14 平安普惠企业管理有限公司 插件编译方法、装置、计算机设备和存储介质
CN110221877A (zh) * 2019-06-12 2019-09-10 北京字节跳动网络技术有限公司 一种应用程序的运行方法、装置、电子设备、及存储介质
CN110308945A (zh) * 2019-05-22 2019-10-08 百度在线网络技术(北京)有限公司 插件的动态加载方法和装置
US20200110593A1 (en) * 2017-09-06 2020-04-09 Alibaba Group Holding Limited Method, apparatus, and device for processing web application package
CN111427579A (zh) * 2019-01-09 2020-07-17 北京京东尚科信息技术有限公司 插件、应用程序实现方法及系统和计算机系统及存储介质
CN111562928A (zh) * 2020-04-28 2020-08-21 北京字节跳动网络技术有限公司 资源提供方法及装置、资源下载方法及装置
CN111831316A (zh) * 2020-07-21 2020-10-27 北京字节跳动网络技术有限公司 一种软件开发包更新方法及装置
CN112182199A (zh) * 2020-09-10 2021-01-05 中信银行股份有限公司 一种依赖包推荐方法、装置、电子设备和可读存储介质
US20210019132A1 (en) * 2019-07-15 2021-01-21 International Business Machines Corporation Quantum software developer kit and framework
CN112379885A (zh) * 2020-11-19 2021-02-19 北京百度网讯科技有限公司 小程序编译方法、装置、设备及可读存储介质
CN112650521A (zh) * 2020-12-28 2021-04-13 北京字节跳动网络技术有限公司 软件开发工具包sdk热修复方法、装置与电子设备
WO2021124367A1 (en) * 2019-12-17 2021-06-24 Epiphany Srl Procedure and apparatus for configuring and deploying software packages of a digital banking system

Patent Citations (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20050192917A1 (en) * 2004-02-03 2005-09-01 Jedidia Lubbers Helpset build system and method
US20080072211A1 (en) * 2006-09-20 2008-03-20 Rothman Michael A Method and system for firmware image size reduction
US20100153920A1 (en) * 2008-12-17 2010-06-17 Michael Stavros Bonnet Method for building and packaging sofware
US20150248288A1 (en) * 2014-02-28 2015-09-03 Red Hat, Inc. Compiled file normalization
CN106155724A (zh) * 2015-04-14 2016-11-23 阿里巴巴集团控股有限公司 一种升级方法及装置
US20180165080A1 (en) * 2016-12-09 2018-06-14 Vmware, Inc. Methods and apparatus to reduce application deployments sizes
US20180181482A1 (en) * 2016-12-22 2018-06-28 SafeDK Mobile Ltd. Monitoring Activity of Software Development Kits Using Stack Trace Analysis
CN107168749A (zh) * 2017-05-31 2017-09-15 腾讯科技(深圳)有限公司 一种编译方法、装置、设备和计算机可读存储介质
US20200110593A1 (en) * 2017-09-06 2020-04-09 Alibaba Group Holding Limited Method, apparatus, and device for processing web application package
CN108052314A (zh) * 2017-12-26 2018-05-18 无线生活(杭州)信息科技有限公司 一种基于Gradle的插件打包的方法及装置
CN108536444A (zh) * 2018-02-26 2018-09-14 平安普惠企业管理有限公司 插件编译方法、装置、计算机设备和存储介质
CN111427579A (zh) * 2019-01-09 2020-07-17 北京京东尚科信息技术有限公司 插件、应用程序实现方法及系统和计算机系统及存储介质
CN110308945A (zh) * 2019-05-22 2019-10-08 百度在线网络技术(北京)有限公司 插件的动态加载方法和装置
CN110221877A (zh) * 2019-06-12 2019-09-10 北京字节跳动网络技术有限公司 一种应用程序的运行方法、装置、电子设备、及存储介质
US20210019132A1 (en) * 2019-07-15 2021-01-21 International Business Machines Corporation Quantum software developer kit and framework
WO2021124367A1 (en) * 2019-12-17 2021-06-24 Epiphany Srl Procedure and apparatus for configuring and deploying software packages of a digital banking system
CN111562928A (zh) * 2020-04-28 2020-08-21 北京字节跳动网络技术有限公司 资源提供方法及装置、资源下载方法及装置
CN111831316A (zh) * 2020-07-21 2020-10-27 北京字节跳动网络技术有限公司 一种软件开发包更新方法及装置
CN112182199A (zh) * 2020-09-10 2021-01-05 中信银行股份有限公司 一种依赖包推荐方法、装置、电子设备和可读存储介质
CN112379885A (zh) * 2020-11-19 2021-02-19 北京百度网讯科技有限公司 小程序编译方法、装置、设备及可读存储介质
CN112650521A (zh) * 2020-12-28 2021-04-13 北京字节跳动网络技术有限公司 软件开发工具包sdk热修复方法、装置与电子设备

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023202299A1 (zh) * 2022-04-20 2023-10-26 北京字跳网络技术有限公司 一种sdk升级方法、装置以及计算机设备
WO2023207418A1 (zh) * 2022-04-26 2023-11-02 北京字跳网络技术有限公司 一种sdk升级方法、装置以及计算机设备

Also Published As

Publication number Publication date
CN113407165B (zh) 2023-04-07

Similar Documents

Publication Publication Date Title
CN110502222B (zh) 外发依赖内部基础库的aar方法、装置、介质和设备
CN113407165B (zh) Sdk的生成和自升级方法、装置、可读介质和设备
CN110764748B (zh) 代码调用方法、装置、终端及存储介质
WO2022105563A1 (zh) 索引文件生成方法、终端设备、电子设备及介质
WO2022135547A1 (zh) 业务运行方法、装置、电子设备和计算机存储介质
CN111400068B (zh) 接口的控制方法、装置、可读介质和电子设备
CN114595065A (zh) 数据获取方法、装置、存储介质以及电子设备
US20240095022A1 (en) Hotfix method, apparatus, device and storage medium
CN110928571A (zh) 业务程序开发方法和装置
CN112416303B (zh) 软件开发工具包热修复方法、装置及电子设备
CN111309304A (zh) 一种生成idl文件的方法、装置、介质和电子设备
CN111506904B (zh) 漏洞在线修复的方法和装置
CN110704050B (zh) 模块初始化方法、装置、电子设备及计算机可读存储介质
CN111752644A (zh) 接口模拟方法、装置、设备及存储介质
CN113391860A (zh) 服务请求处理方法、装置、电子设备及计算机存储介质
CN111240801A (zh) 生成堆内存快照文件的方法、装置、介质和电子设备
CN113448585B (zh) 一种线程池的编译方法、装置、电子设备和存储介质
CN114860213A (zh) 一种应用程序包生成方法、装置、设备及介质
CN111796865B (zh) 一种字节码文件修改方法、装置、终端设备及介质
CN111274551A (zh) 基于编译器的java代码保护方法、装置及电子设备
CN111240657A (zh) 用于生成sdk的方法、装置和电子设备
CN111625232B (zh) 应用程序安装包的生成方法、装置、可读介质和电子设备
CN111310175A (zh) 基于插件化的iOS应用安全监测与防护方法及装置
CN111240738B (zh) 文件处理方法、装置、设备及介质
CN112015394B (zh) 安卓功能模块开发方法和装置、计算机系统和存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
CB02 Change of applicant information
CB02 Change of applicant information

Address after: 100041 B-0035, 2 floor, 3 building, 30 Shixing street, Shijingshan District, Beijing.

Applicant after: Douyin Vision Co.,Ltd.

Address before: 100041 B-0035, 2 floor, 3 building, 30 Shixing street, Shijingshan District, Beijing.

Applicant before: Tiktok vision (Beijing) Co.,Ltd.

Address after: 100041 B-0035, 2 floor, 3 building, 30 Shixing street, Shijingshan District, Beijing.

Applicant after: Tiktok vision (Beijing) Co.,Ltd.

Address before: 100041 B-0035, 2 floor, 3 building, 30 Shixing street, Shijingshan District, Beijing.

Applicant before: BEIJING BYTEDANCE NETWORK TECHNOLOGY Co.,Ltd.

GR01 Patent grant
GR01 Patent grant