Android unbindService流程与BIND_AUTO_CREATE详解
10:31 amThursday, 16 June 2022 (HKT)Time in Hong Kong
概述
BIND_AUTO_CREATE
unbindService
参考
概述基于Android 10分析bindService(Intent, ServiceConnection, flag)调用中flag传递BIND_AUTO_CREATE与传递0的区别。分析unbindService基本流程。
BIND_AUTO_CREATE一般调用bindService()时都传递参数BIND_AUTO_CREATE,它让系统自动拉起被绑定的服务。但实际上,该参数可以不传递,而替换为传递0。
BIND_AUTO_CREATE会让系统在bind之前首先通过bringUpServiceLocked()先启动服务,并回调服务的onCreate()和onStartCommand()。然后再执行onBind()绑定服务后,返回到client的ServiceConection.onServiceConnected()。
而0则不会启动服务。而必须通过其他方式启动服务(比如调用startSer ...
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 ...
Linux container_of详解
container_of简介container_of是很重要的一个功能宏,它可以基于一个成员来取得成员所在的结构体。
container_of定义和使用12345678910111213/** * container_of - cast a member of a structure out to the containing structure * @ptr: the pointer to the member. * @type: the type of the container struct this is embedded in. * @member: the name of the member within the struct. * */#define container_of(ptr, type, member) ({ \ void *__mptr = (void *)(ptr); \ ...
搭建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 ...