Android WindowManager continueSurfaceLayout流程
4:33 pmTuesday, 21 June 2022 (GMT+8)Time in Guangzhou, Guangdong Province, China
概述
WindowManagerService.continueSurfaceLayout
RootWindowContainer.performSurfacePlacement
handleResizingWindows to WidnowState流程
ViewRootImpl.dispatchResized()流程
requestTraversal
总结
概述分析Android 10的WindowManagerService.continueSurfaceLayout()流程。
WindowManagerService.continueSurfaceLayout
WMS.continueSurfaceLayout()首先完成窗口、Surface的位置计算和摆放,并当RootWindowContainer.isLayoutNeeded()时requestTraversal()触发绘制流程。
RootWind ...
Android startForegroundService详解
10:45 amMonday, 13 June 2022 (HKT)Time in Hong Kong
概述
过程
Context.startForegroundService
SystemServer
startForeground
参考
概述基于Android 10分析startForegroundService的基本流程。由于大致流程与startService一致,因此本文重点分析foreground流程的主要差异点,分析Android系统对foreground带来的限制(Service.onCreate()后限定时间内调用startForeground()以及没有满足条件时系统停止service的实现、foreground service必须搭配Notification的限制条件)。
Android O之后系统禁止后台应用启动后台服务,且启动前台服务必须具有权限:
1<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
在Foreground ...
搭建SPICE云桌面:Docker QEMU-KVM SPICE Windows10云桌面
从容器中启动
开始构建云桌面,启动基础docker容器
1docker run -dit --privileged --name NikoVDI -p 8288:5900 -p 8289:5901 -p 8888:5988 -p 8889:5989 -v ~/:/metaworld peacedocker10/nikodocker-vncxfce:1.0 /bin/bash
这是一个已经构建好的,直接使用的。
1docker run -dit --privileged --name PeaceMakerVDI -p 18888:5900 -p 18889:5901 -v ~/:/metaworld peacedocker10/nikovdi-spicewin10:1.0 /bin/bash
8288 给vnc;8888和8889给SPICE和SPICE+TLS
spice连接方式: spice://hostaddr:18888
第一part: 准备docker、kvm和qemu
docker内容器安装kvm、virt-manager
1apt-ge ...
Inferno:为Android原生应用生成火焰图——Flamegraph generator for pure native app
简介
原理
使用
发现性能瓶颈(bottleneck):寻高原期定CPU cost——find CPU cost by looking for plateaus
参考
简介本文介绍Inferno工具。Inferno基于SimplePerf,用于为Android native应用生成火焰图(Flame graph)——如SurfaceFlinger。As we all known,Android中常用Perfetto或Profiler的method trace来生成应用层的火焰图,但是它们对native进程束手无策。Inferno正是为此而生,可以将Inferno看成是支持native app的Profiler.MethodTracer。
Inferno最初被设计和制造出来是用于分析和优化SurfaceFlinger的性能的,目前能针对任何native app工作,以及非native app的native部分。正如同Profiler,Inferno生成native code的flame graph,并同样的生成可视化的HTML。
下图展示Inferno对SurfaceFlinger ...
awk整理:简明总结与速查
[TOC]
awk的名字取自三位作者的姓的首字母。在Linux中使用的awk实际上已经不是最原始的awk了,而是GNU维护的gawk,但是在命令行中仍然保持使用awk命令。
参数与命令awk [options] 'COMMAND' fileawk [options] '/pattern/' fileawk [options] 'condition' fileawk [options] '/pattern/ COMMAND' fileawk [options] 'condition COMMAND' file
命令:awk命令必须使用单引号包裹,不能使用双引号。
COMMAND为空时默认调用print函数打印当前行
pattern或condition为空时默认所有行都匹配
awk命令语句主体:/pattern/ {COMMAND}。pattern正则表达式匹配成功后执行COMMAND。其中pattern为空时默认每行都匹配,COMMAND为空时默认为打印该行。其中,/patte ...
sed整理:简明总结与速查
[TOC]
sed全名stream editor,流编辑器。与awk一样,它们都是行编辑器,按行进行逐行文本操作。awk侧重点是分割和重新合成,而sed的侧重点是替换。
参数
参数
作用
-e
指定sed命令
-f
读取指定的文件内容作为sed命令
-n
不输出原文件内容
-i
直接修改原文件,而不是默认的将修改后的内容输出到标准输出
输入
读取文件内容作为输入
sed [command] file
从标准输入中读取数据
echo -e "raw data" | sed "H;g"
输出
输出到标准输出,不会修改文件
sed [command] file
(直接)修改文件
sed -i [command] file
(重定向)修改文件
sed [command] file > file
替换(s命令)
匹配pattern替换为str
sed "s/pattern/str/g" file
指定替换的行号范围
sed "START,ENDs/pattern/s ...
LLDB远程调试Android:LLDB命令速查参考手册Handbook
[TOC]
远程调试Android DeviceAndroid端启动lldb server
在此之前将lldb server push到设备,如/data/loca/tmp
12lldb-server platform \--server --listen unix-abstract:///data/local/tmp/debug.sock
后台运行:
12lldb-server platform \--server --listen unix-abstract:///data/local/tmp/debug.sock &
Host端连接lldb server
在此之前必须先通过adb连接上Android
1234567891011121314$ lldb # 启动lldb(lldb) platform select remote-android # 选择远程调试Android Platform: remote-android Connected: no (lldb) platform connect unix-abstract-conn ...
Android性能优化: 定性和定位Android图形性能问题——以后台录屏的性能优化为例
4:43 pmFriday, 8 April 2022 (GMT+8)Time in Guangzhou, Guangdong Province, China
简介
发现、定性与定位
工具
GPU Loading
FPS
初步定位问题
定性问题
跟不上旋律节奏的VSYNC
严重异常耗时的dequeueBuffer
VirtualDisplay合成耗时
结论
定位问题
总结
成果展示
参考
简介本文记录一次Android图形性能问题的分析过程——发现、定性和定位图形性能问题,以及探讨的性能优化方案。环境:Android Q + MTK + ARM Mali-G72。所分析的性能问题(下称case):打开录屏应用并启动后台录屏,滑动前台应用(滑屏)。性能表现差:CPU、GPU负载显著升高、掉帧、用户明显卡顿感,帧率不足30帧,帧渲染、合成耗时急剧飙升(渲染耗时平均为29ms左右)。经过优化后,相同环境和条件下,渲染帧率稳定在60帧(提升一倍),渲染耗时平均为8.44ms左右(为优化前的不到三分之一的消耗)。
关键词 Keywords: Screen Recordin ...
Android图形层垂直同步虚拟VSYNC机制
20:12
Wednesday, April 20, 2022 (GMT+8)
Time in Guangdong Province, China
简介
跟不上旋律节奏的VSYNC
严重异常耗时的dequeueBuffer
参考
简介某次调图形性能的时候(启动后台录屏,下(或)称case)发现Android SurfaceFlinger Vsync机制并没有以前想的这么简单粗糙,特别是这次调图形性能发现一些跟Vsync有关联,因此做个总结详解。
跟不上旋律节奏的VSYNC一份追踪报告,发现Vsync信号非常不规律,于是从这里入手分析、总结Vsync。
如下图,As we can see,VSYNC-sf出现严重的漂移(见图,第二行的VSYNC-sf残次不齐、跟不上规律、难看且混乱),这导致了丢帧。(但VSYNC-sf的失控仅表示与丢帧的相关性,并不直接表明因果性。)
从VSYNC信号看,后台录屏RUNNING的情况下,带来的额外工作负载直接压垮了SurfaceFlinger,导致其提交屏幕刷新的VSYNC-sf都出现了严重缺失、错位、延期等——总之是非常不正常的工况。
...
Android平台GPU负载计算、分析方法
11:42 amWednesday, 6 April 2022 (GMT+8)Time in Guangzhou, Guangdong Province, China
简介
读取负载
实现
其他
获取型号
读取当前频率
读取CPU负载
名词解释
参考
简介本文介绍Android平台(Android Q,MTK(CPU),Mali(GPU))通过kernel misc节点读取GPU负载的方法。介绍了通过watch、awk自动周期性间隔打印GPU利用率的命令。
读取负载
读取GPU负载;输出三列数据分别为Loading、Block、Idlecat /sys/kernel/debug/ged/hal/gpu_utilization
其中Loading、Blocking、Idle可以分别从独立的节点中单独读取
12345cat /sys/module/ged/parameters/gpu_loadingcat /sys/module/ged/parameters/gpu_blockcat /sys/module/ged/parameters/gpu_idle
sys节点下ke ...