02 CaptionWindowDecoration 多层 Surface 架构深度分析
概述CaptionWindowDecoration 是 Android WindowManager Shell (WMShell) 框架中的核心组件,负责为自由形态窗口提供标题栏装饰功能。它采用多层 Surface 架构来实现窗口装饰的渲染和交互,确保应用内容与装饰元素能够独立渲染、精确控制,同时保持良好的性能和用户体验。 完整多层 Surface 架构图包含应用内容的完整架构1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495┌─────────────────────────────────────────────────────────────────────────────────┐│ Display Surface (屏幕显示层)...
Android BLE
Android BLE 杂谈 主要解决方案领域 音频传输 Bluetooth®技术摒弃了耳机、耳麦、扬声器等设备上繁琐的接线,彻底改变了音频设备,永远改变了我们消费媒体和体验世界的方式。 数据传输 从家用电器和健身追踪器到健康传感器和医疗创新产品,Bluetooth®技术连接着数十亿台日常设备,并促成了无数新设备的发明。 设备网络 Bluetooth® Mesh 是创建控制、监控和自动化系统的理想选择,在这些系统中,数十、数百或数千台设备需要可靠、安全地相互通信。 位置服务 Bluetooth®技术是开发人员的首选工具,可用于创建用于兴趣点信息和物品查找的近距离解决方案以及定位系统,如用于资产跟踪的实时定位系统和用于寻路的室内定位系统。 零、基本概念 - 官方文档 GATT(Generic Attribute Profile 通用属性配置文件) 它定义了两个BLE设备互相传输数据进行通信的方法,该方法用了两个概念,Service和Characteristic。 Profile profile...
Android 最近任务
获取最近任务sequenceDiagram ActivityManagerService ->> ActivityTaskManagerService: getRecentTasks ActivityTaskManagerService ->> RecentTasks: getRecentTasks RecentTasks ->> RecentTasks: loadUserRecentsLocked RecentTasks ->> RecentTasks: loadPersistedTaskIdsForUserLocked RecentTasks ->> TaskPersister: restoreTasksForUserLocked 最近任务持久化存放目录/data/system_ce/0/recent_tasks
Android 窗口
classDiagram class TaskDisplayArea class DisplayArea~T: WindowContainer~ class WindowContainer~E: WindowContainer~ class ConfigurationContainer~E: ConfigurationContainer~ { + getChildCount() int + getChildAt(int index) E + getParent() ConfigurationContainer } TaskDisplayArea --|> DisplayArea DisplayArea --|> WindowContainer WindowContainer --|> ConfigurationContainer WindowToken --|> WindowContainer TaskFragment --|> WindowContainer WindowState --|>...
正则表达式
基本匹配如有一个字符串abc123dfsfsd, 正则表达式abc123。匹配结果:abc123 任意匹配., 匹配任意的字符如有字符串abc123, 正则表达式.匹配结果:a,b,c,1,2,3 特殊匹配\w, 匹配字母、数字和下划线。\W, 匹配除字母、数字和下划线之外的字符。\d, 仅匹配数字。\D, 匹配除数字之外的字符。\s, 匹配空白符。\S, 匹配空白符之外的字符。 字符集[ ],中括号内的字符组成一个字符集,匹配集合内的任意字符。如有字符串beer deer feer, 正则表达式[bdf]eer.匹配结果:beer,deer,feer 否定字符集^在字符集的首部, 代表不匹配字符集中任意字符。如有字符串beer deer feer, 正则表达式[^bd]eer.匹配结果:feer 字符范围a-z, 代表匹配字符a到z左闭右闭的字符范围,数字同理。 字符次数+,代表前一个字符出现一次或者多次。如有字符串br ber beer, 正则表达式be+r。匹配结果:ber,beer*, 代表前一个字符出现0次或者多次。如有字符串br ber beer,...
ASM
ASM架构ASM是围绕事件生产者(class parser)、事件消费者(class writer)和各种预定义的事件过滤器的架构。架构图如下所示: 导入ASM库123456dependencies { //ASM相关依赖 implementation 'org.ow2.asm:asm:9.4' implementation 'org.ow2.asm:asm-commons:9.4' implementation 'org.ow2.asm:asm-util:9.4' ...
Jackson搭配data class使用的问题
有这样一个Task数据类: 1234567891011data class Task( val id: Int = -1, val userId: Int, val start: LatLonPoint, val end: LatLonPoint, val completed: LatLonPoint, val schedule: Float, val isAward: Int, val integral: Int, val tripMode: String ) 由于kotlin会为这个类生产getter、setter方法。 12345678910111213141516171819202122232425262728293031323334public final class Task { private final int id; private final int userId; private final float schedule; private...
Kotlin踩坑记录
kotlin过渡优化123456binding.noSignalPowerControl.visibility = if (context.resources.getBoolean(R.bool.support_no_signal_power_control)) { View.VISIBLE } else { View.GONE return } 这段代码,我本意是对于隐藏的View直接return,不进行下一步操作但是实际反编译的代码,在条件不成立的情况下没有进行noSignalPowerControl.visibility=GONE操作,而是直接忽略了。下面是反编译后的代码: 1234567SpinnerLayout var10000 = ((DisplayViewBinding)this.getBinding()).noSignalPowerControl; Intrinsics.checkNotNullExpressionValue(var10000,...
公共子表达式消除
公共子表达式消除是一项非常经典的、普遍应用于各种编译器的优化技术,它的含义是:如果一 个表达式E之前已经被计算过了,并且从先前的计算到现在E中所有变量的值都没有发生变化,那么E 的这次出现就称为公共子表达式。对于这种表达式,没有必要花时间再对它重新进行计算,只需要直 接用前面计算过的表达式结果代替E。如果这种优化仅限于程序基本块内,便可称为局部公共子表达 式消除(Local Common Subexpression Elimination),如果这种优化的范围涵盖了多个基本块,那就称 为全局公共子表达式消除(Global Common Subexpression Elimination)。下面举个简单的例子来说明它 的优化过程,假设存在如下代码: 1int d = (c * b) * 12 + a + (a + b * c); 当这段代码进入虚拟机即时编译器后,它将进行如下优化:编译器检测到c*b与b*c是一样的表达 式,而且在计算期间b与c的值是不变的。因此这条表达式就可能被视为: 1int d = E * 12 + a + (a +...
方法内联
定义方法内联(Method inlining)是一种编译器优化技术,它将函数调用直接替换为函数体中的代码。这样可以减少函数调用的开销,提高程序的执行效率。在方法内联的过程中,编译器会将被调用的函数的代码复制到调用点处,并对代码进行必要的修改以确保正确性。 适用范围按照经典编译原理的优化理论,大多数Java方法都无法进行内联。因为因为大多Java方法都是虚方法,只有静态方法、私有方法、实例构造方法、父类方法、final修饰的编译时确定的方法等方法才能进行内联,其余方法由于是虚方法,只有运行时才能确定方法的多态选择,所以无法进行内联。 解决方案引入类型继承关系分析(Class Hierarchy Analysis,CHA)用于确定已经加载的类中,某个接口是否有多余一种的实现、某个类是否存在子类、某个子类是否重写父类的某个虚方法等信息。 守护内联(Guarded Inlining)如果在内联碰到虚方法,会向CHA查询此方法在当前状态下是否有多个目标版本可供选择,如果只有一个版本,可以对方法进行内联,这种内联称为守护内联。若加载到新的类型从而改变CHA的结论,将执行退路(Slow...