CN111061638A - 一种iOS系统调试的方法、装置及服务器 - Google Patents
一种iOS系统调试的方法、装置及服务器 Download PDFInfo
- Publication number
- CN111061638A CN111061638A CN201911299694.2A CN201911299694A CN111061638A CN 111061638 A CN111061638 A CN 111061638A CN 201911299694 A CN201911299694 A CN 201911299694A CN 111061638 A CN111061638 A CN 111061638A
- Authority
- CN
- China
- Prior art keywords
- source code
- library
- local source
- dynamic library
- static
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3624—Software debugging by performing operations on the source code, e.g. via a compiler
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开一种iOS系统调试的方法、装置及服务器,目的在于寻找有效的动态库、静态库的调试的实现方案,其方法包括如下步骤:基于远程服务器中存储的远程源码在私有服务器中创建本地源码信息并存储本地源码;调用本地源码构建静态库、动态库,存储静态库、动态库至私有服务器中并配置调用命令;将静态库、动态库与本地源码关联,以根据调用命令编译调试静态库、动态库。本发明基于Git的特性、DSL语言的可注入性以及iOS编译中间产物的特性,实现了从远端源码到本地管理,可以在本地源码、静态库、动态库之间快速切换以及实现了静态库、动态库调试编译,且具有较好的移植性,在一定程度上提高了开发效率。
Description
技术领域
本发明涉及调试领域,具体而言,本发明涉及一种iOS系统调试的方法、装置及服务器。
背景技术
iOS是由苹果公司开发的移动操作系统。它主要是给iPhone、iPod touch以及iPad使用。就像其基于的Mac OS X操作系统一样,它也是以Darwin为基础的。iOS的系统架构分为四个层次:核心操作系统层、核心服务层、媒体层以及可轻触层。
在iOS的应用开发中使用的是Objective-C语言和Swift语言,其中,
Objective-C语言是C语言的严格超集,任何C语言程序不经修改就可以直接通过Objective-C编译器,在Objective-C中使用C语言代码也是完全合法的。Objective-C被描述为盖在C语言上的薄薄一层,因为Objective-C的原意就是在C语言主体上加入面向对象的特性。Objective-C通过提供类定义,方法以及属性的语法,还有其他可以提高类的动态扩展能力的结构等,扩展了标准的ANSI C语言;
Swift语言是苹果公司于2014年在苹果全球开发者大会发布的新开发语言,可与Objective-C语言共同运行于MAC OS和iOS平台,用于搭建基于苹果平台的应用程序。Swift语言是一款易学易用的编程语言,而且它还是第一套具有与脚本语言同样的表现力和趣味性的系统编程语言。
Objective-C语言和Swift语言都是一种编译语言。编译语言在执行的时候,必须先通过编译器生成机器码,机器码可以直接在处理器上执行,所以执行效率较高。
编译器的本质就是把一种编程语言转换为另一种编程语言的程序。在大多数编译器由两部分组成:前端和后端,其中,前端负责词法分析,语法分析,生成中间代码;后端以中间代码作为输入,进行行架构无关的代码优化,接着针对不同架构生成不同的机器码。在iOS编译器中,前后端依赖统一格式的中间代码(IntermediateRepresentation,简称IR),使得前后端可以独立的变化,这样,新增一门语言只需要修改前端,而新增一个处理器架构只需要修改后端即可。在实际开发过程中,Objective C语言使用的编译器前端是clang,Swift语言是Swift,而两者的后端都是LLVM,其中,clang是C语言家族的编译器前端,诞生之初是为了替代GCC,提供更快的编译速度。LLVM是以C++编写而成,用于优化以任意程序语言编写的程序的编译时间、关联时间、运行时间以及空闲时间,对开发者保持开放,并兼容已有脚本。
在大型iOS客户端项目发中,随着业务需求的增长,通常会根据业务模块、功能层次将项目划分为多个独立的模块,每个模块使用独立的Git服务器管理,其中,Git服务器是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。但是,由于iOS依赖的Git服务器不在国内,现有的流程需要经历,仓库依赖检查、代码仓库源码下载、本地代码缓存管理、本地代码版本管理、构建iOS可执行项目、编译关联源文件、可执行文件签名、执行等繁多的流程,大型项目中上述的每一步都要经历很长的时间。
通常每个Git服务器中的iOS模块会使用pod DSL语法来明确对其他模块依赖,这些依赖是通过发布到pod仓库的,同时每个模块自身也是一个依赖项,每次模块代码改动后,需要修改模块的版本号,重新编译打包并推送新的二进制代码到远程pod仓库中。由于每个模块是独立仓库、独立声明库的依赖,每个模块的代码更新,都需要更新版本号,如果有其他模块依赖该变动代码的模块,其他模块需要及时更新该模块的最新依赖版本号才能使用到最新的代码。
简单来讲,可以把iOS的代码模块管理理解为一个倒置的树,可执行文件作为根节点去依赖不同的代码仓库,最后通过clang+llvm组成最后的macho成为手机的可执行文件。在编译关联源码文件的中间产物存在两种形态——动态库、静态库,由于iOS平台的显示生成的.framework二进制属于Release版本,与Debug版本不同,动态库、静态库的Release版本是无法进行调试的,这样就严重影响了开发进度。
发明内容
为了寻找有效的动态库、静态库的调试的实现方案,同时考虑到源码在生成静态库、动态库的时候调试信息关联的源码地址可能已经发生了变化而这些调试信息在没有关联成完整的应用程序引用的时候还是保留了,本发明提供了一种iOS系统调试的方法、装置及服务器。
方案一:
提供一种iOS系统调试的方法,所述iOS系统调试的方法包括如下步骤:
基于远程服务器中存储的远程源码在私有服务器中创建本地源码信息并存储本地源码,其中所述本地源码信息包括本地源码及相应的版本;
调用所述本地源码构建静态库、动态库,存储所述静态库、动态库至所述私有服务器中并配置调用命令;
将所述静态库、动态库与所述本地源码关联,以根据所述调用命令编译调试所述静态库、动态库。
优选地,所述将所述静态库、动态库与所述本地源码关联包括如下步骤:
将所述静态库、动态库中引用所述远程源码的路径信息调整为引用所述本地源码的路径信息,以根据所述调用命令调试所述静态库、动态库。
优选地,所述将所述静态库、动态库中引用所述远程源码的路径信息调整为引用所述本地源码的路径信息包括如下步骤:
将Macho文件中包含引用所述远程源码的路径信息的Section段替换为包含引用所述本地源码的路径信息的Section段。
优选地,所述将所述静态库、动态库中引用所述远程源码的路径信息调整为引用所述本地源码的路径信息包括如下步骤:
获取DSYM文件;
将DSYM文件中的包含引用所述远程源码的路径信息的Section段替换为包含引用所述本地源码的路径信息的Section段。
优选地,所述将所述静态库、动态库与所述本地源码关联包括如下步骤:
基于所述静态库、动态库引用所述远程源码的路径信息创建相同的存储路径;
将所述本地源码存储在所述存储路径中,以根据所述调用命令调试所述静态库、动态库。
优选地,所述基于远程服务器中存储的远程源码在私有服务器中创建本地源码并存储包括如下步骤:
通过Git基于远程服务器中存储的远程源码在私有服务器中创建本地源码并存储。
优选地,所述存储所述静态库、动态库至所述私有服务器中并配置调用命令包括如下步骤:
通过DSL hook为所述静态库、动态库配置调用命令。
方案二:
提供一种iOS系统调试的装置,所述iOS系统调试的装置包括:
本地存储模块,用于基于远程服务器中存储的远程源码在私有服务器中创建本地源码信息并存储本地源码,其中所述本地源码信息包括本地源码及相应的版本;
构建配置模块,用于调用所述本地源码构建静态库、动态库,存储所述静态库、动态库至所述私有服务器中并配置调用命令;
关联调试模块,用于将所述静态库、动态库与所述本地源码关联,以根据所述调用命令编译调试所述静态库、动态库。
优选地,所述关联调试模块包括:
调整单元,用于将所述静态库、动态库中引用所述远程源码的路径信息调整为引用所述本地源码的路径信息,以根据所述调用命令调试所述静态库、动态库。
优选地,所述调整单元包括:
第一替换子单元,用于将Macho文件中包含引用所述远程源码的路径信息的Section段替换为包含引用所述本地源码的路径信息的Section段。
优选地,所述调整单元包括:
获取单元,用于获取DSYM文件;
第二替换子单元,用于将DSYM文件中的包含引用所述远程源码的路径信息的Section段替换为包含引用所述本地源码的路径信息的Section段。
优选地,所述关联调试模块包括:
创建单元,用于基于所述静态库、动态库引用所述远程源码的路径信息创建相同的存储路径;
存储单元,用于将所述本地源码存储在所述存储路径中,以根据所述调用命令调试所述静态库、动态库。
优选地,所述本地存储模块包括:
本地存储单元,用于通过Git基于远程服务器中存储的远程源码在私有服务器中创建本地源码并存储。
优选地,所述构建配置模块包括:
配置单元,用于通过DSL hook为所述静态库、动态库配置调用命令。
方案三:
提供一种服务器,所述服务器包括存储器、处理器,所述存储器上存储有在所述处理器上运行的计算机程序,
所述处理器执行如方案一任一项所述的iOS系统调试的方法的步骤。
与现有技术相比,本发明一种iOS系统调试的方法、装置及服务器具有如下有益效果:
本发明一种iOS系统调试的方法、装置及服务器基于Git的特性、DSL语言的可注入性以及iOS编译中间产物的特性,实现了从远端源码到本地管理,可以在本地源码、静态库、动态库之间快速切换以及实现了静态库、动态库调试编译,且具有较好的移植性,在一定程度上提高了开发效率。
本发明提出的上述方案,对现有系统的改动很小,不会影响系统的兼容性,而且实现简单、高效。
本发明附加的方面和优点将在下面的描述中部分给出,这些将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1为本发明实施例提供的一种iOS系统调试的方法的应用场景示意图;
图2为本发明实施例提供的一种iOS系统调试的方法的流程示意图;
图3为本发明实施例提供的一种iOS系统调试的方法中Macho文件结构示意图;
图4为本发明实施例提供的一种iOS系统调试的装置的模块结构示意图。
图中标识说明:
401、本地存储模块;
403、构建配置模块;
405、关联调试模块。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
请参阅图1,本发明实施例一种iOS系统调试的方法应用于iOS开发系统中,在该iOS开发系统中包括远程服务器100以及与远程服务器100连接的本地开发系统20,其中,本地开发系统20包括与远程服务器100连接的私有服务器200以及与私有服务器200连接的至少一台计算器。
示例地,如图1所示,本地开发系统20包括第一计算器202和第一计算器204,其中,第一计算器202、第一计算器204分别与私有服务器200连接。
请参阅图2,下面以本发明实施例一种iOS系统调试的方法应用于如图1所示的iOS开发系统中为例进行解释说明,具体地,本发明实施例一种iOS系统调试的方法包括如下步骤:
步骤S101:基于远程服务器中存储的远程源码在私有服务器中创建本地源码信息并存储本地源码,其中所述本地源码信息包括本地源码及相应的版本。
具体地,基于远程服务器中存储的远程源码在私有服务器中创建本地源码信息并存储本地源码包括如下步骤:
通过Git基于远程服务器中存储的远程源码在私有服务器中创建本地源码并存储。
Git是分布式版本控制系统,没有中央服务器,每个计算器就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在每个计算器上。既然每个计算器都有一个完整的版本库,那多个计算器如何协作呢?比如说某开发人员在计算器上改了文件A,其他开发人员也在计算器上改了文件A,这时,开发人员之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。值得注意的是,与Git不同,集中式版本控制系统(Subversion,简称SVN)的版本库是集中放在中央服务器的,而开发的时候,用的都是自己的计算器,所以首先要从中央服务器哪里得到最新的版本,然后开发,开发后,需要把自己的开发推送到中央服务器。集中式版本控制系统是必须联网才能工作。
在Git中包括三个区——工作区、暂存区以及版本库,其中,
工作区:就是在计算机里能看到的目录;
暂存区:一般存放在″.git目录下″下的索引文件中,因此,暂存区有时也叫作索引。工作区的文件先被增加到这个区域里,再从这个区域提交到版本库;
版本库:工作区有一个隐藏目录.git,这个不是工作区,而是Git的版本库。
在一些实施方式中,私有服务器200通过使用gitolite做权限管理,只允许jenkins操作远程服务器100,并使用git daemon做远程服务器100的映射,所有计算器只有只读权限且无需配置ssh公钥,其中,gitolite是加在Git上的权限控制工具,可以将控制粒度缩小到分支范围内;Jenkins是国际上流行的免费开源软件项目,是基于Java开发持续集成工具,用于监控持续重复的工作,旨在提供一个开放的易用的软件平台,使软件的持续集成变成可能;git daemon是一个TCP Git守护进程,通常在端口上监听,适合只读更新,也即从Git存储库中提取。
需要注意的是,本地源码信息包括本地源码及相应的版本,因此,不仅需要从远程服务器克隆一个一模一样的版本库到私有服务器,复制的是整个版本库,还需要将远程服务器获取到一个分支的更新到私有服务器,并更新私有服务器,在实际调用中,要区分gitclone和git pull,其中,gitclone是远程操作的第一步,通常是从远程服务器克隆一个版本库,而gitpull相当于是从远程服务器获取最新版本并合并到私有服务器。
在一些实施方式中,为了方便管理和调用,在私有服务器上还可以扩展pod相关命令,进行add、delete、remove、list等操作私有服务器的本地源码,在Linux操作系统中进行路径模拟-软连接、挂载、相同路径,区分私有git仓库资源和第三方git仓库资源,同样的可以进行source、podspec、tag、git、path等方式的资源操作。
步骤S103:调用所述本地源码构建静态库、动态库,存储所述静态库、动态库至所述私有服务器中并配置调用命令。
具体地,存储静态库、动态库至私有服务器中并配置调用命令包括如下步骤:
通过DSL hook为静态库、动态库配置调用命令。
领域特定语言(Domain Specific Language,简称DSL)是为了解决某一类任务而专门设计的计算机语言,其与通用编程语言(General Purpose Language,简称GPL)相对,GPL是可以用来编写任意计算机程序的,并且能表达任何的可被计算的逻辑,同时也是图灵完备的。但是DSL并不是图灵完备的,它们的表达能力有限,只是在特定领域解决特定任务的。hook,中文译为“挂钩”或“钩子”,顾名思义,日常生活中,我们的钩子是用来钩住某种东西的,比如,说,鱼钩是用来钓鱼的,一旦鱼咬了钩,钩子就一直钩住鱼了,任凭鱼在水里怎么游,也逃不出鱼钩的控制。同样的,在iOS逆向中是指改变程序运行流程的一种技术。通过hook可以让别人的程序执行自己所写的代码。
示例地,在一种实施方式中,源码、静态库、动态库的资源路径配置:
源码:git://xxx.com:4709/sources/pod_name.git
静态库:git://xxx.com:4709/binarys/pod_name.git
动态库:git://xxx.com:4709/frameworks/pod_name.git
在配置调用指令后可以切换使用:
源码:pod′仓库名称′
静态库:binary_pod′仓库名称′
动态库:framework_pod′仓库名称′
其中,binary_pod和framework_pod是基于DSL hook为静态库、动态库配置调用命令。
步骤S105:将所述静态库、动态库与所述本地源码关联,以根据所述调用命令编译调试所述静态库、动态库。
众所周知,iOS系统在构建过程中存在Macho类型为staticlib、mh_dylib的.framework二进制类型,其中,Macho文件为Mach Object文件格式的缩写,它是一种用于可执行文件。常见的MachO文件包括如下格式:
(1)目标文件:.o
(2)库文件:.a.dylib Framework
(3)可执行文件:dyld.dsym。
请参阅图3,图3示出了Macho文件的文件结构,如图3所示,Macho文件分为三部分结构:Header、Load Commons、Data,其中,
Header是Macho文件的头文件,其包括如下字段:
Load Commands用于指引loader如何设置并加载二进制数据,对系统内核加载器和动态链接器(the dynamic link editor,简称DYLD)起指导作用,其中,DYLD是iOS系统的动态链接器,在系统内核做好程序准备工作之后,交由DYLD负责余下的工作,具体的,在iOS系统中,每个程序依赖的动态库都需要通过DYLD一个一个加载到内存,然而,很多系统库几乎是每个程序都会用到的,如果在每个程序运行的时候都重复的去加载一次,势必造成运行缓慢,为了优化启动速度和提高程序性能,共享缓存机制就应运而生。所有默认的动态链接库被合并成一个大的缓存文件,放到/System/Library/Caches/com.apple.dyld/目录下,按不同的架构保存分别保存着,而且它是开源的,任何人可以通过苹果官网下载它的源码来阅读理解它的运作方式,了解系统加载动态库的细节。
Load Commands是由多个Segment command组成,常见的命令类型如下:
Data包含数据段的具体数据,用于存放存放数据:代码、字符常量、类、方法等。每一个数据段可以有零到多个section,用于定义MachO文件的数据、虚拟地址、文件偏移和内存保护等属性,这些数据在动态链接器加载程序时被映射到了虚拟内存中。
MachO文件的Data区域由Segment段和Section节组成,其中,Segment段的数据结构如下:
cmdsize,Segment段结构体所需要的空间;
segname,Segment段名字;
vmaddr,所描述段的虚拟内存地址;
vmsize,为当前段分配的虚拟内存大小;
fileoff,当前段在文件中的偏移量;
filesize,当前段在文件中占用的字节;
maxprot,段所在页所需要的最高内存保护,用八进制表示;
initprot,段所在页原始内存保护;
nsects,段中Section数量;
flags,标识符。
部分的Segment,特别是TEXT和DATA可以进一步分解为Section,如图3中的Section1_debug_str_backup和Section2_debug_str(new)。一些常见的以下列举一些常见的Section如下:
__text,主程序代码
__stubs,__stub_helper:,用于动态链接的桩
__cstring,程序中c语言字符串
__const,常量
__TEXT,__objc_methname,OC方法名称
__TEXT__objc_methtype,OC方法类型
__TEXT__objc_classname,OC类名
__DATA,__objc_classlist,OC类列表
__DATA,__objc_protollist,OC原型列表
__DATA,__objc_imageinfo,OC镜像信息
__DATA,__objc_const,OC常量
__DATA,__objc_selfrefs,OC类自引用
__DATA,__objc_superrefs,OC类超类引用
__DATA,__objc_protolrefs,OC原型引用
__DATA,__bss,没有初始化和初始化为0的全局变量
需要特别说明的是,在iOS调试中,DWARF是编译程序和调试程序所使用的一种调试文件格式,可以支持源代码级的调试。它是对象文件内的调试信息的格式。程序的DWARF描述是一个树形结构,每个节点都可以有子节点或兄弟节点。节点可能代表类型、变量或函数。
DWARF使用一系列的调试信息条目来定义源码程序的一个低级表示。每个调试信息条目由一个识别标记和一系列属性组成。条目或条目组提供了在源程序中的相应实体的描述。标记指定了条目所属的类,而属性定义了条目的具体特点。
组成DWARF数据的不同DWARF部分如下:
数据列 | 信息说明 |
.debug_loc | 在DW_AT_location属性中使用的位置列表 |
.debug_macinfo | 宏信息 |
.debug_pubnames | 全局对象和函数的查找表 |
.debug_pubtypes | 全球类型的查找表 |
.debug_ranges | 在DW_AT_ranges属性中使用的地址范围 |
.debug_str | 在.debug_info中使用的字符串表 |
.debug_types | 类型描述 |
本发明实施例在使用文本编辑器查看二进制文件,发现里面记录远程源码的路径,同时,相邻处还有XCode的安装目录和部分DEBUG信息。为了具体地确认这些信息所处位置,采用MACHOVIEW继续查看该文件,发现这些信息处于Section(__DWARF,__debug_str)段。
因此,在本发明实施例iOS系统调试的方法中将所述静态库、动态库与本地源码关联包括如下步骤:
将静态库、动态库中引用远程源码的路径信息调整为引用本地源码的路径信息,以根据调用命令调试静态库、动态库。
具体地,考虑到静态库将引用远程源码的路径信息直接保留在了内部的macho文件格__DWARF,__debug_str位置,因此,将静态库、动态库中引用所述远程源码的路径信息调整为引用所述本地源码的路径信息包括如下步骤:
将Macho文件中包含引用远程源码的路径信息的Section段替换为包含引用本地源码的路径信息的Section段。
动态库则保留在了DSYM文件之中,其中,DSYM文件是指具有调试信息的目标文件。这时,将静态库、动态库中引用远程源码的路径信息调整为引用本地源码的路径信息包括如下步骤:
获取DSYM文件;
将DSYM文件中的包含引用远程源码的路径信息的Section段替换为包含引用本地源码的路径信息的Section段。
示例地,在修改Macho文件的section时,可以通过添加编译参数,在`other linkflags`中可以添加如下命令:
-W1,-rename_section,XXX,__DWARF,__debug_str
这样就可以把Section1_debug_str_backup更改为Section2_debug_str(new),也即__debug_str的section进行了更改。
需要说明的是,库的本质是一段编译好的二进制代码,加上头文件就可以供别人使用。静态库和动态库都是二进制代码,区别在于,静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了;而动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。在iOS平台上,静态库的后缀名为.a,动态库的后缀为.dylib,值得注意的是,还可以使用Framework。Framework本质是一种打包方式,将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发。
在一些实施方式中,考虑到路径其实就是一个字符串mac是类Linux系统根目录为:‘/’以及开发用的本地开发系统与远程服务器存储机理相同,因此,也可以在本地开发系统中采用强制模拟的方式进行本地源码的引用,具体地,将静态库、动态库与本地源码关联包括如下步骤:
基于静态库、动态库引用远程源码的路径信息创建相同的存储路径;
将本地源码存储在存储路径中,以根据调用命令调试静态库、动态库。
在一些实施方式中,根据调用命令调试静态库、动态库包括如下步骤:
在静态库、动态库运行时,通过LLDB关联本地源码进行内存调试。
LLDB,称Low Level Debugger,并不是低水平的调试器,而是轻量级的高性能调试器,默认内置于Xcode中。
Xcode是运行在操作系统Mac OS X上的集成开发工具,由Apple Inc开发。Xcode是开发macOS和iOS应用程序的最快捷的方式。Xcode具有统一的用户界面设计,编码、测试、调试都在一个简单的窗口内完成。
Xcode同时也是一种语言,作为一种基于XML的语言,Xcode可以设想各种使用场景。它提供了一种独立于工具的可扩展的方法来描述编译时组件的各个方面。
与现有技术相比,本发明实施例一种iOS系统调试的方法具有如下有益效果:
本发明实施例一种iOS系统调试的方法基于Git的特性、DSL语言的可注入性以及iOS编译中间产物的特性,实现了从远端源码到本地管理,可以在本地源码、静态库、动态库之间快速切换以及实现了静态库、动态库调试编译,且具有较好的移植性,在一定程度上提高了开发效率。
请参阅图4,基于同本发明实施例一种iOS系统调试的方法相同的发明构思,本发明另一实施例提供了一种iOS系统调试的装置,其包括
本地存储模块401,用于基于远程服务器中存储的远程源码在私有服务器中创建本地源码信息并存储本地源码,其中本地源码信息包括本地源码及相应的版本;
构建配置模块403,用于调用本地源码构建静态库、动态库,存储静态库、动态库至私有服务器中并配置调用命令;
关联调试模块405,用于将静态库、动态库与本地源码关联,以根据调用命令编译调试静态库、动态库。
优选地,关联调试模块405包括:
调整单元,用于将静态库、动态库中引用远程源码的路径信息调整为引用本地源码的路径信息,以根据调用命令调试静态库、动态库。
在一些实施方式中,调整单元包括:
第一替换子单元,用于将Macho文件中包含引用远程源码的路径信息的Section段替换为包含引用本地源码的路径信息的Section段。
在另一些实施方式中,调整单元包括:
获取单元,用于获取DSYM文件;
第二替换子单元,用于将DSYM文件中的包含引用远程源码的路径信息的Section段替换为包含引用本地源码的路径信息的Section段。
在一些实施方式中,关联调试模块405包括:
创建单元,用于基于静态库、动态库引用远程源码的路径信息创建相同的存储路径;
存储单元,用于将本地源码存储在存储路径中,以根据调用命令调试静态库、动态库。
优选地,本地存储模块401包括:
本地存储单元,用于通过Git基于远程服务器中存储的远程源码在私有服务器中创建本地源码并存储。
优选地,构建配置模块403包括:
配置单元,用于通过DSL hook为静态库、动态库配置调用命令。
需要说明的是,基于本发明另一实施例一种iOS系统调试的装置与本发明实施例一种iOS系统调试的方法相同的发明构思,因此,本发明另一实施例一种iOS系统调试的装置的具体实施方式与本发明实施例一种iOS系统调试的方法相同,因此,具体说明解释可以参见本发明实施例一种iOS系统调试的方法,此处不再赘述。
与现有技术相比,本发明另一实施例一种iOS系统调试的装置具有如下有益效果:
本发明另一实施例一种iOS系统调试的装置通过本地存储模块401、构建配置模块403以及关联调试模块405的设置,实现了从远端源码到本地管理,可以在本地源码、静态库、动态库之间快速切换以及实现了静态库、动态库调试编译,且具有较好的移植性,在一定程度上提高了开发效率。
基于同本发明实施例iOS系统调试的方法和本发明另一实施例iOS系统调试的装置相同的发明构思,本发明又一实施例提供一种服务器,服务器包括存储器、处理器,存储器上存储有在处理器上运行的计算机程序,处理器执行如下步骤:
基于远程服务器中存储的远程源码在私有服务器中创建本地源码信息并存储本地源码,其中本地源码信息包括本地源码及相应的版本;
调用本地源码构建静态库、动态库,存储静态库、动态库至私有服务器中并配置调用命令;
将静态库、动态库与本地源码关联,以根据调用命令编译调试静态库、动态库。
优选地,将静态库、动态库与本地源码关联包括如下步骤:
将静态库、动态库中引用远程源码的路径信息调整为引用本地源码的路径信息,以根据调用命令调试静态库、动态库。
在一些实施方式中,考虑到i0S系统在构建过程中存在Macho类型为staticlib、mh_dylib的.framework二进制类型,其中,Macho文件为Mach Object文件格式的缩写,它是一种用于可执行文件。因此,将静态库、动态库中引用远程源码的路径信息调整为引用本地源码的路径信息包括如下步骤:
将Macho文件中包含引用远程源码的路径信息的Section段替换为包含引用本地源码的路径信息的Section段。
在一些实施方式中,将静态库、动态库中引用远程源码的路径信息调整为引用本地源码的路径信息包括如下步骤:
获取DSYM文件;
将DSYM文件中的包含引用远程源码的路径信息的Section段替换为包含引用本地源码的路径信息的Section段。
在一些实施方式中,将静态库、动态库与本地源码关联包括如下步骤:
基于静态库、动态库引用远程源码的路径信息创建相同的存储路径;
将本地源码存储在存储路径中,以根据调用命令调试静态库、动态库。
优选地,基于远程服务器中存储的远程源码在私有服务器中创建本地源码并存储包括如下步骤:
通过Git基于远程服务器中存储的远程源码在私有服务器中创建本地源码并存储。
Git是分布式版本控制系统,没有中央服务器,每个计算器就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在每个计算器上。既然每个计算器都有一个完整的版本库,那多个计算器如何协作呢?比如说某开发人员在计算器上改了文件A,其他开发人员也在计算器上改了文件A,这时,开发人员之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。值得注意的是,与Git不同,SVN的版本库是集中放在中央服务器的,而开发的时候,用的都是自己的计算器,所以首先要从中央服务器哪里得到最新的版本,然后开发,开发后,需要把自己的开发推送到中央服务器。集中式版本控制系统是必须联网才能工作。
在Git中包括三个区——工作区、暂存区以及版本库,其中,
工作区:就是在计算机里能看到的目录;
暂存区:一般存放在″.git目录下″下的索引文件中,因此,暂存区有时也叫作索引。工作区的文件先被增加到这个区域里,再从这个区域提交到版本库;
版本库:工作区有一个隐藏目录.git,这个不是工作区,而是Git的版本库。
在一些实施方式中,私有服务器200通过使用gitolite做权限管理,只允许jenkins操作远程服务器100,并使用git daemon做远程服务器100的映射,所有计算器只有只读权限且无需配置ssh公钥,其中,gitolite是加在Git上的权限控制工具,可以将控制粒度缩小到分支范围内;Jenkins是国际上流行的免费开源软件项目,是基于Java开发持续集成工具,用于监控持续重复的工作,旨在提供一个开放的易用的软件平台,使软件的持续集成变成可能;git daemon是一个TCP Git守护进程,通常在端口上监听,适合只读更新,也即从Git存储库中提取。
需要注意的是,本地源码信息包括本地源码及相应的版本,因此,不仅需要从远程服务器克隆一个一模一样的版本库到私有服务器,复制的是整个版本库,还需要将远程服务器获取到一个分支的更新到私有服务器,并更新私有服务器,在实际调用中,要区分gitclone和git pull,其中,gitclone是远程操作的第一步,通常是从远程服务器克隆一个版本库,而gitpull相当于是从远程服务器获取最新版本并合并到私有服务器。
在一些实施方式中,为了方便管理和调用,在私有服务器上还可以扩展pod相关命令,进行add、delete、remove、list等操作私有服务器的本地源码,在Linux操作系统中进行路径模拟-软连接、挂载、相同路径,区分私有git仓库资源和第三方git仓库资源,同样的可以进行source、podspec、tag、git、path等方式的资源操作。
优选地,存储静态库、动态库至私有服务器中并配置调用命令包括如下步骤:
通过DSL hook为静态库、动态库配置调用命令。
领域特定语言(Domain Specific Language,简称DSL)是为了解决某一类任务而专门设计的计算机语言,其与通用编程语言(General Purpose Language,简称GPL)相对,GPL是可以用来编写任意计算机程序的,并且能表达任何的可被计算的逻辑,同时也是图灵完备的。但是DSL并不是图灵完备的,它们的表达能力有限,只是在特定领域解决特定任务的。hook,中文译为“挂钩”或“钩子”,顾名思义,日常生活中,我们的钩子是用来钩住某种东西的,比如,说,鱼钩是用来钓鱼的,一旦鱼咬了钩,钩子就一直钩住鱼了,任凭鱼在水里怎么游,也逃不出鱼钩的控制。同样的,在iOS逆向中是指改变程序运行流程的一种技术。通过hook可以让别人的程序执行自己所写的代码。
示例地,在一种实施方式中,源码、静态库、动态库的资源路径配置:
源码:git://xxx.com:4709/sources/pod_name.git
静态库:git://xxx.com:4709/binarys/pod_name.git
动态库:git://xxx.com:4709/frameworks/pod_name.git
在配置调用指令后可以切换使用:
源码:pod′仓库名称′
静态库:binary_pod′仓库名称′
动态库:framework_pod′仓库名称′
其中,binary_pod和framework_pod是基于DSL hook为静态库、动态库配置调用命令。
需要说明的是,基于本发明又一实施例一种服务器与本发明实施例一种iOS系统调试的方法相同的发明构思,因此,本发明又一实施例一种服务器的具体实施方式与本发明实施例一种iOS系统调试的方法相同,因此,具体说明解释可以参见本发明实施例一种iOS系统调试的方法,此处不再赘述。
与现有技术相比,本发明又一实施例一种服务器具有如下有益效果:
本发明又一实施例一种服务器基于Git的特性、DSL语言的可注入性以及iOS编译中间产物的特性,实现了从远端源码到本地管理,可以在本地源码、静态库、动态库之间快速切换以及实现了静态库、动态库调试编译,且具有较好的移植性,在一定程度上提高了开发效率。
以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (15)
1.一种iOS系统调试的方法,其特征在于,所述iOS系统调试的方法包括如下步骤:
基于远程服务器中存储的远程源码在私有服务器中创建本地源码信息并存储本地源码,其中所述本地源码信息包括本地源码及相应的版本;
调用所述本地源码构建静态库、动态库,存储所述静态库、动态库至所述私有服务器中并配置调用命令;
将所述静态库、动态库与所述本地源码关联,以根据所述调用命令编译调试所述静态库、动态库。
2.如权利要求1所述的iOS系统调试的方法,其特征在于,所述将所述静态库、动态库与所述本地源码关联包括如下步骤:
将所述静态库、动态库中引用所述远程源码的路径信息调整为引用所述本地源码的路径信息,以根据所述调用命令调试所述静态库、动态库。
3.如权利要求2所述的iOS系统调试的方法,其特征在于,所述将所述静态库、动态库中引用所述远程源码的路径信息调整为引用所述本地源码的路径信息包括如下步骤:
将Macho文件中包含引用所述远程源码的路径信息的Section段替换为包含引用所述本地源码的路径信息的Section段。
4.如权利要求2所述的iOS系统调试的方法,其特征在于,所述将所述静态库、动态库中引用所述远程源码的路径信息调整为引用所述本地源码的路径信息包括如下步骤:
获取DSYM文件;
将DSYM文件中的包含引用所述远程源码的路径信息的Section段替换为包含引用所述本地源码的路径信息的Section段。
5.如权利要求1所述的iOS系统调试的方法,其特征在于,所述将所述静态库、动态库与所述本地源码关联包括如下步骤:
基于所述静态库、动态库引用所述远程源码的路径信息创建相同的存储路径;
将所述本地源码存储在所述存储路径中,以根据所述调用命令调试所述静态库、动态库。
6.如权利要求1所述的iOS系统调试的方法,其特征在于,所述基于远程服务器中存储的远程源码在私有服务器中创建本地源码并存储包括如下步骤:
通过Git基于远程服务器中存储的远程源码在私有服务器中创建本地源码并存储。
7.如权利要求1所述的iOS系统调试的方法,其特征在于,所述存储所述静态库、动态库至所述私有服务器中并配置调用命令包括如下步骤:
通过DSL hook为所述静态库、动态库配置调用命令。
8.一种iOS系统调试的装置,其特征在于,所述iOS系统调试的装置包括:
本地存储模块,用于基于远程服务器中存储的远程源码在私有服务器中创建本地源码信息并存储本地源码,其中所述本地源码信息包括本地源码及相应的版本;
构建配置模块,用于调用所述本地源码构建静态库、动态库,存储所述静态库、动态库至所述私有服务器中并配置调用命令;
关联调试模块,用于将所述静态库、动态库与所述本地源码关联,以根据所述调用命令编译调试所述静态库、动态库。
9.如权利要求8所述的iOS系统调试的装置,其特征在于,所述关联调试模块包括:
调整单元,用于将所述静态库、动态库中引用所述远程源码的路径信息调整为引用所述本地源码的路径信息,以根据所述调用命令调试所述静态库、动态库。
10.如权利要求9所述的iOS系统调试的装置,其特征在于,所述调整单元包括:
第一替换子单元,用于将Macho文件中包含引用所述远程源码的路径信息的Section段替换为包含引用所述本地源码的路径信息的Section段。
11.如权利要求9所述的iOS系统调试的装置,其特征在于,所述调整单元包括:
获取单元,用于获取DSYM文件;
第二替换子单元,用于将DSYM文件中的包含引用所述远程源码的路径信息的Section段替换为包含引用所述本地源码的路径信息的Section段。
12.如权利要求8所述的iOS系统调试的装置,其特征在于,所述关联调试模块包括:
创建单元,用于基于所述静态库、动态库引用所述远程源码的路径信息创建相同的存储路径;
存储单元,用于将所述本地源码存储在所述存储路径中,以根据所述调用命令调试所述静态库、动态库。
13.如权利要求8所述的iOS系统调试的装置,其特征在于,所述本地存储模块包括:
本地存储单元,用于通过Git基于远程服务器中存储的远程源码在私有服务器中创建本地源码并存储。
14.如权利要求8所述的iOS系统调试的装置,其特征在于,所述构建配置模块包括:
配置单元,用于通过DSL hook为所述静态库、动态库配置调用命令。
15.一种服务器,所述服务器包括存储器、处理器,所述存储器上存储有在所述处理器上运行的计算机程序,其特征在于,
所述处理器执行如权利要求1至8中任一项所述的iOS系统调试的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911299694.2A CN111061638B (zh) | 2019-12-16 | 2019-12-16 | 一种iOS系统调试的方法、装置及服务器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911299694.2A CN111061638B (zh) | 2019-12-16 | 2019-12-16 | 一种iOS系统调试的方法、装置及服务器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111061638A true CN111061638A (zh) | 2020-04-24 |
CN111061638B CN111061638B (zh) | 2023-06-30 |
Family
ID=70301058
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911299694.2A Active CN111061638B (zh) | 2019-12-16 | 2019-12-16 | 一种iOS系统调试的方法、装置及服务器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111061638B (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111984531A (zh) * | 2020-07-31 | 2020-11-24 | 五八有限公司 | 一种代码耦合检测的方法及装置 |
CN112052007A (zh) * | 2020-09-07 | 2020-12-08 | 北京达佳互联信息技术有限公司 | 源码调试方法、装置、服务器及存储介质 |
CN112306543A (zh) * | 2020-11-13 | 2021-02-02 | 成都中科大旗软件股份有限公司 | 一种ios系统衍生项目的管理方法 |
CN112579470A (zh) * | 2020-12-29 | 2021-03-30 | 中国科学院计算机网络信息中心 | 一种软件动态库调试的编译链接方法及系统 |
CN112596734A (zh) * | 2020-12-15 | 2021-04-02 | 五八同城信息技术有限公司 | 静态库生成方法及装置 |
CN113127374A (zh) * | 2021-05-19 | 2021-07-16 | 支付宝(杭州)信息技术有限公司 | 应用于iOS设备的应用程序测试方法及装置 |
CN114546515A (zh) * | 2022-01-20 | 2022-05-27 | 上海合宙通信科技有限公司 | 动态加载静态库的模块、固件及设备和C库转Lua库的方法 |
CN116774988A (zh) * | 2023-08-16 | 2023-09-19 | 易方信息科技股份有限公司 | 解除框架包模式符号依赖的方法及装置 |
CN112596734B (zh) * | 2020-12-15 | 2024-06-07 | 五八同城信息技术有限公司 | 静态库生成方法及装置 |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102693183A (zh) * | 2012-05-30 | 2012-09-26 | 瑞斯康达科技发展股份有限公司 | 一种实现软件自动化测试的方法及系统 |
CN103377101A (zh) * | 2012-04-18 | 2013-10-30 | 百度在线网络技术(北京)有限公司 | 一种测试系统和测试方法 |
CN104050081A (zh) * | 2014-06-09 | 2014-09-17 | 汉柏科技有限公司 | 调试静态库函数的方法及系统 |
CN106776319A (zh) * | 2016-12-15 | 2017-05-31 | 广州酷狗计算机科技有限公司 | 自动测试方法及装置 |
CN107678938A (zh) * | 2017-08-24 | 2018-02-09 | 阿里巴巴集团控股有限公司 | 一种应用程序的调试方法及设备 |
CN107729066A (zh) * | 2017-11-08 | 2018-02-23 | 重庆扬讯软件技术股份有限公司 | 一种基于svn资源库自动化构建发布方法与装置 |
CN109962791A (zh) * | 2017-12-14 | 2019-07-02 | 广州市华势信息科技有限公司 | 一种流媒体系统平台及其测试方法 |
CN110377523A (zh) * | 2019-07-24 | 2019-10-25 | 网易(杭州)网络有限公司 | 程序调试方法及装置、电子设备和存储介质 |
CN110413507A (zh) * | 2019-06-21 | 2019-11-05 | 平安科技(深圳)有限公司 | 系统测试方法、装置、计算机设备和存储介质 |
-
2019
- 2019-12-16 CN CN201911299694.2A patent/CN111061638B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103377101A (zh) * | 2012-04-18 | 2013-10-30 | 百度在线网络技术(北京)有限公司 | 一种测试系统和测试方法 |
CN102693183A (zh) * | 2012-05-30 | 2012-09-26 | 瑞斯康达科技发展股份有限公司 | 一种实现软件自动化测试的方法及系统 |
CN104050081A (zh) * | 2014-06-09 | 2014-09-17 | 汉柏科技有限公司 | 调试静态库函数的方法及系统 |
CN106776319A (zh) * | 2016-12-15 | 2017-05-31 | 广州酷狗计算机科技有限公司 | 自动测试方法及装置 |
CN107678938A (zh) * | 2017-08-24 | 2018-02-09 | 阿里巴巴集团控股有限公司 | 一种应用程序的调试方法及设备 |
CN107729066A (zh) * | 2017-11-08 | 2018-02-23 | 重庆扬讯软件技术股份有限公司 | 一种基于svn资源库自动化构建发布方法与装置 |
CN109962791A (zh) * | 2017-12-14 | 2019-07-02 | 广州市华势信息科技有限公司 | 一种流媒体系统平台及其测试方法 |
CN110413507A (zh) * | 2019-06-21 | 2019-11-05 | 平安科技(深圳)有限公司 | 系统测试方法、装置、计算机设备和存储介质 |
CN110377523A (zh) * | 2019-07-24 | 2019-10-25 | 网易(杭州)网络有限公司 | 程序调试方法及装置、电子设备和存储介质 |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111984531B (zh) * | 2020-07-31 | 2022-01-28 | 五八有限公司 | 一种代码耦合检测的方法及装置 |
CN111984531A (zh) * | 2020-07-31 | 2020-11-24 | 五八有限公司 | 一种代码耦合检测的方法及装置 |
CN112052007A (zh) * | 2020-09-07 | 2020-12-08 | 北京达佳互联信息技术有限公司 | 源码调试方法、装置、服务器及存储介质 |
CN112306543B (zh) * | 2020-11-13 | 2023-08-29 | 成都中科大旗软件股份有限公司 | 一种ios系统衍生项目的管理方法 |
CN112306543A (zh) * | 2020-11-13 | 2021-02-02 | 成都中科大旗软件股份有限公司 | 一种ios系统衍生项目的管理方法 |
CN112596734A (zh) * | 2020-12-15 | 2021-04-02 | 五八同城信息技术有限公司 | 静态库生成方法及装置 |
CN112596734B (zh) * | 2020-12-15 | 2024-06-07 | 五八同城信息技术有限公司 | 静态库生成方法及装置 |
CN112579470A (zh) * | 2020-12-29 | 2021-03-30 | 中国科学院计算机网络信息中心 | 一种软件动态库调试的编译链接方法及系统 |
CN113127374A (zh) * | 2021-05-19 | 2021-07-16 | 支付宝(杭州)信息技术有限公司 | 应用于iOS设备的应用程序测试方法及装置 |
CN113127374B (zh) * | 2021-05-19 | 2022-05-17 | 支付宝(杭州)信息技术有限公司 | 应用于iOS设备的应用程序测试方法及装置 |
CN114546515A (zh) * | 2022-01-20 | 2022-05-27 | 上海合宙通信科技有限公司 | 动态加载静态库的模块、固件及设备和C库转Lua库的方法 |
CN114546515B (zh) * | 2022-01-20 | 2023-09-12 | 上海合宙通信科技有限公司 | 动态加载静态库的模块、固件及设备和C库转Lua库的方法 |
CN116774988A (zh) * | 2023-08-16 | 2023-09-19 | 易方信息科技股份有限公司 | 解除框架包模式符号依赖的方法及装置 |
CN116774988B (zh) * | 2023-08-16 | 2024-02-27 | 易方信息科技股份有限公司 | 解除框架包模式符号依赖的方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN111061638B (zh) | 2023-06-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111061638B (zh) | 一种iOS系统调试的方法、装置及服务器 | |
JP5518085B2 (ja) | ランタイムにおいて生成したコードのキャッシュへの格納 | |
KR101137126B1 (ko) | 확장성 컴파일러 및 툴의 기반 구조에 대한 기술 언어 | |
US7631301B2 (en) | Customizing binary content files | |
JP4489483B2 (ja) | 初期タイプの初期オブジェクトを最終タイプの最終オブジェクトに変形する方法 | |
WO2015176492A1 (en) | A system and method thereof for creating dynamically attachable and detachable binary files | |
JP2007521529A (ja) | コンポーネントベースのソフトウェア・プロダクトの保守 | |
CN106844153B (zh) | 应用程序运行监控方法、装置以及终端 | |
US20040268301A1 (en) | Adding new compiler methods to an integrated development environment | |
CN102402427A (zh) | 一种Java应用程序的更新方法及装置 | |
US20190114165A1 (en) | Using semantic annotations to control compatibility behaviors | |
CN110059456B (zh) | 代码保护方法、代码保护装置、存储介质与电子设备 | |
WO2019005228A1 (en) | AUTOMATED ADAPTATION OF A SOURCE CODE IN ORDER TO INJECT FUNCTIONS BETWEEN VERSIONS OF A PLATFORM | |
Dong et al. | R3: Optimizing relocatable code for efficient reprogramming in networked embedded systems | |
CN100492387C (zh) | 基于Keil C51的软件保护开发的方法和系统 | |
US8893100B2 (en) | Return address optimisation for a dynamic code translator | |
CN111880777A (zh) | 程序信息下发方法、装置、电子设备 | |
US20050071809A1 (en) | System and method for serializing objects in a compiled programming language | |
CN110659088B (zh) | 一种嵌入式环境下程序扩展的方法及系统 | |
Polakovic et al. | Experience with safe dynamic reconfigurations in component-based embedded systems | |
CN111880801A (zh) | 应用程序动态化方法、装置、电子设备 | |
CN113312046A (zh) | 子应用页面处理方法、装置和计算机设备 | |
CN109558121B (zh) | 接口驱动程序的开发方法、装置、设备及存储介质 | |
US20180364991A1 (en) | Method and system for preparing code to be executed by programmable control devices | |
CN112818176B (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |