惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog RSS Feed
D
Darknet – Hacking Tools, Hacker News & Cyber Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
G
Google Developers Blog
MyScale Blog
MyScale Blog
Google DeepMind News
Google DeepMind News
J
Java Code Geeks
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
C
Check Point Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Proofpoint News Feed
D
Docker
Jina AI
Jina AI
博客园 - 三生石上(FineUI控件)
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Help Net Security
Help Net Security
Google DeepMind News
Google DeepMind News
L
LINUX DO - 最新话题
T
Tailwind CSS Blog
N
Netflix TechBlog - Medium
Forbes - Security
Forbes - Security
MongoDB | Blog
MongoDB | Blog
Attack and Defense Labs
Attack and Defense Labs
Webroot Blog
Webroot Blog
A
About on SuperTechFans
Schneier on Security
Schneier on Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
Microsoft Azure Blog
Microsoft Azure Blog
F
Fortinet All Blogs
IT之家
IT之家
The Last Watchdog
The Last Watchdog
腾讯CDC
Microsoft Security Blog
Microsoft Security Blog
Project Zero
Project Zero
B
Blog
Recorded Future
Recorded Future
博客园_首页
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
SegmentFault 最新的问题
Security Archives - TechRepublic
Security Archives - TechRepublic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hacker News: Front Page
T
Threatpost
H
Heimdal Security Blog
Cloudbric
Cloudbric
Google Online Security Blog
Google Online Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog

博客园 - 张润昊

Coding Agent 工程化实践《一》 : 前端页面自验实践 大模型为什么会产生幻觉?从原理到工程防御 Codex 的 Skill 到底是怎么被调用的? Superpowers:如何约束 Coding Agent 使用 Codex 的一次危险提醒 我的Nginx 的配置分析 NextJS 安全漏洞分析 AI工具学习02 - 使用 ChatGPT 进行 PRD 产品设计 NextJS 02 - 服务端渲染 NextJS01 - page router - 问题列表 Flutter02-布局 Flutter01-本地数据库 isar React 学习 03-两种 Api 的使用 React 学习 02-commit 渲染 React 学习 01-时间切片 命令行 查找某个结尾的文件. 总结下vim快捷键 React技术揭密学习(二) React技术揭密学习(一) Build your own React 前端监控系统博客总结 记账项目 - webpack优化 React源码解携(二): 走一趟render流程 macos更新后, MySQL不能启动问题
安卓低机型卡顿分析以优化方案
张润昊 · 2024-03-19 · via 博客园 - 张润昊

当前状况

  • 安装低端机型H5页面可能存在丢帧问题

丢帧卡顿可能原因分析

现象分析

  • 呈现速度缓慢: 在呈现速度缓慢的帧数较多的页面,当超过50%的帧呈现时间超过16ms毫秒时,用户感官明显卡顿。
  • 帧冻结的绘制耗时超过700ms,为严重卡顿问题。
  • 卡顿忽略FPS<=2的页面:因为人的视觉暂留100400ms,即FPS在2.510之间时,所以当FPS低于3时,人眼看到的并不是连续动作,即使有丢帧现象,也不会察觉。

具体问题分析

  • 当前程序运行CPU运行过高
  • 当前程序运行内存占用过高

定位问题

当前情况分析

  • 使用Android官方提供的dumpsys工具进行分析
    • 执行: adb shell dumpsys gfxinfo com.sohu.newsclient
    • 详细正文数据分析
Stats since: 29087419659040ns
Total frames rendered: 1771 : 本次dump收集了1771帧信息
Janky frames: 776 (43.82%) : 1711帧中有776帧超过16ms, 卡顿概率为: 43.8%
50th percentile: 14ms
90th percentile: 28ms
95th percentile: 57ms
99th percentile: 350ms
Number Missed Vsync: 60 : 垂直同步失败的帧
Number High input latency: 1533 : 处理input超市的帧
Number Slow UI thread: 96 : 因UI线程上的工作导致超时值
Number Slow bitmap uploads: 1 : 因bitmap的加载耗时的帧数
Number Slow issue draw commands: 77 : 因绘制导致耗时的帧数
Number Frame deadline missed: 120
  • Janky frames 并不代表用户视觉上的,显示在屏幕上的丢帧率,但是它可以代表有问题的帧率.

  • 通过安卓组掉帧工具分析

    • 可通过掉帧发生时, 具体的执行函数情况分析
    • 结果: 未发现在安卓掉帧过程中有webview函数执行

内存情况分析

分析真实内存情况

  • 使用Android中自带的Profile工具内存分析

正常打开正文页, 在低端手机中运行情况分析

正文内存查看

滚动时内存变换

  • 滚动时内存变化来自GPU渲染占用的内存变化

结论

  • 正文H5页面渲染, 大概占用内存30M作用
  • 正文H5页面正文部分运行占用内存5M作用
  • H5未占用大量内存, 建议: 每次合板后, 检测H5占用内存

网络资料卡顿优化建议

  • 布局优化
    • 通过减少冗余或者嵌套布局来降低视图层次结构。比如使用约束布局代替线性布局和相对布局。
    • 用 ViewStub 替代在启动过程中不需要显示的 UI 控件。
    • 使用自定义 View 替代复杂的 View 叠加。
    • 减少嵌套层次和控件个数。
    • 使用Tags:Merge标签减少布局嵌套层次,ViewStub标签推迟创建对象、延迟初始化、节省内存等。
    • 减少过度绘制
  • 减少主线程耗时操作
    • 主线程中不要直接操作数据库,数据库的操作应该放在数据库线程中完成。
    • sharepreference尽量使用apply,少使用commit,可以使用MMKV框架来代替sharepreference。
    • 网络请求回来的数据解析尽量放在子线程中,不要在主线程中进行复制的数据解析操作。
    • 不要在activity的onResume和onCreate中进行耗时操作,比如大量的计算等。
  • 列表优化
    • RecyclerView使用优化,使用DiffUtil和notifyItemDataSetChanged进行局部更新等。
  • 内存优化
    • 减少小对象的频繁分配和回收操作。
    • 被频繁调用的紧密的循环里,避免对象分配来降低GC的压力。