DoraemonKit性能輔助工具

一、做這個(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。

image.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容