<!-- TOC depthFrom:1 depthTo:6 withLinks:1 updateOnSave:1 orderedList:0 -->
- [一 概述](#一-概述)
- [二 系统](#二-系统)
- [2.1 设备信息](#21-设备信息)
- [2.2 设备硬编码](#22-设备硬编码)
- [三 磁盘](#三-磁盘)
- [四 CPU](#四-CPU)
- [五 内存](#五-内存)
- [六 启动时间](#六-启动时间)
- [6.1 冷启动](#61-冷启动)
- [6.1.1 main() 之前过程](#611-main-之前过程)
- [6.1.2 main() 之后过程](#612-main-之后过程)
- [七 FPS](#七-FPS)
- [八 卡顿](#八-卡顿)
- [九 Crash 防护](#九-Crash-防护)
- [十 Crash 记录](#十-Crash-记录)
- [十一 网络监控](#十一-网络监控)
- [11.1 HTTPDNS](#111-HTTPDNS)
- [11.2 系统网络](#112-系统网络)
- [11.3 流量监控](#113-流量监控)
- [待完善功能](#待完善功能)
- [参考资料](#参考资料)
<!-- /TOC -->
## 一 概述
APM 的全称是 Application performance management,即应用性能管理,通过对应用的可靠性、稳定性等方面的监控,进而达到快速修复问题、提高用户体验的目的。将在以下几个方面对数据进行监控,包括 **CPU 占有率,内存使用情况,磁盘使用情况,FPS,冷启动时间,卡顿,闪退,闪退防护,HTTPDNS,网络流量**等。
此仓库为 APM 数据采集调研产物,主要是对性能监控实现进行了统一封装。其中 SDK 为实现代码,Demo 为调用详情。
## 二 系统
### 2.1 设备信息
**实现功能:**
- 设备型号
- 设备系统名称
- 设备系统版本
- 设备启动时间
- 设备信息
### 2.2 设备硬编码
通过设备机器名称(如“iPhone1,1”)硬编码方式输出相关数据。数据来自[维基百科](https://zh.wikipedia.org/wiki/IOS%E8%AE%BE%E5%A4%87%E5%88%97%E8%A1%A8#iPhone_%E5%9E%8B%E8%99%9F)以及[theiphonewiki](https://www.theiphonewiki.com/wiki/List_of_iPhones)。
**实现功能:**
- 设备名称
- CPU 名称
- CPU 频率
- 协处理器名称
- 电池容量
- 电池电压
- 屏幕尺寸
- 屏幕 PPI
## 三 磁盘
**实现功能:**
- 磁盘总空间
- 磁盘使用空间
- 磁盘可用空间
- 文件大小
- 目录大小
## 四 CPU
> 任务(task)是一种容器(container)对象,虚拟内存空间和其他资源都是通过这个容器对象管理的,这些资源包括设备和其他句柄。严格地说,**Mach** 的任务并不是其他操作系统中所谓的进程,因为 **Mach** 作为一个微内核的操作系统,并没有提供“进程”的逻辑,而只是提供了最基本的实现。不过在 BSD 的模型中,这两个概念有1:1的简单映射,每一个 BSD 进程(也就是 OS X 进程)都在底层关联了一个 Mach 任务对象。
上面引用的是《OS X and iOS Kernel Programming》对 Mach task 的描述,Mach task 可以看作一个机器无关的 thread 执行环境的抽象一个 task 包含它的线程列表。内核提供了 `task_threads` API 调用获取指定 task 的线程列表,然后可以通过 `thread_info ` API 调用来查询指定线程的信息。
`task_threads` 将 `target_task` 任务中的所有线程保存在 `act_list` 数组中,数组中包含 `act_listCnt` 个条目。
`thread_info` 查询 `flavor` 指定的 thread 信息,将信息返回到长度为 `thread_info_outCnt` 字节的 `thread_info_out` 缓存区中,
**代码实现:**
``` objective-c
#import <mach/mach.h>
#import <assert.h>
+ (CGFloat)appCpuUsage {
kern_return_t kr;
task_info_data_t tinfo;
mach_msg_type_number_t task_info_count;
task_info_count = TASK_INFO_MAX;
kr = task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)tinfo, &task_info_count);
if (kr != KERN_SUCCESS) {
return -1;
}
thread_array_t thread_list;
mach_msg_type_number_t thread_count;
thread_info_data_t thinfo;
mach_msg_type_number_t thread_info_count;
thread_basic_info_t basic_info_th;
// get threads in the task
kr = task_threads(mach_task_self(), &thread_list, &thread_count);
if (kr != KERN_SUCCESS) {
return -1;
}
long total_time = 0;
long total_userTime = 0;
CGFloat total_cpu = 0;
int j;
// for each thread
for (j = 0; j < (int)thread_count; j++) {
thread_info_count = THREAD_INFO_MAX;
kr = thread_info(thread_list[j], THREAD_BASIC_INFO,
(thread_info_t)thinfo, &thread_info_count);
if (kr != KERN_SUCCESS) {
return -1;
}
basic_info_th = (thread_basic_info_t)thinfo;
if (!(basic_info_th->flags & TH_FLAGS_IDLE)) {
total_time = total_time + basic_info_th->user_time.seconds + basic_info_th->system_time.seconds;
total_userTime = total_userTime + basic_info_th->user_time.microseconds + basic_info_th->system_time.microseconds;
total_cpu = total_cpu + basic_info_th->cpu_usage / (float)TH_USAGE_SCALE * kMaxPercent;
}
}
kr = vm_deallocate(mach_task_self(), (vm_offset_t)thread_list, thread_count * sizeof(thread_t));
assert(kr == KERN_SUCCESS);
return total_cpu;
}
```
**实现功能:**
- CPU架构
- CPU核数
- 系统CPU使用率
- 当前应用CPU使用率
**注意:由于安全性考虑,苹果已经禁止访问内核变量来获取 CPU 频率。现实现方法是通过硬编码方式获取 CPU 频率,新机发布需更新。**
## 五 内存
`mach_task_basic_info` 结构体存储了 Mach task 的内存使用信息,其中 `resident_size` 就是应用使用的物理内存大小,`virtual_size` 是虚拟内存大小。
与获取 CPU 占用率类似,在调用 `task_info` API 时,`target_task` 参数传入的是 `mach_task_self()`,表示获取当前的 Mach task,另外 flavor 参数传的是 `MACH_TASK_BASIC_INFO`,使用这个类型会返回 `mach_task_basic_info` 结构体,表示返回 `target_task` 的基本信息,比如 task 的挂起次数和驻留页面数量。
**代码实现:**
``` objective-c
+ (unsigned long long)getAppRAMUsage {
struct mach_task_basic_info info;
mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT;
kern_return_t kr = task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)&info, &count);
if (kr != KERN_SUCCESS) {
return 0;
}
return info.resident_size;
}
+ (fs_system_ram_usage)getSystemRamUsageStruct {
vm_statistics64_data_t vmStats;
mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;
kern_return_t kr = host_statistics(mach_host_self(),
HOST_VM_INFO,
(host_info_t)&vmStats,
&infoCount);
fs_system_ram_usage system_memory_usage = {0, 0, 0};
if (kr != KERN_SUCCESS) {
return system_memory_usage;
}
system_memory_usage.used_size = (vmStats.active_count + vmStats.wire_count + vmStats.inactive_count) * vm_kernel_page_size;
system_memory_usage.available_size = (vmStats.free_count) * vm_kernel_page_size;
system_memory_usage.total_size = [NSProcessInfo processInfo].physicalMemory;
return system_memory_usage;
}
```
**实现功能:**
- 系统总内存
- 系统使用内存
- 系统可用内存
- 当前应用内存使用量
## 六 启动时间
### 6.1 冷启动
t(App总启动时间) = t1(main()之前的加载时间)+ t2(main()之后的加载时间)
#### 6.1.1 main() 之前过程
t1 = 系统先读取App的可执行文件(`Mach-O` 文件),从里面获得 `dyld` 的路径,加载 `dyld`,`dyld` 去初始化运行环境,开启缓存策略,加载程序相关依赖库(其中也包含我们的可执行文件),并对这些库进行链接,最后调用每个依赖库的初始化方法,在这一步, `runtime` 被初始化。当所有依赖�
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
iOS_APM_(性能监控)_-_数据采集实现调研。APM_监控,包含_系统信息、磁盘、CPU、内存_FSAPMSDK.zip (232个子文件)
FSAPM SDK 日志库设计(待实现).docx 225KB
FSAPM SDK 开发文档.docx 117KB
FSAPM SDK 数据上报设计(待实现).docx 23KB
FSAPMSDK+Namespace.h 8KB
JJException.h 4KB
Reachability.h 4KB
JJExceptionProxy.h 3KB
FSSystemMonitor.h 3KB
FSBayMaxCrashInfo.h 2KB
FSBayMaxProtector.h 2KB
NSObject+SwizzleHook.h 2KB
FSDeviceInfo.h 2KB
FSAPMLog.h 2KB
FSANRMonitor.h 2KB
FSURLProtocol.h 2KB
SystemMonitorViewModel.h 1KB
FSCPUUsage.h 1KB
SimulatorManager.h 1KB
FSHardcodeDeviceInfo.h 1KB
SimulatorHeader.h 1KB
FSNetworkInfo.h 1KB
FSCrashMonitor.h 1KB
FSNetworkMonitor.h 1KB
FSAPMHttpDNS.h 1KB
FSFPSMonitor.h 988B
FSNetworkFlow.h 985B
FSBatteryMonitor.h 984B
PPDNSMappingManager.h 945B
FSRAMUsage.h 910B
SettingTableCellModel.h 884B
FSBatteryInfo.h 882B
FSAPMSDK.h 880B
FSAPMGlobalDefine.h 868B
SimulatorBubbleView.h 828B
FSDiskUsage.h 802B
SimulatorTestBaeViewController.h 780B
FSCrashInfo.h 754B
JJExceptionMacros.h 748B
FSFPSInfo.h 745B
FSAPMAPIDefine.h 660B
SimulatorViewModel.h 655B
PPDomainRequestResult.h 636B
SettingTableViewCell.h 633B
PPWeakTimer.h 566B
SimulatorTestViewModel.h 537B
AboutViewModel.h 532B
SimulatorDataViewController.h 461B
FSANRInfo.h 455B
FSBackTraceInfo.h 437B
SettingViewModel.h 407B
FSAPMManager.h 407B
FSWeakProxy.h 397B
SystemDetailViewController.h 395B
PPMappingNode.h 379B
NSURLSessionConfiguration+FSAPM.h 363B
PPResolvedUrl.h 360B
NSObject+DeallocBlock.h 351B
NavigationController.h 346B
SimulatorDataDetailViewController.h 340B
SimulatorTimerViewController.h 339B
FSAPMNotificationDefine.h 336B
SystemMonitorViewController.h 334B
PPDNSReporter.h 327B
NSMutableAttributedString+MutableAttributedStringHook.h 326B
SimulatorNetworkViewController.h 322B
SimulatorBayMaxViewController.h 320B
SimulatorCrashViewController.h 318B
SimulatorANRViewController.h 314B
NSMutableSet+MutableSetHook.h 310B
PPDNSMapping.h 310B
PPMappingUtil.h 305B
SimulatorNotificationViewController.h 299B
NSMutableDictionary+MutableDictionaryHook.h 296B
NSAttributedString+AttributedStringHook.h 291B
NSNotificationCenter+ClearNotification.h 290B
PPIPValidator.h 288B
SimulatorZombieViewController.h 287B
NSObject+UnrecognizedSelectorHook.h 281B
NSMutableString+MutableStringHook.h 276B
SimulatorViewController.h 275B
NSSet+SetHook.h 275B
AppDelegate.h 273B
SettingViewController.h 271B
MonitorViewController.h 271B
NSMutableArray+MutableArrayHook.h 271B
AboutViewController.h 267B
FSStartupTimeMonitor.h 265B
TabBarController.h 263B
NSDictionary+DictionaryHook.h 261B
NSString+StringHook.h 241B
NSTimer+CleanTimer.h 240B
NSObject+KVOCrash.h 237B
NSArray+ArrayHook.h 236B
NSObject+ZombieHook.h 235B
FSAPMSDKVendor.h 213B
ViewController.h 211B
Contents.json 2KB
Contents.json 62B
LICENSE 1KB
FSHardcodeDeviceInfo.m 57KB
共 232 条
- 1
- 2
- 3
资源评论
好家伙VCC
- 粉丝: 1790
- 资源: 9088
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功