android R版本常见dump信息分析

本文介绍如何使用adb命令查看安卓系统的活动和服务信息,包括屏幕显示、任务栈、窗口模式、活动状态等,并解析了关键字段含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • adb shell dumpsys activity activities

  • Display #:屏幕的displayId,默认主屏是0,堆栈在display上自上而下输出,越往上越在栈顶图层越在上
  • RootTask #:根栈的taskId,原生非分屏场景的RootTask就是Task本身,也就是RootTask并没有包含嵌套其他子栈
  • type=:栈类别,一般应用栈是standard,桌面是home    mode=:窗口模式,全屏是fullscreen,原生悬浮窗是freeform、分屏是split-screen-primary和split-screen-secondary,若窗口类型是厂商自定义,可能输出不同的自定义值
  • mBounds=:Task的大小范围,全屏栈值都是0,分屏、悬浮窗才有值  
  • mResumedActivity:栈中当前resume的activity
  • mLastPausedActivity:栈中当前pause的activity
  • * Task{2ad2d3b #158 type=standard A=10212:com.tencent.qqlive U=0 visible=true mode=freeform translucent=false sz=2}         RootTask的子Task信息(非分屏场景的RootTask就是Task本身,从taskId上可以看出),158是taskId,类型是普通应用,uid是10212,包名(进程名)是com.tencent.qqlive,用户id是0即主用户,窗口模式是悬浮窗,非透明栈,栈内有2个activity对象
  • affinity=:区别栈的亲和度,默认不配置就是包名,affinity可以使得一个应用内部的activity分属多个栈
  • intent=:表示启动该栈首个activity使用的intent
  • Activities=:表示task内部的activity集合,末尾的activity是栈顶的activity
  • mRootProcess=ProcessRecord{c3a5ced 3866:com.tencent.qqlive/u0a212} :root process表示栈根activity的进程(一个栈可能存在不同进程的activity),3866是进程id,u0a212是主用户下uid为10212的包
  • mResizeMode=:栈是否resizeable,决定栈能否支持多窗口
  • * Hist #:打印栈内每个activity的信息
  • packageName=:表明该activity所在包,processName=:表明该activity所在进程
  • launchedFromUid=:表明activity被哪个uid的包所启动(activity拉起溯源的关键信息)
  • Intent {:表示启动activity所用的intent,栈内根activity的这个intent与启动task的intent等同
  • baseDir=:表示activity所在包的安装路径, dataDir=:表明进程数据所在路径
  • CurrentConfiguration=:表明activity的当前的config信息     state=:表明activity的当前生命周期状态
  • idle=:表明该activity是否执行完onResume生命周期且回调系统侧刷新activity的idle状态,部分应用hook应用进程的一些调度后会导致该状态无法置true进而导致一些切换场景的问题
  • windows=:打印activity对应的window对象信息
  • mOrientation=:activity所请求的orientation值(Activity.setRequestedOrientation动态请求或者AndroidManifest.xml给activity节点静态配置android:screenOrientation值)
  • mVisible=:表明activity在系统侧是否已经设置visibile     mClientVisible=:表明是否通知应用端刷新activity窗口可见性
  • reportedDrawn=:表明activity的窗口是否绘制完毕
  • maxAspectRatio=:用于高长宽比全面屏使用,表明activity是否可以充满屏幕(targetsdk大于等于O的不配置默认满屏)
  • minAspectRatio=:用于低长宽比的折叠屏展开态使用,表明activity是否可以充满屏幕(S版本开始不配置默认满屏)
  • configChanges=:十六进制值,表明activity在AndroidManifest中配置的android:configChanges属性值,字符串与十六进程值对应关系参见ActivityInfo类,该值决定config发生变化时activity走relaunch还是onConfigurationChanged
  • adb shell dumpsys window windows

  • Window #:打印每个window的窗口信息,即WindowState对象,在dump信息中搜索窗口的关键字就搜这个
  • mDisplayId=:window所在displayId
  • rootTaskId=:window所在task的taskId(若是分屏窗口,则该taskId是分屏的根taskId,不是window所在task的taskId)
  • mOwnerUid=:窗口所在应用的uid   showForAllUsers=:窗口是否在所有用户下可见(attrs.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS可以达到窗口在所有用户下可见的目的)
  • package=:窗口所在应用包名
  • mAttrs=:应用指定的窗口起点和宽高
  • adjust=:反映的是窗口属性中的softInputMode值,作用于输入法弹出时窗口布局刷新
  • layoutInDisplayCutoutMode=:反映窗口是否需要使用挖孔(挖孔屏)、曲边(曲面屏),常量值在WindowManager中
  • ty=:窗口类型,比如应用窗口、输入法、壁纸之类的,常量值在WindowManager类中定义
  • fl=:窗口指定的flags,比如要透壁纸的SHOW_WALLPAPER   pfl=:窗口指定的privateFlags
  • vsysui=:作用于窗口是否显示导航栏和状态栏及其状态
  • Requested w= h=:请求的窗口宽高
  • mActivityRecord=:窗口对应的activity
  • mViewVisibility=:窗口可见性, 0x0是visible, 0x4是invisible,0x8是gone
  • mFullConfiguration=:窗口当前的config信息
  • mHasSurface=:窗口是否已创建surface
  • mFrame=:窗口的最终大小
  • WindowStateAnimator{:打印窗口对应的WindowStateAnimator对象
  • mSurface=:窗口对应的图层surface
  • shown=:表示图层是否显示
  • mDrawState=:窗口的绘制状态,应用若正常绘制完成状态应该为HAS_DRAWN
  • isVisible=:表明窗口是否可见
  • adb shell dumpsys SurfaceFlinger

一般查看图层dump信息按照以下步骤操作:

1 、在dump文件中先搜索关键字 HWC layers 找到所有可见图层
  • Display 0 HWC layers:该节点下展示所有可见图层大小和位置信息(图层的可见区域一定是屏幕内的区域)
  • Layer name:表示图层名字
  • Window Type:窗口类型,比如应用窗口、输入法、壁纸之类的,常量值在WindowManager类中定义
  • Comp Type:表示图层合成方式,DEVICE表示GPU硬件合成、CLIENT表示CPU软件合成
  • Disp Frame:表示图层的位置(left、top、right、bottom)

2、找到目标图层并搜索图层名字

比如腾讯视频悬浮窗页面com.tencent.qqlive/com.tencent.qqlive.ona.activity.VideoDetailActivity#0,然后搜索该关键字找到图层bufferlayer

  • BufferStateLayer:图层bufferlayer是个BufferStateLayer, bufferlayer的父图层及以上节点都是ContainerLayer
  • Region VisibleRegion:指的是图层在屏幕内的可见区域
  • z=:图层的z轴顺序,也就是层级高低,值越大越高,不过不同应用栈的activity窗口层级比较,需要上溯到EffectLayer (Task=这个父图层去比较,看activity所在Task在TaskDisplayArea上的z值大小。
  • pos:图层起点
  • size=:图层大小
  • crop:图层裁剪区域(left,top,width,height)
  • cornerRadius=:图层圆角浮点值
  • tr=:图层缩放比
  • parent=:图层父节点
  • zOrderRelativeOf=:层级相对节点图层
  • metadata=:图层携带的metadata键值属性
  • shadowRadius=:图层的四周阴影半径,R版本开始SurfaceControl支持直接给图层设置阴影半径

WindowStateAnimator(WindowSurfaceController)

 3、从BufferStateLayer可以一级级通过parent属性值往上溯源查看父节点ContainerLayer图层信息

WindowState ActivityRecord Task

<think>好的,我现在需要回答用户关于“Source Crop (LTRB) in HWC layers display debugging meaning and usage”的问题。首先,我需要理解Source Crop (LTRB)在HWC层中的具体含义和用途。根据用户提供的引用内容,特别是引用[1]中的BufferLayer信息,里面提到了Rect mCrop这个成员变量。Rect通常用来表示一个矩形区域,而LTRB可能代表Left, Top, Right, Bottom,即矩形的四个边界值。 接下来,我需要确认Source Crop在HWC(硬件合成器)中的作用。HWC负责将不同的图层合成到显示设备上,而Source Crop可能用于指定从源图层中裁剪出一个子区域进行显示。这在调试显示问题时非常有用,例如当图层内容超出预期范围或需要调整显示区域时,可以通过查看Source Crop的值来确认是否正确设置。 此外,用户提到显示调试信息,因此需要说明在调试过程中如何利用Source Crop参数。比如,开发者可以通过检查这些值来验证是否有意外的裁剪,或者调整裁剪区域以优化显示效果。结合引用[1]中的mCrop,应该是在BufferLayer中存储了裁剪信息,传递给OutputLayer进行合成。 最后,需要确保回答符合用户的要求,结构清晰,使用中文,正确应用LaTeX格式,并在引用处添加标识。同时生成相关问题,帮助用户进一步理解相关概念。</think>### Source Crop (LTRB) 的含义与用途 在显示合成(HWC)中,**Source Crop (LTRB)** 是一个用于定义图层源数据裁剪区域的参数,其名称由 **Left(左)、Top(上)、Right(右)、Bottom(下)** 四个边界值组成。它以矩形(`Rect`)的形式表示,单位通常为像素或坐标系中的比例值(取决于具体实现)。 #### 具体含义: - **作用**:指定从原始图层(如图像、视频或UI元素)中裁剪出一个子区域,仅显示该区域的內容。 - **数据结构**:在Android框架中,`Rect mCrop`(如引用[1]中的`BufferLayer::BufferInfo`)保存了裁剪信息,其值通过LTRB四个参数定义,例如: $$(left=10, top=20, right=200, bottom=300)$$ 表示从原始图层左上角坐标$(10,20)$到右下角坐标$(200,300)$的区域被保留。 #### 调试中的用途: 1. **显示异常排查** 当图层内容显示不完整或位置偏移时,检查`Source Crop`是否错误地裁剪了有效内容。例如,若右边界值过小,可能导致内容右侧被截断。 2. **性能优化** 通过裁剪不需要渲染的区域(如透明边距),减少实际传输到显示器的数据量,降低GPU负载[^1]。 3. **多图层合成验证** 在多层叠加场景中(如视频播放+悬浮控件),通过对比各图层的`Source Crop`与实际显示区域,确认合成逻辑是否正确。 #### 典型应用场景: - **视频播放**:裁剪黑边或特定画面区域。 - **UI适配**:针对不同屏幕比例调整控件显示范围。 - **动态特效**:通过动态修改裁剪区域实现动画效果。 ### 相关问题 1. 如何通过Android系统工具(如`dumpsys SurfaceFlinger`)查看当前图层的`Source Crop`值? 2. `Source Crop`与`Destination Frame`在显示合成中的区别是什么? 3. 在Android图形系统中,如何处理裁剪区域与变换(Transform)的叠加效果? [^1]: 引用[1]中的`BufferLayer::BufferInfo`结构体存储了裁剪信息(`mCrop`),这些信息最终传递给`OutputLayer`用于合成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值