DoraemonKit性能源码分析

1,048 阅读2分钟

欢迎关注我的github和简书、掘金:

github:
github.com/suzhiqiu

简书:

www.jianshu.com/u/28de8a97f…


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。


![image.png](https://upload-images.jianshu.io/upload_images/3946505-c221312ee7ea3a2c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


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/00763123dbc4)