CN116126427B - 基于面向切面编程的无侵入sdk辅助集成插件的实现方法 - Google Patents
基于面向切面编程的无侵入sdk辅助集成插件的实现方法 Download PDFInfo
- Publication number
- CN116126427B CN116126427B CN202310399368.9A CN202310399368A CN116126427B CN 116126427 B CN116126427 B CN 116126427B CN 202310399368 A CN202310399368 A CN 202310399368A CN 116126427 B CN116126427 B CN 116126427B
- Authority
- CN
- China
- Prior art keywords
- sdk
- function
- application
- class
- tangent plane
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44505—Configuring for program initiating, e.g. using registry, configuration files
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
- G06F9/44526—Plug-ins; Add-ons
-
- Y—GENERAL 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
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE 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/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Programmable Controllers (AREA)
Abstract
本发明公开了一种基于面向切面编程的无侵入SDK辅助集成插件的实现方法,运用面向切面编程技术,运行时获取SDK各项信息,所述方法包括以下步骤:S1.获取集成信息;通过运行时获取SDK内部类是否存在,判断应用源代码中是否包含SDK;S2.获取配置信息;通过iOS平台上的运行时方法交换技术,获取SDK的配置函数的切入点,从而得到项目唯一标识符、远端域名和、或当前运行环境的配置信息;S3.获取初始化信息;通过运行时方法交换技术,获取应用启动的相关函数实现的切入点,判断是否已初始化SDK;S4.集成信息列表内容展示SDK集成步骤S1到S3是否全部完成。
Description
技术领域
本发明涉及计算机及编程技术领域,尤其是涉及一种基于面向切面编程的无侵入SDK辅助集成插件的实现方法。
背景技术
SDK指软件开发工具包,可以帮助开发者快速实现某些功能或服务,而不需要自己从零开始编写代码。使用SDK有很多好处,比如节省开发时间、提高编码效率、降低应用开发成本、保证应用质量等。
面向切面编程技术(AOP),是一种编程范式,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
现如今市面上,大部分端侧开发工程师在开发端侧应用时,会集成使用由第三方供应商提供的SDK来协助开发。第三方供应商除了提供SDK开发包给开发工程师,还需要提供相应的集成文档,以及跟进解决SDK在运行中出现的技术性问题。
然而,在实际的SDK运用场景中,可能会遇到:
1、开发工程师没有充分阅读开发集成文档,导致集成步骤遗漏,造成SDK集成失败。
2、开发工程师将SDK内相关配置填写错误,导致无法正常运行。
3、线上应用运行时,SDK出现问题,第三方供应商难以获取有效信息进行快速排查。
现有技术中,第三方供应商一般提供了通过日志输出,或者由端侧开发工程师手动核对集成步骤完成情况、手动核对配置信息的方式,来解决上述痛点;这些解决方案无法快速地排查问题所在,无法满足日益增长的开发迭代需求。为了有效降低上述痛点带来的不便性,本发明提供了一种基于面向切面编程的无侵入SDK辅助集成插件的实现方法。
发明内容
针对现有技术存在的问题,本发明的目的在于提供一种基于面向切面编程的无侵入SDK辅助集成插件的实现方法,能够动态获取SDK运行时配置项并通过列表显示,在执行SDK集成后,可使用插件内集成信息列表逐一展示集成步骤的完成情况。
为实现上述目的,本发明提供一种基于面向切面编程的无侵入SDK辅助集成插件的实现方法,运用面向切面编程技术,运行时获取SDK各项信息,所述方法包括以下步骤:
S1.获取集成信息;通过运行时获取SDK内部类是否存在,判断应用源代码中是否包含SDK;
S2.获取配置信息;通过iOS平台上的运行时方法交换技术,获取SDK的配置函数的切入点,从而得到项目唯一标识符、远端域名和、或当前运行环境的配置信息;
S3.获取初始化信息;通过运行时方法交换技术,获取应用启动的相关函数实现的切入点,判断是否已初始化SDK;
S4.集成信息列表内容展示SDK集成步骤S1到S3是否全部完成。
进一步,步骤S1中,在SDK中实现初始化相关的类时,使用类名导出字符串函数NSClassFromString,导出类名,若得到的类名为非空字符串,则判断应用源代码中包含SDK。
进一步,步骤S2中获取配置信息的实现过程如下:
S2.1使用系统根类NSObject的分类,定义运用方法交换技术的公共函数tools_swizzleMethod,接受参数为原方法选择器和替换方法选择器;
S2.2公共函数内,调用函数体对象获取函数class_getInstanceMethod,传入当前SDK对象,以及原方法选择器,获取原函数对应的函数体对象;
S2.3调用函数体对象获取函数class_getInstanceMethod,传入当前SDK对象,以及替换方法选择器,获取替换函数的函数体对象;
S2.4调用实现指针交换函数method_exchangeImplementation,传入原函数的函数体对象、替换函数的函数体对象,交换原函数和替换函数的实现指针;
S2.5使用SDK配置函数所在类的分类,定义替换配置函数的替换函数,替换函数其内部实现为:通过所传入的所有参数与配置项名称做对应,获取配置项信息,并调用SDK配置函数,以保留原有功能;
S2.6调用S2.1定义的公共函数,传入SDK配置函数的方法选择器作为目标函数的方法选择器,传入S2.5定义的替换函数的方法选择器,替换2个函数的具体实现指针。
进一步,步骤S3中,判断是否已初始化SDK,包括以下步骤:
S3.1使用应用根类UIApplication的分类,定义替换应用启动函数的替换函数,替换函数的内部实现为:调用原应用启动函数,并在应用启动函数执行之后,通过SDK实例是否存在,判断SDK是否初始化成功;
S3.2调用S2.1定义的公共函数,传入应用启动函数和S3.1定义的替换应用启动函数,替换2个函数的具体实现指针。
进一步,步骤S3中,判断是否已初始化SDK,使用监听系统生命周期通知的方式,包括以下步骤:
首先,注册通知监听回调,该监听的通知目标为应用冷启动通知;
然后,回调方法内直接判断是否初始化SDK。
进一步,步骤S4中,获取得到的所有SDK信息包括:
是否集成SDK;
项目唯一标识符、远端域名和运行环境的SDK配置信息;
是否初始化SDK。
进一步,第三方供应商可以通过逆向技术,下载生产环境的应用安装包,使用动态库的方式来集成插件,在iOS端,集成插件的过程如下:
Q1.安装开源的MonkeyDev开发集成环境;
Q2.下载生产环境的应用包ipa,通过导入安装方式安装;
Q3.安装开源的动态代码执行工具包frida,并通过终端连接至设备,砸壳获取解密后的应用包;
Q4.将解密后的应用包通过Q1中的集成环境安装至设备,并同时使用动态库方式集成SDK辅助插件,运行该应用。
进一步,所述插件可应用于iOS端、Android端和Web端。
进一步,Android端上,利用字节码插桩技术ASM,在SDK相关类文件打包成可执行文件之前,使用自动化构建工具Gradle中所提供的用来修改类文件的标准接口transform对类文件进行字节码的修改,添加SDK信息展示。
进一步,在Web端,基于面向切面编程,使用装饰器模式,在页面加载完成后添加SDK是否初始化判断。
本发明的有益效果如下:本技术方案描述了一种基于面向切面编程技术的无侵入SDK辅助插件的实现方法,其获取了应用运行时的SDK各项信息,实现了:
在开发工程师执行SDK集成后,可使用插件内集成信息列表逐一展示集成步骤的完成情况。
在端侧应用运行时,动态获取SDK运行时配置项并通过列表显示,确保SDK可正常运行。
SDK出现问题时,开发工程师使用同一版本的二进制应用执行文件,使用插件获取SDK相关的信息同步给第三方供应商,协助排查问题。
附图说明
图1为根据本发明的基于面向切面编程的无侵入SDK辅助集成插件的实现方法流程示意图;
图2为iOS 平台上的方法交换技术流程图;
图3为根据本发明的基于面向切面编程的无侵入SDK辅助集成插件的实现方法中函数体对象示意图;
图4为根据本发明据实施例中替换 2 个方法的具体实现指针的示意图;
图5为根据本发明实施例中替换函数的流程示意图;
图6为根据本发明实施例中在不同的SDK集成步骤完成情况的示意图。
具体实施方式
下面将结合附图,对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本发明的描述中,需要说明的是,术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。
在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。
以下结合图1-图6对本发明的具体实施方式进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本发明,并不用于限制本发明。
本发明实施例提供一种基于面向切面编程的无侵入SDK辅助集成插件的实现方法。首先对本申请实施例中涉及到的一些概念介绍如下:
(1) 软件开发工具包(softwaredevelopmentkit,SDK)
SDK用于提供一组预定义的函数和程序库,以便开发人员能够快速、高效地开发特定类型的应用程序。这些函数和程序库可能包括用于处理图形、音频、视频、网络通信等方面的功能。
通常,SDK的正常运行需要有两个重要函数:配置函数和初始化函数。配置函数用于配置SDK运行所需的一些基本信息(如当前项目标识、远端域名);初始化函数开启SDK运行,一般在应用启动期间调用,保证SDK能够随着应用一起运行。
(2) 面向切面编程技术(Aspect-OrientedProgramming,AOP)
面向切面编程技术是一种在运行时动态将代码切入到类的指定方法或者指定位置上的编程思想。该技术有两个重要的概念:切面和切入点。切面是一组横切关注点(如日志记录或性能统计)。切入点是应用程序的一个执行点,在该点可以插入切面。通常,切入点是程序中指定过程的执行,更具体地说,是一段代码的执行,比如应用启动、页面加载等。
(3) iOS平台上的方法交换技术(MethodSwizzling)
如图2所示,iOS平台上的方法交换,方法交换前,原方法选择器对应于原方法具体实现,替换方法选择器对应于替换方法具体实现;方法交换后,原方法选择器对应于替换方法具体实现,替换方法选择器对应于原方法具体实现。
方法交换技术是一种运行时机制,它允许在运行时动态地改变一个类或者实例方法的实现。方法交换可以通过修改函数体对象(Method,如图3所示)中方法选择器(SEL)和方法实现指针(IMP)的对应关系,使得已经存在的方法选择器映射到另一个方法实现指针。方法选择器用于标记一个函数体对象,便于在运行时查找该函数对象。方法实现指针指向的是该函数的具体实现代码。
(4) 系统自带函数介绍
类名导出字符串函数(NSClassFromString)是通过运行时机制获取类对象,并获取类对象结构体对应的类名。如果类不存在,则获取到的类对象、类名为空。
函数体对象获取函数(class_getInstanceMethod)是通过运行时机制在指定类当中,获取方法选择器(SEL)对应的实例方法函数体对象。
实现指针交换函数(method_exchangeImplementation)在运行时期间,动态交换2个函数体对象内部的方法实现指针,从而达到修改代码实现,添加额外代码的目的。
如图1所示,根据本发明实施例所述的一种基于面向切面编程的无侵入SDK辅助集成插件的实现方法,运用面向切面编程技术,运行时获取SDK各项信息,包括以下步骤:
S1.获取集成信息;通过运行时获取SDK内部类是否存在,判断应用源代码中是否包含SDK;
S2.获取配置信息;通过iOS平台上的运行时方法交换技术,获取SDK的配置函数的切入点,从而得到项目唯一标识符、远端域名和、或当前运行环境的配置信息;
S3.获取初始化信息;通过运行时方法交换技术,获取应用启动的相关函数实现的切入点,判断是否已初始化SDK;
S4.集成信息列表内容展示SDK集成步骤S1到S3是否全部完成。
具体地,步骤S1中获取集成信息的实现过程如下:
在iOS平台上,某SDK设有如下集成步骤:
S101.通过包管理器(Cocoapods)或者源代码形式集成SDK;
S102.使用配置函数,设置项目唯一标识符、远端域名、当前运行环境(调试或生产环境);
S103.在应用启动时,初始化SDK。
在SDK中实现初始化相关的类时,使用类名导出字符串函数(NSClassFromString),导出该类的类名,若得到的类名为非空字符串,则判断应用源代码中包含SDK。
具体地,步骤S2中获取配置信息的实现过程如下:
假设某SDK有配置函数,该配置函数的参数包括项目唯一标识符(projectId)、远端域名(serverHost)、当前运行环境(debugEnabled)。通过iOS平台上的运行时方法交换技术,获取SDK的配置函数的切入点。方法交换技术的核心点是交换目标函数的实现指针为替换函数的实现指针,从而达到运行时替换函数实现的目的。其基于运行时的特性,过程中不修改源代码实现,有很好的无侵入性。具体包括以下步骤:
S2.1使用系统根类(NSObject)的分类,自定义一个公共函数(tools_swizzleMethod),公共函数接受参数为原方法选择器和替换方法选择器;
S2.2在该函数内部,调用函数体对象获取函数(class_getInstanceMethod),传入当前SDK对象,以及原方法选择器,获取原函数对应的函数体对象;
S2.3同样地,调用函数体对象获取函数(class_getInstanceMethod),传入当前SDK对象,以及替换方法选择器,获取替换函数对应的函数体对象;
S2.4调用实现指针交换函数(method_exchangeImplementation),传入原函数的函数体对象、替换函数的函数体对象,交换原函数和替换函数的实现指针;
步骤S2.1-S2.4示例代码如下:
@implementation NSObject (SDK)
(void)tools_swizzleMethod:(SEL)originSelector with:(SEL)swizzleSelector {
Method originMethod = class_getInstanceMethod(self, originSelector);
Method swizzleMethod = class_getInstanceMethod(self,swizzleSelector);
method_exchangeImplementations(originMethod, swizzleMethod);
}
@end
S2.5使用SDK配置函数所在类的分类,定义替换配置函数的替换函数,替换函数其内部实现为:通过所传入的所有参数与配置项名称做对应,获取配置项信息,并调用SDK原来的配置函数,以保留原有功能。
S2.5的示例代码如下:
@implementation SDKConfiguration (Swizzle)
(Void)swizzle_setConfiguration:(SDKConfiguration *)config {
static NSString *kProjectId = config.projectId.copy;
static NSString *kServerHost = config.serverHost.copy;
static NSString *kDebugEnabled = config.debugEnabled.copy;
[self swizzle_setConfiguration:config];
}
@end
S2.6调用S2.1定义的公用函数,传入SDK配置函数的方法选择器作为目标函数的方法选择器,传入S2.5定义的替换函数的方法选择器,替换2个函数的具体实现指针,如图4所示,方法交换前,SDK配置-方法选择器对应于SDK配置-方法实现指针,SDK配置-替换方法选择器对应于SDK配置-替换方法实现指针;调用系统自带的动态交换函数内实现指针方法进行方法交换后,SDK配置-方法选择器对应于SDK配置-替换方法实现指针,SDK配置-替换方法选择器对应于SDK配置-方法实现指针。
S2.6的示例代码如下:
[self tools_swizzleMethod:@selector(setConfiguration:) with:@selector(swizzle_setConfiguration:)];
步骤S2.1-S2.4自定义了一个公共函数,主要作用是交换目标函数的方法实现指针为替代函数的方法实现指针,达到修改代码和添加额外代码的目的。相对地,在步骤S2.5中,目标函数为SDK配置函数,在接下来的步骤S3中,目标函数为应用启动函数。该公共函数内部调用了系统自带的基于运行时的函数体对象获取函数和实现指针交换函数。对该公共函数的调用,可使得方法交换技术能够方便快捷地执行。
步骤S2.5-S2.6执行完成后,假设用户调用了SDK配置函数,传入项目唯一标识符(projectId)为1234567890,传入远端域名为https://www.xxx.com,传入当前运行环境为调试环境,则实际执行为S2.5所定义的替换函数,如图5所示,其流程为:1)调用了SDK配置函数,2)方法选择器对应S2.5所定义的替换函数实现,3)实际调用S2.5的替换函数,4)调用后,S2.5的替换函数内部实现以下功能:获取配置项信息和调用SDK配置函数。替换函数获取到包括项目唯一标识符、远端域名、当前运行环境的SDK配置信息。
步骤S3中,判断是否已初始化SDK,以应用启动函数(application:didFinishLaunchingWithOptions:)为例,包括以下步骤:
S3.1使用应用根类(UIApplication)的分类,定义替换应用启动函数的替换函数,替换函数的内部实现为:调用原来的应用启动函数,并在应用启动函数执行之后,通过SDK实例是否存在,判断SDK是否初始化成功。
S3.1的示例代码如下:
@implementation UIApplication (Swizzle)
-(BOOL)swizzle_application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)options {
BOOL result = [self swizzle_application:applicationdidFinishLaunchingWithOptions:options];
Static BOOL isSDKInit = [SDK sharedInstance]= null;
return result;
}
@end
S3.2调用S2定义的公共函数,传入应用启动函数和S3.1定义的替换应用启动函数,替换2个函数的具体实现指针。
S3.2的示例代码如下:
[self tools_swizzleMethod:@selector(application:didFinishLaunchingWithOptions:) with:@selector(swizzle_application:didFinishLaunchingWithOptions:)];
步骤S3.1-S3.2执行完成之后,当实际应用启动,则实际运行为S3.1所定义的替换函数,该替换函数动态获取了SDK的初始化与否,并同时调用了应用启动原函数的实现。
可替换地,步骤S3中,判断是否已初始化SDK,可以使用监听系统生命周期通知的方式,同样达成在应用启动时,判断是否已初始化SDK,包括以下步骤:
首先,注册通知监听回调,该监听的通知目标为应用冷启动通知;
然后,回调方法内直接判断是否初始化SDK。
步骤S4中,上述步骤S1-S3完成之后,获取得到的所有SDK信息包括:
是否集成SDK;
项目唯一标识符、远端域名和运行环境的SDK配置信息;
是否初始化SDK。
本辅助插件中,集成信息列表内容展示SDK集成步骤S1到S3是否全部完成;同时,展示所有SDK配置信息,方便开发工程师直观地核对配置代码填写是否错误。如图6所示,在不同的SDK集成步骤完成情况下的列表展示,包括SDK名称、SDK版本号、SDK初始化信息、唯一标识符、远端域名、当前运行环境;这些所有信息,可以通过一键截图的方式,直接将信息内容截图保存至本地,并同步给第三方供应商,协助排查问题。并且,辅助插件与SDK完全隔离,不影响SDK各项基本功能,无侵入。
对有需要集成SDK的端侧开发工程师来说,使用本技术方案所提供的SDK辅助插件设计,可有效提高开发工程师的集成效率,降低集成SDK所需的时间成本,有效投入到实际业务代码编写当中。其中,查看集成信息,可直接探查集成步骤完成效果;当SDK无法正常按需运行时,查看并对比插件中的配置信息列表,排查配置项正确性;另外地,当线上生产环境出现问题,使用插件获取SDK相关的信息同步给第三方供应商,协助排查问题。对于第三方供应商,借助SDK辅助插件,能够更好地了解到端侧上SDK的集成、执行情况。
第三方供应商还可以通过逆向技术,下载生产环境的应用安装包,使用动态库的方式来集成此插件。以iOS端为例,集成插件的过程如下:
Q1.安装开源的MonkeyDev开发集成环境,MonkeyDev是一个为iOS工具,可以便捷地安装并运行已解密的应用包;
Q2.下载生产环境的应用包(ipa),通过导入安装方式安装至手机上;
Q3.在手机上安装开源的动态代码执行工具包frida,并通过终端连接至该手机设备,砸壳获取解密后的应用包;
Q4.将解密后的应用包通过Q1中的集成环境安装至手机设备,并同时使用动态库方式集成SDK辅助插件,运行该应用。
通过以上步骤,即可协助排查SDK的线上运行问题。
除了技术方案中实施示例所述的iOS端,Android端、Web端,也可以使用面向切面编程,开发相同功能的插件达成发明效果。
比如,Android端上,利用字节码插桩技术(ASM),在SDK相关类(class)文件打包成可执行文件(dex)之前,使用自动化构建工具(Gradle)中所提供的用来修改类文件的标准接口(transform)对类文件进行字节码的修改,添加SDK信息展示。获取SDK是否在应用冷启动时初始化,具体实现过程如下:
T1.首先创建一个类访问者(ClassVisitor),重写方法访问(visitMethod),判断类名是否为主页面(mainActivity),并且方法名是否是应用回到前台回调(onResume),并返回一个方法访问者(MethodVisitor)对象。
T2.创建一个方法访问者对象,重写操作指令访问,判断指令是否是返回指令,并在该指令之前插入SDK是否初始化判断的指令。
T3.使用类读取器(ClassReader)读取原始类的字节码,并调用接收方法(accept),传入T1中创建的类访问者。
T4.使用类写入器(ClassWriter)将修改后的类的字节码输出到文件或内存中。
而在Web端,基于面向切面编程,使用装饰器模式,在页面加载完成后添加SDK是否初始化判断,具体实现过程如下:
P1.定义插入函数,内部通过SDK实例是否存在判断SDK是否初始化;
P2.定义一个装饰器函数,传入参数为原始函数和插入函数,返回一个新函数,新函数内部调用原始函数并获取结果,后置调用需要插入的函数,返回结果;
P3.给网页加载完毕的回调函数(window.onload)添加装饰器,传入参数为网页加载完毕的回调函数体和插入函数。
SDK业务相关的运行信息,比如推送SDK的推送内容,埋点SDK的埋点数据,也可以通过面向切面编程达成跟上述辅助插件相应的展示效果。
现有市面上的大部分SDK在使用中,一般通过日志打点方式输出SDK调试信息,如附录中BuglySDK的调试方式即为打开调试模式,其在运行期间将打印出调试日志;SDK的集成检查也是通过端侧开发工程师自行检测,如附录中极光推送SDK调试指南-SDK启动过程所述。本发明直接将SDK集成信息、配置信息,甚至运行的业务相关信息,可视化展示为列表形式,提供给端侧开发工程师、SDK开发工程师。并且,因为主要运用面向切面编程技术,对目标SDK无侵入,不影响目标SDK原有功能的代码结构和逻辑,在不修改原有代码的情况下添加辅助代码。
本发明流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为表示包括一个或多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,可以实现在任何计算机刻度介质中,以供指令执行系统、装置或设备,所述计算机可读介质可以是任何包含存储、通信、传播或传输程序以供执行系统、装置或设备使用。包括只读存储器、磁盘或光盘等。
在本说明书的描述中,参考术语“实施例”、“示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。此外,本领域的技术人员可以在不产生矛盾的情况下,将本说明书中描述的不同实施例或示例以及其中的特征进行结合或组合。
上述内容虽然已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型等更新操作。
Claims (9)
1.基于面向切面编程的无侵入SDK辅助集成插件的实现方法,运用面向切面编程技术,运行时获取SDK各项信息,其特征在于,所述方法包括以下步骤:
S1.获取集成信息;通过运行时获取SDK内部类是否存在,判断应用源代码中是否包含SDK;
S2.获取配置信息;通过iOS平台上的运行时方法交换技术,获取SDK的配置函数的切入点,从而得到项目唯一标识符、远端域名和、或当前运行环境的配置信息;
S3.获取初始化信息;通过运行时方法交换技术,获取应用启动的相关函数实现的切入点,判断是否已初始化SDK;
S4.集成信息列表内容展示SDK集成步骤S1到S3是否全部完成;
其中,第三方供应商通过逆向技术,下载生产环境的应用安装包,使用动态库的方式来集成插件,在iOS端,集成插件的过程如下:
Q1.安装开源的MonkeyDev开发集成环境;
Q2.下载生产环境的应用包ipa,通过导入安装方式安装;
Q3.安装开源的动态代码执行工具包frida,并通过终端连接至设备,砸壳获取解密后的应用包;
Q4.将解密后的应用包通过Q1中的集成环境安装至设备,并同时使用动态库方式集成SDK辅助插件,运行该应用。
2.根据权利要求1所述的基于面向切面编程的无侵入SDK辅助集成插件的实现方法,其特征在于,步骤S1中,在SDK中实现初始化相关的类时,使用类名导出字符串函数NSClassFromString,导出类名,若得到的类名为非空字符串,则判断应用源代码中包含SDK。
3.根据权利要求1所述的基于面向切面编程的无侵入SDK辅助集成插件的实现方法,其特征在于,步骤S2中获取配置信息的实现过程如下:
S2.1使用系统根类NSObject的分类,定义运用方法交换技术的公共函数tools_swizzleMethod,接受参数为原方法选择器和替换方法选择器;
S2.2公共函数内,调用函数体对象获取函数class_getInstanceMethod,传入当前SDK对象,以及原方法选择器,获取原函数对应的函数体对象;
S2.3调用函数体对象获取函数class_getInstanceMethod,传入当前SDK对象,以及替换方法选择器,获取替换函数对应的函数体对象;
S2.4调用实现指针交换函数method_exchangeImplementation,传入原函数的函数体对象、替换函数的函数体对象,交换原函数和替换函数的实现指针指向;
S2.5使用SDK配置函数所在类的分类,定义替换配置函数的替换函数,替换函数其内部实现为:通过所传入的所有参数与配置项名称做对应,获取配置项信息,并调用SDK配置函数,以保留原有功能;
S2.6调用S2.1定义的公共函数,传入SDK配置函数的方法选择器作为目标函数的方法选择器,传入S2.5定义的替换函数的方法选择器,替换2个函数的具体实现指针。
4.根据权利要求3所述的基于面向切面编程的无侵入SDK辅助集成插件的实现方法,其特征在于,步骤S3中,判断是否已初始化SDK,包括以下步骤:
S3.1使用应用根类UIApplication的分类,定义替换应用启动函数的替换函数,替换函数的内部实现为:调用原应用启动函数,并在应用启动函数执行之后,通过SDK实例是否存在,判断SDK是否初始化成功;
S3.2调用S2.1定义的公共函数,传入应用启动函数和S3.1定义的替换应用启动函数,替换2个函数的具体实现指针。
5.根据权利要求1所述的基于面向切面编程的无侵入SDK辅助集成插件的实现方法,其特征在于,步骤S3中,判断是否已初始化SDK,使用监听系统生命周期通知的方式,包括以下步骤:
首先,注册通知监听回调,该监听的通知目标为应用冷启动通知;
然后,回调方法内直接判断是否初始化SDK。
6.根据权利要求1所述的基于面向切面编程的无侵入SDK辅助集成插件的实现方法,其特征在于,步骤S4中,获取得到的所有SDK信息包括:
是否集成SDK;
项目唯一标识符、远端域名和运行环境的SDK配置信息;
是否初始化SDK。
7.根据权利要求1-6任一项所述的基于面向切面编程的无侵入SDK辅助集成插件的实现方法,其特征在于,所述插件可应用于iOS端、Android端和Web端。
8.根据权利要求7所述的基于面向切面编程的无侵入SDK辅助集成插件的实现方法,其特征在于,Android端上,利用字节码插桩技术ASM,在SDK相关类文件打包成可执行文件之前,使用自动化构建工具Gradle中所提供的用来修改类文件的标准接口transform对类文件进行字节码的修改,添加SDK信息展示。
9.根据权利要求7所述的基于面向切面编程的无侵入SDK辅助集成插件的实现方法,其特征在于,在Web端,基于面向切面编程,使用装饰器模式,在页面加载完成后添加SDK是否初始化判断。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310399368.9A CN116126427B (zh) | 2023-04-14 | 2023-04-14 | 基于面向切面编程的无侵入sdk辅助集成插件的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310399368.9A CN116126427B (zh) | 2023-04-14 | 2023-04-14 | 基于面向切面编程的无侵入sdk辅助集成插件的实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116126427A CN116126427A (zh) | 2023-05-16 |
CN116126427B true CN116126427B (zh) | 2023-07-18 |
Family
ID=86299450
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310399368.9A Active CN116126427B (zh) | 2023-04-14 | 2023-04-14 | 基于面向切面编程的无侵入sdk辅助集成插件的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116126427B (zh) |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6895581B1 (en) * | 2000-03-30 | 2005-05-17 | Microsoft Corporation | Replaceable classes and virtual constructors for object-oriented programming languages |
CN106778271A (zh) * | 2016-12-15 | 2017-05-31 | 华中科技大学 | 一种安卓加固插件的逆向处理方法 |
CN110286898A (zh) * | 2019-05-31 | 2019-09-27 | 福建新大陆软件工程有限公司 | 无埋点的数据采集方法及装置 |
CN111444065A (zh) * | 2020-05-18 | 2020-07-24 | 江苏电力信息技术有限公司 | 一种基于AspectJ的移动端性能指标监控方法 |
CN111832014A (zh) * | 2020-07-02 | 2020-10-27 | 北京智游网安科技有限公司 | 基于动态加载的Java SDK代码加解密方法及终端 |
CN111914251A (zh) * | 2020-07-03 | 2020-11-10 | 上海理想信息产业(集团)有限公司 | 一种基于混合控制技术的智能终端安全保护方法及系统 |
CN112230903A (zh) * | 2020-10-12 | 2021-01-15 | 上海赛可出行科技服务有限公司 | 一种基于iOS应用的轻量级解耦式埋点方法及装置 |
CN113111347A (zh) * | 2021-02-26 | 2021-07-13 | 全球能源互联网研究院有限公司 | 一种Android应用的威胁处置方法和安全监测探针 |
CN114328144A (zh) * | 2020-09-27 | 2022-04-12 | 中国移动通信有限公司研究院 | 用户操作数据采集方法、处理方法及设备 |
CN115391177A (zh) * | 2022-07-25 | 2022-11-25 | 银盛支付服务股份有限公司 | 一种iOS项目内存泄露预警方法及系统 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20020087958A1 (en) * | 2000-04-20 | 2002-07-04 | International Business Machines Corporation | Method and apparatus of transforming a class |
TWI649694B (zh) * | 2017-10-30 | 2019-02-01 | 國立臺灣大學 | 一種安卓動態框架及其方法 |
-
2023
- 2023-04-14 CN CN202310399368.9A patent/CN116126427B/zh active Active
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6895581B1 (en) * | 2000-03-30 | 2005-05-17 | Microsoft Corporation | Replaceable classes and virtual constructors for object-oriented programming languages |
CN106778271A (zh) * | 2016-12-15 | 2017-05-31 | 华中科技大学 | 一种安卓加固插件的逆向处理方法 |
CN110286898A (zh) * | 2019-05-31 | 2019-09-27 | 福建新大陆软件工程有限公司 | 无埋点的数据采集方法及装置 |
CN111444065A (zh) * | 2020-05-18 | 2020-07-24 | 江苏电力信息技术有限公司 | 一种基于AspectJ的移动端性能指标监控方法 |
CN111832014A (zh) * | 2020-07-02 | 2020-10-27 | 北京智游网安科技有限公司 | 基于动态加载的Java SDK代码加解密方法及终端 |
CN111914251A (zh) * | 2020-07-03 | 2020-11-10 | 上海理想信息产业(集团)有限公司 | 一种基于混合控制技术的智能终端安全保护方法及系统 |
CN114328144A (zh) * | 2020-09-27 | 2022-04-12 | 中国移动通信有限公司研究院 | 用户操作数据采集方法、处理方法及设备 |
CN112230903A (zh) * | 2020-10-12 | 2021-01-15 | 上海赛可出行科技服务有限公司 | 一种基于iOS应用的轻量级解耦式埋点方法及装置 |
CN113111347A (zh) * | 2021-02-26 | 2021-07-13 | 全球能源互联网研究院有限公司 | 一种Android应用的威胁处置方法和安全监测探针 |
CN115391177A (zh) * | 2022-07-25 | 2022-11-25 | 银盛支付服务股份有限公司 | 一种iOS项目内存泄露预警方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN116126427A (zh) | 2023-05-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20110078667A1 (en) | Static code analysis for packaged application customization | |
CA2698066A1 (en) | System and method for remotely compiling multi-platform native applications for mobile devices | |
CN111740948B (zh) | 数据包发布方法、动态更新方法、装置、设备及介质 | |
CN111399840B (zh) | 一种模块开发方法及装置 | |
US10866803B2 (en) | Generating interaction libraries | |
CN108345458B (zh) | 一种静态编译语言与脚本语言的调用方法及系统 | |
CN111913889A (zh) | 一种测试系统搭建方法及测试系统 | |
CN110659210A (zh) | 一种信息获取方法、装置、电子设备及存储介质 | |
KR101005498B1 (ko) | 테스트 라이브러리를 이용하는 휴대폰 어플리케이션 검증시스템 및 그 방법 | |
CN109739704A (zh) | 一种接口测试方法、服务端及计算机可读存储介质 | |
CN116974620A (zh) | 应用程序的生成方法、运行方法以及相应的装置 | |
CN114895935A (zh) | 刷写车辆ecu的方法、装置、电子设备及存储介质 | |
CN114461223A (zh) | 一种代码生成方法、装置及终端设备 | |
CN111552480B (zh) | 跨平台编译方法、装置、设备及可读存储介质 | |
CN116126427B (zh) | 基于面向切面编程的无侵入sdk辅助集成插件的实现方法 | |
CN110147294B (zh) | 调试信息的获取方法、装置、终端及计算机可读存储介质 | |
CN111459810A (zh) | 构建应用程序的方法、编程设备和计算机可读存储介质 | |
CN111258802A (zh) | 捕获应用程序崩溃信息的方法及相关设备 | |
CN109189591B (zh) | 用于调用应用组件的方法和装置 | |
CN113641594B (zh) | 跨端自动化测试方法以及相关装置 | |
CN110826074A (zh) | 一种应用漏洞检测方法、装置和计算机可读存储介质 | |
CN113590179B (zh) | 插件检测方法、装置、电子设备及存储介质 | |
CN113778451B (zh) | 文件加载方法、装置、计算机系统和计算机可读存储介质 | |
CN114063985A (zh) | Web应用的插件开发方法、装置、电子设备、介质和程序 | |
CN113760291A (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 |