多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

PerfDog性能测试四步建模法:从数据采集到根因定位

PerfDog性能测试四步建模法:从数据采集到根因定位 1. 项目概述为什么“怎么测”比“测了没”更重要PerfDog 这个名字在性能测试圈里几乎等同于“开箱即用的移动应用性能监控中枢”。它不是那种需要你先搭环境、配证书、写脚本、调埋点才能跑起来的重型工具而是把手机一连点几下就能看到帧率、CPU、内存、GPU、网络请求、电量消耗这些关键指标的实时曲线。但正因为它太容易上手很多人反而掉进了“白测陷阱”——手机插着App开着PerfDog界面开着数据哗哗地跑截图存了一堆报告导出三页最后发现根本没法回答老板那句“卡不卡为什么卡改完有没有变好”我带过不少刚转岗做性能测试的同事也帮某高校实验室的几个学生调试过毕业设计里的App性能问题。最常听到的一句话是“老师我测了数据都在但不知道怎么看。”这背后暴露的不是工具不会用而是对“性能测试本质”的认知偏差。性能测试从来不是数据采集比赛而是一场有明确目标、有逻辑链条、有验证闭环的工程诊断。PerfDog 是听诊器不是CT机它能告诉你“心跳快”但不能自动告诉你“是心律失常还是运动后正常反应”。所以标题里那个“怎么测才不算白测”核心其实在问测之前你是否定义清楚了“病灶在哪”“指标阈值是多少”“对比基线是什么”“异常模式长什么样”这直接决定了你是在做有效归因还是在做无效刷屏。比如同样测一个视频播放页的启动耗时如果只看“从点击到首帧显示”的总时间你可能得到 820ms 的结果觉得“还行”。但 PerfDog 同时抓到的 CPU 占用峰值达 98%、GPU 温度在 3 秒内飙升 12℃、内存分配速率达 45MB/s——这些信号叠加起来就指向一个典型问题解码线程未做异步隔离UI 主线程被大量像素计算阻塞。这时候“820ms”就不是终点而是起点。而如果你没打开 GPU 和温度监控只盯着那个数字那这次测试就是白测。关键词“PerfDog 性能测试”不是泛指“用 PerfDog 做测试”而是特指一种以问题驱动、指标联动、场景闭环为特征的轻量级性能工程实践。它适合两类人一是业务侧 QA 或开发需要快速定位日常迭代中的性能退化二是学生或初级工程师想建立对移动端性能维度的系统性感知。它不替代 JMeter 做高并发压测也不取代 Systrace 做深度内核分析但它能让你在 5 分钟内判断出“这个新版本是不是比上个版本更耗电”“用户滑动列表卡顿到底是渲染慢还是数据加载慢”。这种能力恰恰是多数团队最缺的“第一响应力”。2. 核心思路拆解从“拍脑袋测”到“靶向诊断”的四步建模法很多人的 PerfDog 使用路径是线性的安装 → 连设备 → 选 App → 开始录制 → 看图 → 截图 → 写报告。这就像医生只量体温、不问病史、不查体征、不做化验单靠一个 37.8℃ 就下结论。真正有效的 PerfDog 实践必须前置一套轻量但严谨的“测试建模”流程。我把它总结为四步目标锚定 → 场景切片 → 指标绑定 → 基线校准。每一步都决定后续数据是否有解释力。2.1 目标锚定拒绝“全量监控”聚焦“可行动问题”PerfDog 默认开启全部指标CPU、内存、FPS、流量、电量、GPU、温度、Jank 等但实际项目中90% 的性能问题只涉及其中 2~3 个维度的耦合异常。盲目全开不仅增加设备负载尤其低端机更会导致数据噪音淹没关键信号。比如测一个电商首页的“秒杀倒计时”动画卡顿核心矛盾大概率在 GPU 渲染管线或主线程调度此时紧盯“网络请求耗时”或“后台 Service 内存占用”就是无效劳动。我的做法是在点击“开始测试”前先用一句话写下本次测试要验证的假设。例如“假设新版倒计时动画卡顿主因是 TextureView 每帧重绘触发 GPU 过载预期表现为 FPS 波动 15% 且 GPU 占用持续 85%。”这句话里锁定了三个关键具体功能点倒计时动画、怀疑根因TextureView 重绘、可量化预期FPS 波动GPU 占用。有了它你打开 PerfDog 后第一件事就是关掉所有无关指标如网络、电量、后台进程只留 FPS、GPU Usage、GPU Temperature、Main Thread CPU。这样做的好处是界面更清爽、采样更稳定、对比更聚焦。实测下来在红米 Note 12 这类中端机上关闭冗余指标后FPS 数据抖动幅度降低约 40%避免了把采样噪声误判为真实卡顿。2.2 场景切片把“一次操作”拆成“多个原子动作”移动端交互是连续的但性能瓶颈往往藏在某个毫秒级的瞬间。PerfDog 的时间轴虽然支持缩放但如果整个测试过程是“打开 App → 进入首页 → 点击搜索 → 输入关键词 → 查看结果”长达 60 秒那你要找的“输入框获得焦点时的 UI 线程卡顿”就很容易被前后 50 秒的平稳数据淹没。解决方案是“场景切片”——用 PerfDog 的「标记」功能快捷键 M在关键动作发生瞬间手动打点。这不是为了好看而是为后续分析划定黄金窗口。以登录流程为例我会这样切片M1点击“登录”按钮的瞬间触发网络请求前M2密码输入框失去焦点的瞬间键盘收起UI 重排布M3登录成功 Toast 弹出的瞬间主线程完成所有回调每个标记之间就是一段独立的“性能微场景”。PerfDog 支持按标记区间导出 CSV 数据你可以单独分析 M1→M2 这 1.2 秒内的 CPU 调度、M2→M3 这 0.8 秒内的内存分配速率。某次帮某公司优化登录页正是通过 M2→M3 区间发现InputMethodManager的hideSoftInputFromWindow调用引发 3 次 full GC导致主线程挂起 210ms。这个细节在整段 60 秒数据里根本找不到。2.3 指标绑定理解指标背后的“物理意义”而非数值本身新手常犯的错误是把 PerfDog 显示的数字当绝对真理。比如看到“内存占用 180MB”就断言“内存泄漏”看到“FPS 52”就判定“流畅”。但 PerfDog 的内存数据是 PSSProportional Set Size它反映的是该进程独占 共享内存的加权值并非传统意义上的“已分配对象大小”而 FPS 是基于 SurfaceFlinger 的 VSync 信号计算的如果 App 主动丢帧如Choreographer回调被跳过它依然会显示“58”但用户已感知卡顿。所以必须建立“指标-现象-根因”的映射关系。我整理了一个高频指标的解读口诀贴在工位上Jank 5% FPS 稳定在 58~60→ 主线程有周期性阻塞如定时器轮询、未节流的传感器监听GPU Usage 90% GPU Temperature 每秒升 0.5℃→ 渲染管线过载纹理过大、Shader 复杂、离屏渲染滥用Main Thread CPU 80% RenderThread CPU 30%→ UI 逻辑未做异步如onDraw里做 Bitmap 解码Network Traffic 高峰与 FPS 跌落同步→ 网络请求在主线程解析 JSON/图片尤其 Retrofit Gson 默认行为这些口诀不是凭空编的而是来自上百次真机复现。比如“RenderThread CPU 低但 Main Thread 高”我们曾在一个地图 SDK 集成项目中反复验证只要把MapView.onLayout()里强制触发的invalidate()移到post()队列RenderThread 负载立刻从 12% 升至 65%而 Main Thread 从 88% 降至 32%FPS 从 42 稳定到 59。这说明指标间的相对关系比单个数值更有诊断价值。2.4 基线校准没有参照系的数据都是伪科学这是最容易被忽略却最致命的一环。很多人测完新版本看到“内存涨了 20MB”就急着提 Bug。但如果旧版本的基线数据根本没存或者基线是在不同设备、不同系统版本、不同后台进程状态下采集的这个“20MB”就毫无意义。PerfDog 的「历史对比」功能很好用但前提是你的基线足够干净。我的基线校准规则有三条设备一致同一台真机不换机型、不重启、不装卸其他 App状态锁定关闭所有非必要后台服务微信、钉钉、省电管理、禁用自动亮度、固定屏幕刷新率如强制 60Hz、清空 App 数据缓存三次采样每个场景执行 3 次取中间值为基线排除首次冷启和末次缓存干扰某次给某短视频 App 做启动优化旧版本基线小米 13MIUI 14冷启耗时是 1.23s±0.07s新版本测出来 1.41s。乍看退化 0.18s但当我们用同一台设备、同一套清理流程重跑旧版本发现基线其实是 1.28s上次记录时后台有音乐 App 在播歌。修正后新版本实际只慢 0.13s且进一步分析发现这 0.13s 全部来自新增的广告 SDK 初始化而非主业务逻辑。没有这个基线校准团队就会在错误的方向上投入两周人力。3. 实操要点详解从连接设备到生成可交付报告的完整链路PerfDog 的安装和连接看似简单但细节决定成败。我见过太多人卡在第一步手机连不上。不是工具问题而是忽略了 Android 系统底层的通信机制。下面我把整个链路拆成 7 个不可跳过的环节每个环节都附上“为什么这么干”的原理和“不这么干会怎样”的血泪教训。3.1 设备连接ADB 权限是命门不是可选项PerfDog 依赖 ADBAndroid Debug Bridge与手机通信所有指标采集本质上都是通过adb shell dumpsys系列命令实现的。这意味着USB 调试必须开启且电脑 ADB 驱动必须识别设备。很多人以为“手机弹窗点了允许”就完了其实漏了关键一步在电脑端执行adb devices确认设备状态是device而不是unauthorized或空白。unauthorized状态的根源是手机端的 RSA 密钥认证失败。解决方法只有两个彻底删除电脑~/.android/adbkey和~/.android/adbkey.pub文件重启 ADB 服务adb kill-server adb start-server再重新连接手机接受新弹窗或者更彻底的方法在手机开发者选项里找到“撤销 USB 调试授权”然后重新连接。我踩过的最大坑是在一台长期不用的 Windows 笔记本上。adb devices显示设备名但 PerfDog 死活连不上。折腾两小时才发现是笔记本装了某国产手机助手软件它偷偷劫持了 5037 端口ADB 默认端口导致 PerfDog 的 ADB 请求被拦截。解决方案是任务管理器结束所有xxxHelper.exe进程或直接卸载该软件。这个案例说明PerfDog 不是黑盒它运行在 ADB 生态之上任何破坏 ADB 稳定性的因素都会让 PerfDog 失效。3.2 设备配置别让系统“帮你优化”关掉所有智能省电安卓厂商的省电策略是 PerfDog 数据失真的头号敌人。华为的“智能分辨率调节”、OPPO 的“后台冻结”、小米的“应用省电模式”都会在 PerfDog 录制时动态降频 CPU、限制后台网络、甚至杀死 RenderThread。结果就是你测出来的“流畅”是系统帮你“演”出来的上线后用户一摸真机立马卡成 PPT。必须手动关闭的设置清单开发者选项 → 后台进程限制 → 无限制防止 Activity 被杀电池优化 → 找到 PerfDog → 选择“不优化”防止 PerfDog 自身被休眠应用启动管理 → 关闭 PerfDog 的“自启动”和“关联启动”避免被误杀显示 → 屏幕刷新率 → 锁定为“60Hz”或“90Hz”避免动态变频干扰 FPS 统计通知栏下拉 → 关闭“省电模式”“超级省电”图标这些模式会全局降频某次在 vivo X90 上测直播推流 SDK开启省电模式后GPU Usage 平均只有 35%FPS 稳定 59关闭后GPU Usage 瞬间飙到 82%FPS 在 52~58 间波动且出现明显 Jank。这才是真实负载。记住性能测试的第一原则是让设备回归“出厂裸机”状态所有智能策略都是干扰项。3.3 App 选择Process Name 比 App 名字重要十倍PerfDog 界面里App 列表显示的是“应用名称”但底层绑定的是 Android 的Process Name进程名。很多 App 为了保活或模块化会启用多个进程比如主进程com.example.app推送进程com.example.app:pushWebview 进程com.example.app:webview如果你在 PerfDog 里选了“某某 App”对应主进程但实际卡顿发生在:webview进程里那采集到的所有数据都跟问题无关。正确做法是先用adb shell ps | grep example查出所有相关进程再在 PerfDog 的「高级设置」里手动输入Process Name如com.example.app:webview。更隐蔽的坑是“WebView 独立进程”。某些 App 的 H5 页面在独立进程中渲染但 PerfDog 默认只监控主进程。这时必须勾选「监控 WebView 进程」否则你永远看不到Chromium_IOThread的 CPU 占用也抓不到WebViewCore的内存泄漏。我们曾为某金融 App 定位一个“H5 表单提交卡顿”问题折腾三天无果最后发现是 WebView 进程的V8 Heap内存从 12MB 涨到 89MB 未释放而主进程数据一切正常。这就是没盯住Process Name的代价。3.4 测试录制手动标记比自动触发更可靠PerfDog 支持“自动触发录制”如检测到 App 启动、Activity 变化但生产环境强烈建议关闭。原因有二时机漂移自动触发依赖ActivityManager广播而广播有延迟平均 100~300ms你点“登录”按钮PerfDog 可能在 200ms 后才开始录错过最关键的onCreate和onResume阶段误触发某些 App 启动时会拉起多个 ActivitySplash → Guide → Main自动触发可能在 Splash 就开始录结果你分析的全是引导页数据。我的标准操作是点击 PerfDog 的「开始录制」按钮不要点「自动」等 1 秒确保 PerfDog 状态栏显示“正在录制”立刻执行你的测试动作如点击按钮、滑动列表动作完成后立即按快捷键M打标记再点「停止录制」。这个 1 秒等待是给 PerfDog 缓冲时间。实测在三星 S22 上跳过这 1 秒首帧数据丢失率高达 35%。另外标记M一定要在动作“完成瞬间”打不是“开始瞬间”。比如测列表滑动标记应打在手指离开屏幕、惯性滚动停止的那一刻而不是手指刚触屏时。因为我们要分析的是“从静止到静止”的完整生命周期不是“触控响应”。3.5 数据查看时间轴缩放不是玄学是有物理精度的PerfDog 的时间轴默认是“自动缩放”看起来很智能但对深度分析是灾难。比如你测一个 5 秒的动画自动缩放后X 轴变成 0~5s但你想看第 2.37 秒的 CPU 突刺鼠标悬停只能看到“2.3s”或“2.4s”精度丢失。必须手动设置时间范围右键时间轴 → 「设置时间范围」→ 输入精确起止时间如 2.35 ~ 2.45。这时Y 轴指标会自动重采样显示该 100ms 窗口内的毫秒级变化。某次分析一个RecyclerView的notifyDataSetChanged卡顿就是在 2.381s 这个点发现LinearLayoutManager的onLayoutChildren耗时 142ms而同一时刻RenderThread的drawFrame只用了 8ms从而锁定是布局计算而非渲染的问题。没有这个毫秒级缩放你只会看到“这一秒 CPU 很高”无法归因。3.6 报告导出CSV 比 PDF 更有价值但要用对PerfDog 导出的 PDF 报告很美观适合给老板看“我们测了”。但真正干活的人必须用 CSV。因为 CSV 里包含原始采样点每 100ms 一个数据点你可以用 Excel 或 Python 做二次分析。比如计算 FPS 的标准差衡量稳定性比平均值更重要筛选GPU Usage 90%的所有时间点看是否集中在某个函数调用后对Memory PSS做线性拟合判断是否存在缓慢泄漏斜率 0.5MB/s 视为风险。导出 CSV 的关键设置勾选「导出原始数据」默认不勾导出的是聚合统计时间范围选「当前视图」不是“全部”避免文件过大字段选择「仅导出已开启指标」减少冗余列。我习惯把每次测试的 CSV 命名为app_v2.3.1_login_M2-M3_20240520.csv包含版本、场景、标记区间、日期。半年下来积累了一套可回溯的性能基线库再也不用担心“上次测的数据在哪”。3.7 多机协同不是“同时连多台”而是“分时复用同一台”PerfDog 支持“多设备管理”很多人理解为可以同时测 5 台手机。这是误区。PerfDog 的多设备本质是“快速切换”不是“并行采集”。因为 ADB 是单通道协议同一时间只能与一台设备通信。所谓“多设备”只是把不同设备的配置IP、ADB 端口、Process Name存成模板点一下就切换过去。真正的效率提升在于“分时复用”。比如测兼容性你不需要买 5 台真机同时跑而是用一台 iPhone 13iOS测完导出 CSV换一台小米 13Android用同一套标记规则重跑再换一台华为 Mate 50依此类推。关键是所有设备用同一份测试脚本文字版、同一套标记点M1/M2/M3、同一套清理流程。这样导出的 CSV才能横向对比。我们曾用这套方法在 3 天内完成 8 款主流机型的启动性能扫描发现高通平台普遍比联发科平台快 120ms但华为鸿蒙系统在内存回收上比安卓原生快 300ms。这种结论只有标准化流程才能得出。4. 核心环节实现以“电商首页滑动卡顿”为例的全流程实战现在我们把前面所有原则落地到一个真实高频场景电商首页的“商品瀑布流滑动卡顿”。这不是虚构案例而是某头部电商平台 2023 年 Q3 最常被用户投诉的问题。我们将用 PerfDog走完从问题定义到根因定位的完整闭环。4.1 问题定义与目标锚定用户反馈“首页往下划偶尔会一顿一顿的像卡顿。”这不是模糊描述而是典型的“偶发性 Jank”。我们需要把它转化为可测量的目标“验证首页滑动卡顿主因是RecyclerView在快速滑动时onBindViewHolder中的图片加载未做预加载和缓存导致主线程频繁触发Glide的decodeBitmap预期表现为滑动过程中Main Thread CPU突增 40%且Jank率 8%FPS瞬时跌至 45。”这里锁定了具体功能首页RecyclerView滑动怀疑根因onBindViewHolder中图片解码阻塞主线程可验证指标Main Thread CPU突增、Jank率、FPS跌落4.2 场景切片与标记设定首页滑动不是匀速的我们要捕获“最差情况”——手指快速甩动后的惯性滚动阶段。因此标记点这样设M1手指离开屏幕的瞬间惯性滚动开始M2惯性滚动停止的瞬间列表静止M3再次点击屏幕触发下一轮滑动用于对比注意M1 和 M2 必须由测试者手动打不能依赖自动触发。因为惯性滚动的起止时间受手指力度、屏幕摩擦系数影响算法无法精准捕捉。4.3 设备与 App 配置设备小米 13骁龙 8 Gen2MIUI 14.0.12关闭所有省电模式锁定 120Hz 刷新率Appcom.ecom.main主进程勾选「监控 WebView 进程」首页含 H5 模块PerfDog 设置只开启FPS、Jank、Main Thread CPU、RenderThread CPU、Memory PSS、GPU Usage关闭「自动触发」全程手动控制。4.4 录制与数据采集操作步骤PerfDog 点「开始录制」等 1 秒状态栏变绿打开 App进入首页快速向上滑动屏幕模拟用户猛甩在手指离开屏幕的瞬间按M打 M1等待惯性滚动自然停止在停止瞬间按M打 M2立即点「停止录制」。重复此流程 3 次每次间隔 30 秒让系统冷却。三次数据中取 M1→M2 区间Jank率最高的一次作为主分析样本因为我们要找“最差表现”。4.5 数据分析从宏观到微观的三层穿透拿到 CSV 后我们分三层分析第一层宏观趋势看整体健康度用 Excel 打开 CSV筛选 M1→M2 区间假设是 1.2s ~ 2.8s计算FPS平均值57.3达标Jank率12.4%超标阈值是 5%Main Thread CPU平均68.2%偏高RenderThread CPU平均41.5%偏低GPU Usage平均72.1%健康结论问题存在且指向主线程阻塞Main Thread高 RenderThread低。第二层时间对齐找突刺点把Main Thread CPU和FPS画在同一张折线图上X 轴时间Y 轴双坐标。我们发现在 t1.832s 时Main Thread CPU从 32% 瞬间飙到 94%持续 0.18s而FPS同步从 59 跌到 38Jank计数器1。这个时间点就是根因爆发点。第三层代码映射锁定函数回到 App 代码搜索首页RecyclerView.Adapter的onBindViewHolder。我们发现Override public void onBindViewHolder(ViewHolder holder, int position) { // ... 其他逻辑 Glide.with(context) .load(product.getImageUrl()) // 网络图片 URL .into(holder.imageView); // 直接 into ImageView }问题在这里Glide.into()默认会在主线程解码 Bitmap。当快速滑动时onBindViewHolder被高频调用大量decodeBitmap堵塞主线程。验证方案在onBindViewHolder开头加日志Log.d(PERF, onBind at System.currentTimeMillis());然后用adb logcat | grep PERF看日志时间戳是否与 PerfDog 的 1.832s 突刺吻合。实测完全一致。4.6 修复验证与效果量化修复方案图片加载改为Glide的preload()预加载在onScrollStateChanged中触发onBindViewHolder中只做Glide.with().load().centerCrop().into()确保解码在后台线程。修复后重测Jank率从 12.4% 降至 2.1%Main Thread CPU突增消失峰值从 94% 降至 52%FPS最低值从 38 提升至 54用户实测反馈“滑动顺滑多了没再卡过。”这个案例的价值在于它证明了 PerfDog 不是“测完就扔”的工具而是能贯穿“问题发现 → 根因定位 → 方案验证 → 效果量化”全链路的工程杠杆。而这一切的前提是“怎么测”的设计——没有 M1/M2 标记你找不到 1.832s没有Main Thread CPU和FPS的时间对齐你无法确认是主线程问题没有基线对比你无法说清“2.1%”比“12.4%”好多少。5. 常见问题与排查技巧实录那些官方文档不会写的坑PerfDog 官方文档写得很全但全是“功能说明书”。而真实世界里90% 的问题出在文档没覆盖的灰色地带。以下是我在三年实战中整理的 7 个高频、隐蔽、且极易误判的问题每个都附带“现象 → 排查思路 → 解决方案 → 验证方法”。5.1 问题FPS 显示 60但用户明显感觉卡顿现象PerfDog 曲线平滑FPS 稳定在 58~60Jank率 0%但真机操作时动画有“粘滞感”不是掉帧而是“不跟手”。排查思路FPS 只反映 VSync 信号到达率不反映输入延迟Input Latency。安卓系统从触摸事件上报到onTouchEvent被调用再到Choreographer触发doFrame中间有多个队列。PerfDog 不采集输入事件所以“卡顿”可能发生在前端。解决方案打开 Android 的「开发者选项 → 显示触摸操作」看触摸点是否实时跟随手指如果触摸点延迟说明InputReader或InputDispatcher有阻塞需检查是否有InputFilter或dispatchTouchEvent中的耗时操作PerfDog 里重点看SurfaceFlinger的vsync时间戳是否均匀需导出dumpsys SurfaceFlinger日志分析不在 PerfDog 界面内。验证方法用adb shell getevent -l抓取原始触摸事件计算EV_ABS / ABS_MT_POSITION_X事件的时间间隔若 16ms60Hz 周期则确认是输入链路问题。5.2 问题内存 PSS 持续上涨但 LeakCanary 无报告现象PerfDog 显示Memory PSS从 120MB 涨到 210MB持续 5 分钟但LeakCanary检测不到泄漏。排查思路PSS 上涨 ≠ Java 内存泄漏。它可能是Native 内存泄漏C 代码 malloc 未 freeBitmap 内存Android 8.0 的 Bitmap 内存计入 Native HeapLeakCanary 只扫 Java HeapAssetManager加载的资源未释放如Typeface、SoundPool。解决方案在 PerfDog 里勾选「Native Memory」指标需 root 或特定系统权限若无法获取 Native 数据用adb shell dumpsys meminfo com.xxx | grep -A 20 Native查看 Native Heap 大小检查所有BitmapFactory.decodeResource调用确认是否用了inBitmap复用检查Typeface.createFromFile是否缓存了Typeface实例。验证方法在onDestroy中手动调用System.gc()观察 PerfDog 的 PSS 是否回落。若回落说明是 Java 对象未及时释放若不回落基本锁定 Native 问题。5.3 问题GPU Usage 为 0但画面卡顿现象PerfDog 的 GPU 指标全程显示 0%但FPS跌到 30Jank率 25%。排查思路GPU Usage 为 0通常意味着App 未使用硬件加速android:hardwareAcceleratedfalse所有绘制都在 CPU 完成Software Renderer或者GPU 驱动未上报数据常见于部分定制 ROM。解决方案检查AndroidManifest.xml确认application和activity的hardwareAccelerated属性为true在代码中View.setLayerType(LAYER_TYPE_HARDWARE, null)是否被误调用用adb shell dumpsys gfxinfo com.xxx查看Graphics Hardware Acceleration状态确认是否为Enabled。验证方法在Application.onCreate()中添加StrictMode检测StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectCustomSlowCalls() .penaltyLog() .build());若onDraw中有Canvas.drawBitmap调用会报SlowCall证明是软件渲染。5.4 问题网络流量数据远低于 Charles/Fiddler现象PerfDog 显示某次请求流量 12KB但 Charles 抓包显示 245KB。排查思路PerfDog 的网络流量统计的是TrafficStatsAPI 的getUidRxBytes()它只计算 TCP/UDP 的 payload 字节数不包括TCP/IP 协议头约 40~60 字节/包TLS 握手和加密开销DNS 查询流量重传包TrafficStats只计首次发送。解决方案PerfDog 的网络数据只用于趋势对比如“新版本比旧版本多传了 30%”不用于绝对值审计绝对值分析必须用抓包工具Charles/Wireshark若需 PerfDog 辅助可开启「HTTPS 抓包」需安装
返回列表