一文揭秘如何使用卡顿检测工具BlockCanary
前言
在日常业务测试中经常会发现页面跳转卡顿、滑动卡顿等卡顿问题,但是我们发现卡顿问题,有时候反馈给开发不一定得到很好的解决,因为开发需要看日志,而每次如果都去抓log,就会显得麻烦,而且需要搜索。会非常麻烦,如何解决了,成为老大难的问题了。
本文介绍如何使用BlockCanary测试app卡顿并且做到log日志上报。
BlockCanary介绍
BlockCanary是一个Android平台的一个非侵入式的性能监控组件,应用只需要实现一个抽象类,提供一些该组件需要的上下文环境,就可以在平时使用应用的时候检测主线程上的各种卡慢问题,并通过组件提供的各种信息分析出原因并进行修复
原理:
使用教程
app目录的build。gradle中,增加如下代码implementationcom。github。markzhai:blockcanaryandroid:1。5。0
如何使用
一般是在Application中的onCreate中注册,BlockCanary。install(this,newAppBlockCanaryContext())。start();
这里的AppBlockCanaryContext是继承了BlockCanaryContext重写了里面的几个方法,具体代码如下:packagecom。example。studayapp;importandroid。content。Context;importcom。github。moduth。blockcanary。BlockCanaryContext;importcom。github。moduth。blockcanary。internal。BlockInfo;importjava。io。File;importjava。util。LinkedList;importjava。util。List;DescriptionautherVTestercreate2020101110:08publicclassAppBlockCanaryContextextendsBlockCanaryContext{publicStringprovideQualifier(){获取应用版本信息returnunknown;}Implementinyourproject。returnuseridpublicStringprovideUid(){获取用户uidreturnuid;}Networktypereturn{linkString}like2G,3G,4G,wifi,etc。publicStringprovideNetworkType(){获取网络类型returnunknown;}Configmonitorduration,afterthistimeBlockCanarywillstop,usewith{codeBlockCanary}sisMonitorDurationEndreturnmonitorlastduration(inhour)publicintprovideMonitorDuration(){设置监控时长return1;}Configblockthreshold(inmillis),dispatchoverthisdurationisregardedasaBLOCK。Youmaysetitfromperformanceofdevice。returnthresholdinmillspublicintprovideBlockThreshold(){设置监控卡顿阀值return1000;}Threadstackdumpinterval,usewhenblockhappens,BlockCanarywilldumponmainthreadstackaccordingtocurrentsamplecycle。pBecausetheimplementationmechanismofLooper,realdumpintervalwouldbelongerthantheperiodspecifiedhere(especiallywhencpuisbusier)。returndumpinterval(inmillis)publicintprovideDumpInterval(){returnprovideBlockThreshold();}Pathtosavelog,likeblockcanary,willsavetosdcardifcan。returnpathoflogfilespublicStringprovidePath(){设置log保存地址returnblockcanary;}Ifneednotificationtonoticeblock。returntrueifneed,elseifnotneed。publicbooleandisplayNotification(){设置是否在桌面展示,returnfalse;}Implementinyourproject,bundlefilesintoazipfile。paramsrcfilesbeforecompressparamdestfilescompressedreturntrueifcompressionissuccessfulpublicbooleanzip(File〔〕src,Filedest){returnfalse;}Implementinyourproject,bundledlogfiles。paramzippedFilezippedfilepublicvoidupload(FilezippedFile){thrownewUnsupportedOperationException();}Packagesthatdeveloperconcern,bydefaultitusesprocessname,puthighpriorityoneinpreorder。returnnullifsimplyconcernonlypackagewithprocessname。publicListStringconcernPackages(){returnnull;}Filterstackwithoutanyinconcernpackage,usedwith{codeconcernPackages}。returntrueiffilter,falseitnot。publicbooleanfilterNonConcernStack(){returnfalse;}Providewhitelist,entryinwhitelistwillnotbeshowninuilist。returnreturnnullifyoudontneedwhitelistfilter。publicListStringprovideWhiteList(){LinkedListStringwhiteListnewLinkedList();whiteList。add(org。chromium);returnwhiteList;}Whethertodeletefileswhosestackisinwhitelist,usedwithwhitelist。returntrueifdelete,falseitnot。publicbooleandeleteFilesInWhiteList(){returntrue;}Blockinterceptor,developermayprovidetheirownactions。publicvoidonBlock(Contextcontext,BlockInfoblockInfo){}}
需要在项目的配置权限usespermissionandroid:nameandroid。permission。READEXTERNALSTORAGEusespermissionandroid:nameandroid。permission。WRITEEXTERNALSTORAGE
根据上面的配置代码并打包app,进行手工测试,如果主线程卡顿超过1000ms,会产生卡顿日志。
在我们执行中,日志的位置
遇到卡顿就会将日志记录
我们看下日志的详细的信息
卡顿文件包含几点:
发生时间
版本
imei
cpu型号
内存
卡顿堆栈
这是我们的日志的文件,这样是存储在手机里,我们还可以实现一个上传功能,去上传我们的发现的日志。