一种iOS应用启动时执行load方法的耗时检测方法及终端与流程

专利查询1天前  2


一种ios应用启动时执行load方法的耗时检测方法及终端
技术领域
1.本发明涉及软件开发技术领域,特别涉及一种ios应用启动时执行load方法的耗时检测方法及终端。


背景技术:

2.ios应用在开发过程中,每个开发者使用objective-c语言编写类,通过一个个类的有机组合,从而实现应用功能。类分为主类和分类,主类和分类都有其load方法。该方法与其他方法不同的是:在应用被使用时,会加载应用,在加载应用时,所有类的load方法会被执行。如果在该方法中做了耗时操作,会极大程度上影响应用的启动所需时长。所以需要设计中一种方法,能够检测ios应用启动过程中load方法执行耗时,并进行记录。
3.目前已有相关的技术来实现ios应用启动过程中的方法执行耗时检测。该技术方案主要是在ios应用启动之前先依赖一个动态库,在动态库中执行一段代码,在该段代码中做了以下操作:
4.1、找到应用的二进制代码镜像文件,找到这个二进制文件中所有的类名。
5.2、根据类名找出这个二进制文件中所有的主类。加载所有的主类信息,此时也会加载所有的分类信息并整合到主类中。
6.3、遍历所有类的方法,判断是否有方法名为load,若有则进行替换。
7.4、将load方法替换为另外一个自带耗时统计功能的方法,并且在新的方法中执行原load方法的操作。
8.在以上的技术方案中基于动态库来实现ios应用主二进制代码进行动态替换的方案,是业界面对此类问题的常规方案,但是存在以下缺点:
9.缺点一:该方案中找到这个ios应用主工程的二进制文件,从该二进制文件中找出所有的类名,再逐一转化为对应的主类,再遍历类中所有方法,判断是否有load方法,过程十分低效。
10.缺点二:由于ios应用代码中的类分为主类和分类。主类和分类可以分别实现load方法,但是在ios应用加载的时候,主类和分类的方法都会被加载到主类中,所以在该方案在主类的方法列表中寻找分类的时候,无法区分中load方法是主类本身的load方法还是分类的load方法。


技术实现要素:

