一、做這個(gè)工具緣由:
第一、很多測(cè)試同學(xué)比較關(guān)注App質(zhì)量,但是他們卻沒有Xcode運(yùn)行環(huán)境,他們對(duì)于質(zhì)量數(shù)據(jù)無法很有效的查看。
第二、App端實(shí)時(shí)的查看App的質(zhì)量數(shù)據(jù),不依賴IDE,方便快捷直觀。
第三、實(shí)時(shí)采集性能數(shù)據(jù),為后期結(jié)合測(cè)試平臺(tái)產(chǎn)生性能數(shù)據(jù)報(bào)表提供數(shù)據(jù)來源
二、
1.app信息
這個(gè)沒什么好說的。
2.沙盒瀏覽
2.1用filemanager做了一個(gè)文件管理器
contentsOfDirectoryAtPath:讀取文件目錄下信息
UIWebView、UITextView都有dataDetectorTypes屬性,設(shè)置了該屬性,系統(tǒng)可以自動(dòng)檢測(cè)電話、鏈接、地址、日歷、郵箱。
QLPreviewController預(yù)覽文件
2.2沙盒文件傳遞電腦 用 UIActivityViewController
2.3瀏覽db
多列 可以拖動(dòng) scrollView add tableView
NSDictionary *dict = self.dataAtTable.firstObject;
headerView.dataArray = [dict allKeys];
分割線間距: 偏距1px,露出UITableView背景色
4.地理位置定位
每一秒鐘采樣一次。
5.子線程UI
hook 判斷是否再[NSThread mainthread],通過第三方庫BSBacktraceLogger 上報(bào)堆棧信息。
setNeedsLayout 2、setNeedsDisplay 3、setNeedsDisplayInRect
6.H5任意門
由于垮app bridge 是不一樣的。用block 開一個(gè)入口,傳遞URL進(jìn)來
掃描二維碼:
使用這個(gè)類,基本只需要以下幾個(gè)步驟:
a、 創(chuàng)建:AVCaptureSession
b、 添加輸入源 :AVCaptureDevice 、AVCaptureDeviceInput
c、 添加輸出 :AVCaptureMetadataOutput
d、 添加預(yù)覽圖層 :AVCaptureVideoPreviewLayer
e、 開始捕捉 :AVCaptureSession startRunning
f、 結(jié)束捕捉 :AVCaptureSession stopRunning
kvo 監(jiān)聽是否完成掃描,來移除動(dòng)畫。
7.FPS
參見JPFPSStatus源碼分析
8、獲取CPU邏輯
先通過task_threads獲取所有線程信息,再遍歷每個(gè)線程thread_info,當(dāng)線程不處于空閑狀態(tài),把 每個(gè) tot_cpu += basic_info_th->cpu_usage / (float)TH_USAGE_SCALE加起來。
9、獲取內(nèi)存邏輯
task_info()得到task_vm_info_data_t信息,task_vm_info_data_t里面一個(gè)字段phys_footprint。
10.流量監(jiān)測(cè)邏輯
NSURLProtocol和DoraemonURLSessionDemux(跟AF很像處理攔截?cái)?shù)據(jù))
hook NSURLSessionConfiguration類defaultSessionConfiguration和ephemeralSessionConfiguration.
sessionConfig.protocolClasses =DoraemonNSURLProtocol.class;
上行流量:headersLength(要加上cookie 頭長度) + bodyLength
下行流量:httpResponse.allHeaderFields
HTTPBody: 先判斷有沒有 request.HTTPBody,沒有從request.HTTPBodyStream 循環(huán)去讀??;
totalDuration:當(dāng)前時(shí)間-request.startTime.doubleValue;
11.卡頓檢測(cè)邏輯:
設(shè)置一個(gè)枚舉類型:監(jiān)控開始 和 停止、一個(gè)卡頓閾值。
創(chuàng)建一個(gè)監(jiān)控線程pingThread,pingThread。
a.需要再app活躍才監(jiān)控
監(jiān)聽UIApplicationDidBecomeActiveNotification和UIApplicationDidEnterBackgroundNotification
b.
創(chuàng)建一個(gè)信號(hào)量dispatch_semaphore_create。

worker線程每隔一小段時(shí)間(delta)ping以下主線程,如果主線程此時(shí)有空,必然能接收到這個(gè)通知,并pong以下(發(fā)送另一個(gè)NSNotification),如果worker線程超過delta時(shí)間沒有收到pong的回復(fù),那么可以推測(cè)UI線程必然在處理其他任務(wù)了,此時(shí)我們執(zhí)行第二步操作,暫停UI線程,并打印出當(dāng)前UI線程的函數(shù)調(diào)用棧
dispatch_semaphore_wait(self.semaphore, dispatch_time(DISPATCH_TIME_NOW, 5.0 * NSEC_PER_SEC));
最長上報(bào)時(shí)間范圍:卡頓閾值-信號(hào)量5秒
12.Crash邏輯
NSSetUncaughtExceptionHandler 這幾種系統(tǒng)信號(hào)一起注冊(cè)一下。
- (void)signalRegister {
DoraemonSignalRegister(SIGABRT);
DoraemonSignalRegister(SIGBUS);
DoraemonSignalRegister(SIGFPE);
DoraemonSignalRegister(SIGILL);
DoraemonSignalRegister(SIGPIPE);
DoraemonSignalRegister(SIGSEGV);
DoraemonSignalRegister(SIGSYS);
DoraemonSignalRegister(SIGTRAP);
}
參考:
http://www.itdecent.cn/p/00763123dbc4
http://www.itdecent.cn/p/4091870ca3f0
//iOS 性能監(jiān)控方案(上篇)
http://www.cocoachina.com/ios/20170629/19680.html
//iOS 性能監(jiān)控方案(下篇)
http://www.cocoachina.com/ios/20170629/19680.html