网易APM hook方案探索-郑文
需积分: 0 201 浏览量
更新于2016-08-24
收藏 1.25MB PDF 举报
### 网易APM Hook方案探索
#### 背景与选型
在软件开发过程中,为了确保应用程序能够高效稳定地运行,开发者们需要借助一系列的工具和技术来进行性能监测和管理。这其中,应用性能管理(APM)系统就显得尤为重要。APM系统通过收集、分析应用程序在运行过程中的各种数据,帮助开发者快速定位并解决潜在的问题。网易APM项目旨在通过hook技术实现对应用的非侵入式监控,降低接入成本的同时提高监控的细粒度。
#### APM流程概述
APM流程主要涉及几个关键环节:埋点、数据挖掘、数据预处理以及数据上报。具体而言:
- **埋点**:即在应用程序的关键位置放置监控代码,以便捕捉应用程序的行为数据。
- **数据挖掘**:对收集到的数据进行深度分析,提取有价值的信息。
- **数据预处理**:清洗数据,确保其准确性和可用性。
- **数据上报**:将处理后的数据发送至服务器端进行进一步的分析处理。
#### 埋点技术面临的挑战
在实现埋点的过程中,面临着几个主要的技术挑战:
- **接入成本**:传统埋点方式往往需要修改大量代码,增加了维护成本。
- **产品基础框架选型不一**:不同的产品可能会使用不同的框架或技术栈,这使得统一的埋点方案难以实现。
- **重复功能埋点**:多个产品可能存在相同的功能,但各自独立实现埋点,导致资源浪费。
- **源码限制**:对于封闭的第三方服务,缺乏源码访问权限限制了埋点技术的应用范围。
#### Hook技术详解
为了解决上述挑战,网易APM项目采用了hook技术来实现对应用的监控。根据操作时机的不同,hook技术可以分为运行期Hook和编译期Hook两种类型。
##### 运行期Hook
- **动态埋点**:允许在应用运行时动态地添加或删除监控点,提高了灵活性。
- **系统API的hook**:通过对系统级API的hook,可以在不影响应用核心逻辑的情况下收集到更丰富的数据。
- **虚拟机版本兼容**:考虑到不同设备上Android虚拟机版本的差异,运行期Hook技术需要具备良好的兼容性。
##### 编译期Hook
- **预先埋点**:在应用构建阶段就完成埋点工作,避免了运行时的性能开销。
- **hook业务代码**:通过对业务代码的hook,可以更加精确地监控应用行为。
- **兼容性佳**:由于在编译阶段就完成了埋点,因此对不同版本的Android虚拟机有较好的兼容性。
- **运行期轻量**:相比运行期Hook,编译期Hook对应用运行时的影响较小。
#### 构建工具的选择与应用
为了更好地集成hook技术,网易APM项目考虑了两种主流的构建工具:Ant和Gradle。
##### Ant构建的Hook方案
- **hookProcessBuilder.start**:通过修改`ProcessBuilder`的启动参数,加入`javaagent`参数以加载特定的Agent。
- **hookMain.processClass**:修改`com.android.dx.command.dexer.Main`类的`processClass`方法,实现在编译阶段对字节码的修改。
- **应用bytecode植入监控代码**:在字节码级别植入监控代码,实现对特定方法调用的监控。
##### Gradle构建的Hook方案
- **动态挂载Agent**:对于Gradle版本小于1.5的情况,可以采用动态挂载Agent的方式实现hook。
- **Transform API**:Gradle 1.5及以上版本引入了Transform API,可以通过该API在构建阶段对字节码进行修改。
- **APMTransform优先执行**:确保APM相关的Transform在系统Transform之前执行,以避免与其他插件冲突。
#### 具体应用场景
网易APM项目的具体应用场景包括但不限于以下几方面:
- **界面卡顿**:监控应用启动速度、文件读写、SQLite数据库操作、内存占用等,帮助开发者优化用户体验。
- **网络监控**:监控HTTP请求的状态码、流量、响应时间等,并对外置网络库进行定制化的扩展,提高网络请求的效率。
- **异常流量报警熔断**:实现自动化的异常检测与处理机制,保障系统的稳定运行。
- **网络诊断**:提供网络诊断工具,帮助开发者快速定位网络问题。
- **私用通道数据上报**:利用私有的数据上报通道,确保敏感数据的安全传输。
网易APM项目通过采用hook技术实现了对应用的全面监控,在降低接入成本的同时提升了监控的精度与效率。这一解决方案不仅适用于网易内部的应用,也具有广泛的推广价值。