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

推荐订阅源

博客园 - 聂微东
D
Darknet – Hacking Tools, Hacker News & Cyber Security
P
Privacy International News Feed
NISL@THU
NISL@THU
Know Your Adversary
Know Your Adversary
G
GRAHAM CLULEY
The Hacker News
The Hacker News
P
Privacy & Cybersecurity Law Blog
S
Schneier on Security
T
Troy Hunt's Blog
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
S
Security Affairs
WordPress大学
WordPress大学
T
Tailwind CSS Blog
博客园 - Franky
T
The Exploit Database - CXSecurity.com
雷峰网
雷峰网
S
SegmentFault 最新的问题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
S
Securelist
A
Arctic Wolf
C
Cyber Attacks, Cyber Crime and Cyber Security
有赞技术团队
有赞技术团队
爱范儿
爱范儿
Help Net Security
Help Net Security
Apple Machine Learning Research
Apple Machine Learning Research
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 三生石上(FineUI控件)
C
CERT Recently Published Vulnerability Notes
C
Cisco Blogs
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
Spread Privacy
Spread Privacy
Last Week in AI
Last Week in AI
S
Security @ Cisco Blogs
博客园 - 司徒正美
博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
罗磊的独立博客
博客园 - 叶小钗
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
J
Java Code Geeks
T
Threatpost
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位

chenhang 的博客

Android 12 - WMS 层级结构 && DisplayAreaGroup 引入 Android 12 - Letterbox 模式 Android 列表滚动优化之 OverScroller 揭秘 使用 Ninja 提升模块编译速度 Android Q 黑暗模式(Dark Mode)源码解析 如何顺滑地查看 Android Native 代码 AOSP 编译和烧写 Protocol Buffers 手册 设计模式之装饰模式 设计模式之桥接模式 设计模式之代理模式 依赖注入利器 - Dagger ‡ Robolectric使用教程 设计模式之模板方法模式和策略模式 设计模式之工厂模式(Factory) Fragment源码分析 Fragment事务管理源码分析 java动态代理 Android分包MultiDex源码分析
Android 12 - 跟踪利器 WinScope
2021-10-22 · via chenhang 的博客

1. 简介

在开发过程中,经常会遇到各种各样的窗口问题,比如动画异常、窗口异常、闪屏、黑屏、错位显示..

以前对于这些问题,我们可以通过添加日志,调试分析代码等手段去解决,但这些 UI 问题往往出现在一瞬间,很难把握出现的时机,录制下来的日志往往也是巨大的,从海量的日志中提取有效的信息是一个枯燥且繁琐的事情。

Android 也意识到了这个问题,WinScope 的出现有效的帮助我们跟踪窗口和显示问题。它向开发者提供一个可视化的工具,让开发者能使用工具跟踪整个界面的变化过程,让我们可以观察到细微的变化。迭代了几个版本后,Android 12 上 WinScope 变得更好用了,下面来看看大概的效果:

2021-10-22-14-26-57

2. 工具获取

Android 12 平台的 WinScope 工具可以通过源码编译获得,具体也可以查阅 development/tools/winscope 目录下的 README.md 文档,这里提供一个 Ubuntu 平台的编译步骤:

1
2
3
4
5
1. cd development/tools/winscope
2. sudo apt install nodejs npm
3. npm install -g yarn
4. yarn install
5. yarn build

编译过程中遇到一个问题,看上去是在执行 kotlin 优化的时候,报了个内存不足的问题:

1
2
3
4
5
6
7
8
9
10
11
Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
at com.google.gwt.dev.js.ScopeContext.referenceFor(ScopeContext.kt:68)
at com.google.gwt.dev.js.JsAstMapper.mapAsPropertyNameRef(JsAstMapper.java:247)
at com.google.gwt.dev.js.JsAstMapper.mapGetProp(JsAstMapper.java:608)
at com.google.gwt.dev.js.JsAstMapper.mapWithoutLocation(JsAstMapper.java:138)
at com.google.gwt.dev.js.JsAstMapper.map(JsAstMapper.java:47)
at com.google.gwt.dev.js.JsAstMapper.mapExpression(JsAstMapper.java:466)
at com.google.gwt.dev.js.JsAstMapper.mapBinaryOperation(JsAstMapper.java:304)
at com.google.gwt.dev.js.JsAstMapper.mapAssignmentVariant(JsAstMapper.java:258)
at com.google.gwt.dev.js.JsAstMapper.mapWithoutLocation(JsAstMapper.java:102)
at com.google.gwt.dev.js.JsAstMapper.map(JsAstMapper.java:47)

可以在执行 yarn build 前通过 export JAVA_OPTS="-XX:-UseGCOverheadLimit" 禁用掉 GC overhead limit exceeded 检测

编译完之后,在当前目录下会一个 dist 目录,再把 adb_proxy/winscope_proxy.py(一个帮我们开启 trace 抓取命令的脚本,这样我们就可以告别繁琐的命令啦),文件也拷贝进 dist 目录方便我们后面使用

3. 使用

使用比较简单了,连接手机后:

  • 双击打开 dist 目录下的 index.html 文件
  • 在终端执行 python3 winscope_proxy.py

PS: 这里建议大家可以设置个 alias 一键使用,比如:

1
alias winscope_s="xdg-open ~/tools/winscope_s/index.html && python3 ~/tools/winscope_s/winscope_proxy.py"

输入 python 命令后,终端可能会生成一个 token ,把它复制到浏览器即可

接下来就会出现下面这个界面:

2021-10-22-14-32-16

在选择 START TRACE 之后,就可以在手机端进行录制操作,操作完后结束录制即可

4. 功能改进

相比与 Android 11,新的 WinScope 工具在界面上更友好了,重要的改进如下:

  • 时间线控制更加方便了,可以选择不同类型的时间线用于控制,否则像以前录制了 ProtoLog 后,通过箭头控制时间推移简直是太难用了
  • 新的 TransactionLog 浏览界面
  • 支持 Diff 功能,不得不说每一帧的参数太多了,如果没有 diff 功能,实在很难一眼看出那些参数发生了变化
  • 新增了 IME 的录制,可以录制 InputMethodServiceInputMethodManagerServiceClient 的事件
  • 录屏界面可以以 PIP 形式显示在浏览器界面上

不得不说确实比以前好用一些,赶紧尝尝鲜吧~