Android 13 WindowContainer窗口模型详解
简介Android 13后窗口模型系列架构存在较大变更,本文围绕WindowContainer总结窗口模型。
类图
窗口模型架构解析新的窗口从WMS.addWindow()开始。首先根据DisplayId取得或创建对应的DisplayContent,然后创建WindowToken、WindowState,建立InputChannel,最后调用DisplayContent.sendNewConfiguration()。然后调用DisplayContent.updateOrientation()和sendNewConfiguration()来更新方向和conf。SurfaceControl由WindowToken管理。
DisplayContent.sendNewConfiguration()如果addWindow()后方向发生改变,会触发对应Display的Conf更新。
根据Rotation和DisplayInfo,计算当前屏幕宽高、方向,组装Configuration和WindowConfiguration,将新的Configuraion通过DisplayContent.upda ...
Android 11 startActivity之ActivityStarter流程
11:23 amMonday, 4 July 2022 (HKT)Time in Hong Kong
概述
流程
startActivity
ActivityStarter.execute
ActivityStack.startActivityLocked
RootWindowContainer.resumeFocusedStacksTopActivities
ActivityStack.resumeTopActivityUncheckedLocked
ActivityStackSupervisor.startSpecificActivity
总结
概述基于Android 11分析startActivity()过程中ActivityStarter的流程。
流程startActivitystartActivity()调用实际上由startActivityForResult()实现,通过Instructmention借助Binder向ATMS发起请求。ATMS根据请求的Intent、参数等信息借助ActivityStarterController和ActivityStarter ...
Android 11 setRequestedOrientation流程详解
7:30 pmTuesday, 5 July 2022 (GMT+8)Time in Guangzhou, Guangdong Province, China
概述
流程
ActivityRecord.setRequestedOrientation
onDescendantOrientationChanged
DisplayContent.onDescendantOrientationChanged
ATMS.updateGlobalConfigurationLocked
RootWindowContainer.onConfigurationChanged
WindowProcessController.onConfigurationChanged
DisplayContent.performDisplayOverrideConfigUpdate
ATMS.ensureConfigAndVisibilityAfterUpdate
ATMS.continueWindowLayout
ViewRootImpl.dispatchResized
总结
概述分析Android ...
显示系统稳定性:Kernel模块加载顺序和i2c漏电导致的花屏问题
背景研发一个机型的过程中出了点意料之外的问题。在关机状态下,进行电源适配器(DC)连续插拔测试时,在特定操作下会有概率性出现花屏现象,而且花屏现象不一致不统一。
现象如下图所示。图中无关紧要的位置打了马赛克,bug的问题现象是屏幕显示的内容花了。虽然都是关机充电界面花屏,但是花的内容款式有几种不同的。
Failed Rate:每7-8次出现1次;测试未发现与特定屏型号、特定屏单体、特定主板单体有关。与特定操作和场景强相关。
步骤:设备处于关机状态下 → 接入DC电源 →设备因关机充电而自动开机 → 显示开机logo → 显示充电动画 → 如果发现充电动画正常,则立刻拔出DC,然后尽快马上再次插入,再次循环;如果花屏,则问题复现。
平台:CPU → mipi → IT6151 → eDP → TCON→ SOURCE IC → LCD
异常分析软件出图分析:动画无异常、软件出图无特殊逻辑分析显示问题的时候,第一步可以先看看我们从CPU出来的画面本身是否正常的。一般花屏可以通过截图和投屏、录屏来确认图源的正常情况,但是我们是在关机充电画面,Android尚未启动,故无法进 ...
Android 11 WindowContainer窗口模型详解
3:34 pmWednesday, 29 June 2022 (HKT)Time in Hong Kong
概述
类图
总结
概述基于Android 11分析ConfigurationContainer和WindowContainer的模型。
类图
类
说明
ConfigurationContainer
WindowContainer
WindowProcessController
与AMS的ProcessRecord通信、与ActivityThread通信
RootWindowContainer
Tree root节点
DisplayContent
RootWindowContainer的子节点,用于管理同一个逻辑屏的窗口
DisplayChildWindowContainer
DisplayContent中的所有子节点的父类
NonAppWindowContainers
继承于DisplayChildWindowContainer,保存非应用的WindowToken
WindowContainers
只包含一个子节点:Display ...
Android setRequestedOrientation流程详解
概述
ConfigurationContainer家族
setRequestedOrientation调用
概述基于Android 10分析setRequestedOrientation()调用的流程。
ConfigurationContainer家族
ConfigurationContainer()体系结构
其中聚合关系是通过ConfigurationContainer.getParent()聚合的,集成关系则是各子类的继承关系。
setRequestedOrientation调用类图
setRequestedOrientation()触发Task.onDescendantOrientationChanged()
Task.onDescendantOrientationChanged()流程
ConfigurationContainer的四大ConfigurationConfigurationContainer包含了四个Configuration成员(以及一个用于计算Configuration时的中间临时载体mTmpConfig)。
1234567891011// Cont ...
Android resizeTask流程详解
3:09 pmThursday, 23 June 2022 (HKT)Time in Hong Kong
概述
ATMS.resizeTask -> TaskRecord.resize
Task.resize
总结
概述ATMS.resizeTask -> TaskRecord.resize与setWindowingMode()在窗口模式下是对ActivityStack操作resize()不同,resizeTask()是对TaskRecord的resize()进行操作的。
TaskRecord设置bounds,更新Configuration并触发children同步更新,最后调用Task.resize()。
Task.resizeTask.resize()的主要工作是,借助WindowContainer的体系,将resize bounds通过onConfigurationChanged()传递到children(AppWindowToken、WindowState)。并在此过程中通过Surface Transaction将Surface设置为指定的大小、摆 ...
Android setTaskWindowingMode流程详解
10:01 amWednesday, 22 June 2022 (GMT+8)Time in Guangzhou, Guangdong Province, China
概述
ActivityTaskManagerService.setTaskWindowingMode
ActivityStack.setWindowingMode
ActivityStack.ConfigurationContainer.setWindowingMode
TaskRecord.scheduleUpdateMultiWindowMode
ActivityStack.resize
RootActivityContainer.resumeFocusedStacksTopActivities
总结
概述基于Android 10分析ATMS.setTaskWindowingMode()流程。
ActivityTaskManagerService.setTaskWindowingModesetTaskWindowingMode判断是否为请求的目标windowingMode是否为分屏模式并调用对应方法处理分 ...
Android startService启动流程详解
概述基于Android 10.0源码(AOSP-10.0.0-r1)分析startService流程,剖析相关流程的关键点和framework核心机制。
过程service的启动过程主要分为三大部分,包括发出startService调用的机制、system_server中对service的处理、应用进程中对service的创建流程和生命周期回调。
Context.startService
Context是Abstract类,它是由ContextImpl实现的,并通常以装饰器模式被ContextWrapper包装。App中Context.startService()调用实质上是由ContextWrapper.mBase即ContextImpl.startService()实现的。
ContextImpl.startService()首先会调用 warnIfCallingFromSystemProcess()来检查调用者是否为系统进程。日志中的警告信息就是这里打印店额。
ContextImpl.startService()关键实现是ContextImpl.startServiceC ...
Android bindService流程详解
2:37 pmTuesday, 14 June 2022 (HKT)Time in Hong Kong
概述
流程
App
SystemServer
概述本文基于Android 10分析总结bindService流程,展示关键流程和关键类。
流程整体流程分为App侧和SystemServer侧两大块。bindService与startService一样,如果service对应的进程还未启动,那么会先启动对应的进程,然后在启动后再查找等待bind的调用。bindService()回调ActivityThread后,会publishService()发布服务,AMS收到服务发布时会查找等待bind的调用并完成绑定。即服务的启动和绑定是分离的。
App
App提供ServiceConnection用于监听服务绑定情况,调用ContextImpl时,会从LoadedApk.getServiceDispatcher()获取包装了ServiceConnection和服务绑定相关逻辑的ServiceDispatcher。ServiceDispatcher通过Binder调用b ...