11.本发明所要解决的技术问题是:提供一种ios应用启动时执行load方法的耗时检测方法及终端,能够精确判断load方法的所属,并提高检测效率。
12.为了解决上述技术问题,本发明采用的技术方案为:
13.一种ios应用启动时执行load方法的耗时检测方法,包括:
14.通过二进制文件镜像入口指针解析ios应用主工程的ios二进制镜像文件,得到data数据段;
15.读取data数据段中存储有实现load方法的所有主类信息地址的第一章节和存储有实现load方法的所有分类信息地址的第二章节;
16.分别解析所述第一章节和所述第二章节以得到所有load方法的加载地址;
17.将load方法的加载地址与第一方法的加载地址进行替换,所述第一方法调用load方法且能对所调用的load方法进行耗时统计。
18.一种ios应用启动时执行load方法的耗时检测终端,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
19.通过二进制文件镜像入口指针解析ios应用主工程的ios二进制镜像文件,得到data数据段;
20.读取data数据段中存储有实现load方法的所有主类信息地址的第一章节和存储有实现load方法的所有分类信息地址的第二章节;
21.分别解析所述第一章节和所述第二章节以得到所有load方法的加载地址;
22.将load方法的加载地址与第一方法的加载地址进行替换,所述第一方法调用load方法且能对所调用的load方法进行耗时统计。
23.本发明的有益效果在于:本发明通过将load方法的加载地址与第一方法的地址进行替换,其中,第一方法能调用load方法并进行耗时检测,实现了ios应用启动过程中执行load方法的耗时检测,同时,针对ios应用中的代码二进制文件进行深入解析,直接找到所有实现load方法的主类和分类,大规模降低了遍历数量级,提高了检测效率,避免了无法区分load方法是主类本身的load方法还是分类的load方法的情况,使load方法执行耗时的检测更加精确。
附图说明
24.图1为本发明实施例中的一种ios应用启动时执行load方法的耗时检测方法的流程示意图;
25.图2为本发明实施例中的一种ios应用启动时执行load方法的耗时检测方法的数据存储示意图;
26.图3为本发明实施例中的一种ios应用启动时执行load方法的耗时检测终端的结构示意图;
27.标号说明:
28.1、一种ios应用启动时执行load方法的耗时检测终端;2、处理器;3、存储器。
具体实施方式
29.为详细说明本发明的技术内容、所实现目的及效果,以下结合实施方式并配合附图予以说明。
30.请参照图1,一种ios应用启动时执行load方法的耗时检测方法,包括:
31.通过二进制文件镜像入口指针解析ios应用主工程的ios二进制镜像文件,得到data数据段;
32.读取data数据段中存储有实现load方法的所有主类信息地址的第一章节和存储
有实现load方法的所有分类信息地址的第二章节;
33.分别解析所述第一章节和所述第二章节以得到所有load方法的加载地址;
34.将load方法的加载地址与第一方法的加载地址进行替换,所述第一方法调用load方法且能对所调用的load方法进行耗时统计。
35.从上述描述可知,本发明的有益效果在于:本发明通过将load方法的加载地址与第一方法的地址进行替换,其中,第一方法能调用load方法并进行耗时检测,实现了ios应用启动过程中执行load方法的耗时检测,同时,针对ios应用中的代码二进制文件进行深入解析,直接找到所有实现load方法的主类和分类,大规模降低了遍历数量级,提高了检测效率,避免了无法区分load方法是主类本身的load方法还是分类的load方法的情况,使load方法执行耗时的检测更加精确。
36.进一步的,所述二进制镜像文件入口指针为mach64 header。
37.由上述描述可知,通过找到文件格式为mach64 header的文件作为二进制镜像文件入口指针,以快速找到所需要的load方法。
38.进一步的,所述第一章节为__objc_nlclslist章节,所述第二章节为__objc_nlcatlist章节。
39.由上述描述可知,所述第一章节为__objc_nlclslist章节,所述第二章节为__objc_nlcatlist章节,这两个章节分别存储了所有实现了load方法的类和分类信息所存的地址。
40.进一步的,所述分别解析所述第一章节和所述第二章节以得到所有load方法的加载地址具体包括:
41.解析所述__objc_nlclslist章节的列表信息,找到所有实现了load方法的类信息,所述类信息包含:类的名称、父类信息、类的类方法列表以及实例方法列表,从所述类方法列表中获取load方法的加载地址;
42.解析所述__objc_nlcatlist章节的列表信息,找到所有实现了load方法的分类信息,所述分类信息包含:分类名称、主类信息地址、分类的类方法列表以及实例方法列表,从分类的类方法列表中从中找到load方法的加载地址。
43.由上述描述可知,通过解析所述__objc_nlclslist章节的列表信息获取到所有包含load方法的类的load方法加载地址,通过解析所述__objc_nlcatlist章节的列表信息获取到所有包含load方法的分类的load方法加载地址,避免了无法区分load方法是主类本身的load方法还是分类的load方法的情况,使load方法执行耗时的检测更加精确。
44.进一步的,所述第一方法为计时钩子方法。
45.由上述描述可知,采用计时钩子方法作为耗时检测方法,使对load方法的耗时检测更加简单方便。
46.本发明还提供一种ios应用启动时执行load方法的耗时检测终端,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
47.通过二进制文件镜像入口指针解析ios应用主工程的ios二进制镜像文件,得到data数据段;
48.读取data数据段中存储有实现load方法的所有主类信息地址的第一章节和存储
有实现load方法的所有分类信息地址的第二章节;
49.分别解析所述第一章节和所述第二章节以得到所有load方法的加载地址;
50.将load方法的加载地址与第一方法的加载地址进行替换,所述第一方法调用load方法且能对所调用的load方法进行耗时统计。
51.进一步的,所述二进制镜像文件入口指针为mach64 header。
52.进一步的,所述第一章节为__objc_nlclslist章节,所述第二章节为__objc_nlcatlist章节。
53.进一步的,所述分别解析所述第一章节和所述第二章节以得到所有load方法的加载地址具体包括:
54.解析所述__objc_nlclslist章节的列表信息,找到所有实现了load方法的类信息,所述类信息包含:类的名称、父类信息、类的类方法列表以及实例方法列表,从所述类方法列表中获取load方法的加载地址;
55.解析所述__objc_nlcatlist章节的列表信息,找到所有实现了load方法的分类信息,所述分类信息包含:分类名称、主类信息地址、分类的类方法列表以及实例方法列表,从分类的类方法列表中从中找到load方法的加载地址。
56.进一步的,所述第一方法为计时钩子方法。
57.请参照图1和图2,本发明的实施例一为:
58.本实施例提供一种ios应用启动时执行load方法的耗时检测方法,包括:
59.s1、通过二进制文件镜像入口指针解析ios应用主工程的ios二进制镜像文件,得到data数据段;
60.在本实施例中,如图2所示,二进制镜像文件入口指针为mach64 header;
61.s2、读取data数据段中存储有实现load方法的所有主类信息地址的第一章节和存储有实现load方法的所有分类信息地址的第二章节;
62.其中,第一章节为__objc_nlclslist章节,所述第二章节为__objc_nlcatlist章节,这两个章节存储了所有实现了所有实现了load方法的类信息所存的地址,即图2中的__objc_nlclslist和__objc_nlcatlist;
63.s3、分别解析所述第一章节和所述第二章节以得到所有load方法的加载地址;
64.上述步骤s3具体包括:
65.解析所述__objc_nlclslist章节的列表信息,找到所有实现了load方法的类信息,所述类信息包含:类的名称、父类信息、类的类方法列表以及实例方法列表,从所述类方法列表中获取load方法的加载地址,图2中struct objc_class下的meta_class和super_class对应上述类的名称和父类信息;
66.解析所述__objc_nlcatlist章节的列表信息,找到所有实现了load方法的分类信息,所述分类信息包含:分类名称、主类信息地址、分类的类方法列表以及实例方法列表,从分类的类方法列表中从中找到load方法的加载地址,图2中struct category_t下的name和cls对应上述分类名称和主类信息地址。
67.s4、将load方法的加载地址与第一方法的加载地址进行替换,所述第一方法调用load方法且能对所调用的load方法进行耗时统计;
68.在本实施例中,第一方法为计时钩子方法。
69.在本实施例中,将load方法的加载地址替换为计时方法具体为:
70.在应用启动时,由于是使用objective-c语言编写,所以需要链接该语言的执行库。在动态链接该库的时候,使用c语言层面的指针替换技术,替换掉链接库加载或执行load方法的相关函数,从而实现在执行load方法时跳转到计时方法。
71.由此,采用本实施例的耗时检测方法,存在以下两个优势:
72.优势一:类中的方法列表中有类方法和实例方法,其中实例方法数量一般远多于类方法,如果一个ios应用有一万个类,三十万个方法。其中有100个类实现了load方法,并且这100个类中平均每个类有30个方法,其中5个是类方法,而load方法属于类方法。由于本发明针对ios应用中的代码二进制文件进行深入解析,直接找到所有实现load方法的类,对其类方法列表进行解析,那么就从原来要遍历30万个方法的范围缩小到了从100个类的总共500个类方法中找到所有的load方法即可,从而大幅度提升了遍历效率。
73.优势二:由于是将类和分类分别遍历,所以可以精确地统计每个主类和分类的load方法执行情况。从而可以更加精准地进行数据分析。
74.其中,在本实施例中描述的ios二进制镜像文件具体为:ios应用由二进制文件、资源文件、配置文件等组成,使用objctive-c语言开发,然后经过编译、链接形成二进制文件,该文件是ios应用中的核心组成部分。
75.其中,在本实施例中描述load方法具体为:ios应用开发所用的objective-c语言中的一种特殊方法。ios应用开发过程中需要编写一个个类(class)和分类(category),类和分类允许实现load方法。实现了load方法的类和分类,被标记为非懒加载类和非懒加载分类。在应用启动的时候,会首先加载这些类,并且在加载时执行load方法。而其他一般的类和分类,只有被需要的时候才会被加载。
76.请参照图3,本发明的实施例二为:
77.一种ios应用启动时执行load方法的耗时检测终端1,包括存储器3、处理器2及存储在存储器3上并可在处理器2上运行的计算机程序,所述处理器执行所述计算机程序时实现上述实施例一中的步骤。
78.综上所述,本发明提供的一种ios应用启动时执行load方法的耗时检测方法及终端,通过将load方法的加载地址与计时钩子方法的地址进行替换,其中,计时钩子方法能调用load方法并进行耗时检测,实现了ios应用启动过程中执行load方法的耗时检测,同时,针对ios应用中的代码二进制文件进行深入解析,直接找到所有实现load方法的主类和分类,大规模降低了遍历数量级,提高了检测效率,避免了无法区分load方法是主类本身的load方法还是分类的load方法的情况,使load方法执行耗时的检测更加精确。
79.以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等同变换,或直接或间接运用在相关的技术领域,均同理包括在本发明的专利保护范围。

