一、做这个工具缘由:
第一、很多测试同学比较关注App质量,但是他们却没有Xcode运行环境,他们对于质量数据无法很有效的查看。
第二、App端实时的查看App的质量数据,不依赖IDE,方便快捷直观。
第三、实时采集性能数据,为后期结合测试平台产生性能数据报表提供数据来源
二、
1.app信息
这个没什么好说的。
2.沙盒浏览
2.1用filemanager做了一个文件管理器
contentsOfDirectoryAtPath:读取文件目录下信息
UIWebView、UITextView都有dataDetectorTypes属性,设置了该属性,系统可以自动检测电话、链接、地址、日历、邮箱。
QLPreviewController预览文件
2.2沙盒文件传递电脑 用 UIActivityViewController
2.3浏览db
多列 可以拖动 scrollView add tableView
NSDictionary *dict = self.dataAtTable.firstObject;
headerView.dataArray = [dict allKeys];
分割线间距: 偏距1px,露出UITableView背景色
4.地理位置定位
每一秒钟采样一次。
5.子线程UI
hook 判断是否再[NSThread mainthread],通过第三方库BSBacktraceLogger 上报堆栈信息。
setNeedsLayout 2、setNeedsDisplay 3、setNeedsDisplayInRect
6.H5任意门
由于垮app bridge 是不一样的。用block 开一个入口,传递URL进来
扫描二维码:
使用这个类,基本只需要以下几个步骤:
a、 创建:AVCaptureSession
b、 添加输入源 :AVCaptureDevice 、AVCaptureDeviceInput
c、 添加输出 :AVCaptureMetadataOutput
d、 添加预览图层 :AVCaptureVideoPreviewLayer
e、 开始捕捉 :AVCaptureSession startRunning
f、 结束捕捉 :AVCaptureSession stopRunning
kvo 监听是否完成扫描,来移除动画。
7.FPS
参见JPFPSStatus源码分析
8、获取CPU逻辑
先通过task_threads获取所有线程信息,再遍历每个线程thread_info,当线程不处于空闲状态,把 每个 tot_cpu += basic_info_th->cpu_usage / (float)TH_USAGE_SCALE加起来。
9、获取内存逻辑
task_info()得到task_vm_info_data_t信息,task_vm_info_data_t里面一个字段phys_footprint。
10.流量监测逻辑
NSURLProtocol和DoraemonURLSessionDemux(跟AF很像处理拦截数据)
hook NSURLSessionConfiguration类defaultSessionConfiguration和ephemeralSessionConfiguration.
sessionConfig.protocolClasses =DoraemonNSURLProtocol.class;
上行流量:headersLength(要加上cookie 头长度) + bodyLength
下行流量:httpResponse.allHeaderFields
HTTPBody: 先判断有没有 request.HTTPBody,没有从request.HTTPBodyStream 循环去读取;
totalDuration:当前时间-request.startTime.doubleValue;
11.卡顿检测逻辑:
设置一个枚举类型:监控开始 和 停止、一个卡顿阈值。
创建一个监控线程pingThread,pingThread。
a.需要再app活跃才监控
监听UIApplicationDidBecomeActiveNotification和UIApplicationDidEnterBackgroundNotification
b.
创建一个信号量dispatch_semaphore_create。
worker线程每隔一小段时间(delta)ping以下主线程,如果主线程此时有空,必然能接收到这个通知,并pong以下(发送另一个NSNotification),如果worker线程超过delta时间没有收到pong的回复,那么可以推测UI线程必然在处理其他任务了,此时我们执行第二步操作,暂停UI线程,并打印出当前UI线程的函数调用栈
dispatch_semaphore_wait(self.semaphore, dispatch_time(DISPATCH_TIME_NOW, 5.0 * NSEC_PER_SEC));
最长上报时间范围:卡顿阈值-信号量5秒
12.Crash逻辑
NSSetUncaughtExceptionHandler 这几种系统信号一起注册一下。
- (void)signalRegister {
DoraemonSignalRegister(SIGABRT);
DoraemonSignalRegister(SIGBUS);
DoraemonSignalRegister(SIGFPE);
DoraemonSignalRegister(SIGILL);
DoraemonSignalRegister(SIGPIPE);
DoraemonSignalRegister(SIGSEGV);
DoraemonSignalRegister(SIGSYS);
DoraemonSignalRegister(SIGTRAP);
}
参考:
https://www.jianshu.com/p/00763123dbc4
https://www.jianshu.com/p/4091870ca3f0
//iOS 性能监控方案(上篇)
http://www.cocoachina.com/ios/20170629/19680.html
//iOS 性能监控方案(下篇)
http://www.cocoachina.com/ios/20170629/19680.html