技术特征:
1.一种ios应用启动时执行load方法的耗时检测方法,其特征在于,包括:通过二进制文件镜像入口指针解析ios应用主工程的ios二进制镜像文件,得到data数据段;读取data数据段中存储有实现load方法的所有主类信息地址的第一章节和存储有实现load方法的所有分类信息地址的第二章节;分别解析所述第一章节和所述第二章节以得到所有load方法的加载地址;将load方法的加载地址与第一方法的加载地址进行替换,所述第一方法调用load方法且能对所调用的load方法进行耗时统计。2.根据权利要求1所述的一种ios应用启动时执行load方法的耗时检测方法,其特征在于,所述二进制镜像文件入口指针为mach64 header。3.根据权利要求1所述的一种ios应用启动时执行load方法的耗时检测方法,其特征在于,所述第一章节为__objc_nlclslist章节,所述第二章节为__objc_nlcatlist章节。4.根据权利要求3所述的一种ios应用启动时执行load方法的耗时检测方法,其特征在于,所述分别解析所述第一章节和所述第二章节以得到所有load方法的加载地址具体包括:解析所述__objc_nlclslist章节的列表信息,找到所有实现了load方法的类信息,所述类信息包含:类的名称、父类信息、类的类方法列表以及实例方法列表,从所述类方法列表中获取load方法的加载地址;解析所述__objc_nlcatlist章节的列表信息,找到所有实现了load方法的分类信息,所述分类信息包含:分类名称、主类信息地址、分类的类方法列表以及实例方法列表,从分类的类方法列表中从中找到load方法的加载地址。5.根据权利要求1所述的一种ios应用启动时执行load方法的耗时检测方法,其特征在于,所述第一方法为计时钩子方法。6.一种ios应用启动时执行load方法的耗时检测终端,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现以下步骤:通过二进制文件镜像入口指针解析ios应用主工程的ios二进制镜像文件,得到data数据段;读取data数据段中存储有实现load方法的所有主类信息地址的第一章节和存储有实现load方法的所有分类信息地址的第二章节;分别解析所述第一章节和所述第二章节以得到所有load方法的加载地址;将load方法的加载地址与第一方法的加载地址进行替换,所述第一方法调用load方法且能对所调用的load方法进行耗时统计。7.根据权利要求6所述的一种ios应用启动时执行load方法的耗时检测终端,其特征在于,所述二进制镜像文件入口指针为mach64 header。8.根据权利要求6所述的一种ios应用启动时执行load方法的耗时检测终端,其特征在于,所述第一章节为__objc_nlclslist章节,所述第二章节为__objc_nlcatlist章节。9.根据权利要求8所述的一种ios应用启动时执行load方法的耗时检测终端,其特征在于,所述分别解析所述第一章节和所述第二章节以得到所有load方法的加载地址具体包
括:解析所述__objc_nlclslist章节的列表信息,找到所有实现了load方法的类信息,所述类信息包含:类的名称、父类信息、类的类方法列表以及实例方法列表,从所述类方法列表中获取load方法的加载地址;解析所述__objc_nlcatlist章节的列表信息,找到所有实现了load方法的分类信息,所述分类信息包含:分类名称、主类信息地址、分类的类方法列表以及实例方法列表,从分类的类方法列表中从中找到load方法的加载地址。10.根据权利要求6所述的一种ios应用启动时执行load方法的耗时检测终端,其特征在于,所述第一方法为计时钩子方法。

技术总结
本发明公开了一种iOS应用启动时执行load方法的耗时检测方法及终端;本发明通过将load方法的加载地址与计时钩子方法的地址进行替换,其中,计时钩子方法能调用load方法并进行耗时检测,实现了iOS应用启动过程中执行load方法的耗时检测,同时,针对iOS应用中的代码二进制文件进行深入解析,直接找到所有实现load方法的主类和分类,大规模降低了遍历数量级,提高了检测效率,避免了无法区分load方法是主类本身的load方法还是分类的load方法的情况,使load方法执行耗时的检测更加精确。使load方法执行耗时的检测更加精确。使load方法执行耗时的检测更加精确。


技术研发人员:刘德建 颜志炜 王杰光 吴仁海 苏昌骏 郭玉湖 陈宏
受保护的技术使用者:福建天泉教育科技有限公司
技术研发日:2020.09.08
技术公布日:2022/3/7

最新回复(0)