aosp13/14命令行进入分屏相关实战

背景:

分屏一般在手机上都是都是从桌面的最近任务卡片进入的,一般来说手机用户都是这样操作的,但是有一些场景或者情况就不一定可以顺利用上这个桌面的多任务卡片进入。
比如以下场景:
1、可能不是桌面的多任务的场景,因为桌面进入相对来说流程较多选着较多,有的场景可能想要一键直接进入

2、有可能没有aosp的手机桌面,设备可能是车机,广告机等其他设备,这个时候不一定用的就是手机的桌面

3、经常开发有的可能需要使用命令进行调试等,或者自动化测试等

这个时候就需要有一个可以直接通过命令行拉起分屏的需求是最好的

相关命令

进入分屏相关的命令相关稳定性较差,基本上属于经常会变化情况,所以大家一定要注意查看最新的,具体查看方式可以看如下:
基于aosp13 r6版本命令:

help命令

相关命令一般都是基于WMShell下面进行的具体先看看WMShell命令支持哪些命令,这个需要输入help

test@test:~/disk2/aosp14$ adb shell dumpsys activity service SystemUIService  WMShell help
SERVICE com.android.systemui/.SystemUIService 71a3e0e pid=752 user=0
  Client:

    com.android.systemui.wmshell.WMShell:
    ----------------------------------------------------------------------------
    Window Manager Shell commands:
      help
          Print this help text.
      <no arguments provided>
        Dump Window Manager Shell internal state
      pair <taskId1> <taskId2>
      unpair <taskId>
        Pairs/unpairs tasks with given ids.
      moveToSideStage <taskId> <SideStagePosition>
        Move a task with given id in split-screen mode.
      removeFromSideStage <taskId>
        Remove a task with given id in split-screen mode.
      setSideStageOutline <true/false>
        Enable/Disable outline on the side-stage.
      setSideStagePosition <SideStagePosition>
        Sets the position of the side-stage.

    Dump took 0ms

pair命令

这里可以看到支持pair,moveToSideStage这两个核心的部分,具体这里进行解释一下:
pair
代表成对显示的意识,即吧taskId1和taskId2进行成对显示,即分屏,但是这个分屏和桌面进入的分屏是不一样的,核心不一样的点就是层级结构树都不一样,具体看如下实战。
第一步:
打开两个可以分屏的应用,然后通过命令查看task1和task2的id

test@test:~/disk2/aosp14$ adb shell am stack list
RootTask id=234 bounds=[0,0][1440,2960] displayId=0 userId=0
 configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h773dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2792) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATION_0} s.24 fontWeightAdjustment=0}
  taskId=234: com.android.dialer/com.android.dialer.main.impl.MainActivity bounds=[0,0][1440,2960] userId=0 visible=true topActivity=ComponentInfo{com.android.dialer/com.android.dialer.main.impl.MainActivity}

RootTask id=1 bounds=[0,0][1440,2960] displayId=0 userId=0
 configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h773dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2792) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=home mAlwaysOnTop=undefined mRotation=ROTATION_0} s.24 fontWeightAdjustment=0}
  taskId=232: com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher bounds=[0,0][1440,2960] userId=0 visible=false topActivity=ComponentInfo{com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}

RootTask id=233 bounds=[0,0][1440,2960] displayId=0 userId=0
 configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h773dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2792) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATION_0} s.24 fontWeightAdjustment=0}
  taskId=233: com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity bounds=[0,0][1440,2960] userId=0 visible=false topActivity=ComponentInfo{com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity}

RootTask id=2 bounds=[0,0][1440,2960] displayId=0 userId=0
 configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h773dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2792) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.24 fontWeightAdjustment=0}
  taskId=2: unknown bounds=[0,0][1440,2960] userId=0 visible=false

RootTask id=3 bounds=[0,0][1440,2960] displayId=0 userId=0
 configuration={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h773dp 560dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2792) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} s.24 fontWeightAdjustment=0}
  taskId=4: unknown bounds=[0,0][1440,2960] userId=0 visible=false
  taskId=5: unknown bounds=[0,0][1440,2960] userId=0 visible=false

可以看到这里的 短信taskId是233 电话的taskId是234
执行如下命令:

 adb shell dumpsys activity service SystemUIService  WMShell pair 233 234

看看现象:
在这里插入图片描述
看着是不是和桌面进入分屏一样,但是操作还有有一些区别:
1、分割线双击无法互换上下两个分屏
2、分割线拖拉没有对应屏幕的icon,有黑屏产生
3、对应的层级结构树不一样差异如下:
pair模式进入分屏,发现只有一个task1和task2居然直接挂载同一个父节点
在这里插入图片描述
桌面正常分屏模式
在这里插入图片描述

相当于多了一层挂载点哈,task1和task2有自己main和side 容器task

ps:注意一下版本差异,新版本已经没有了这个命令

moveToSideStage命令
  moveToSideStage <taskId> <SideStagePosition>

明显可以看出这个代表移动taskId到分屏的sideStagePosition,注意了,这个命令只需要指定一个taskId和他的position既可以,那么这里大家会有疑问那么另一个分屏该显示谁?
哈哈,这个其实没有指定当然就没办法按照你想要的task显示,这里系统源码展现的规则是:
当前task层级结构树的最顶部符合分屏要求的task,一般就是最顶端的task

具体使用:
查看短信taskid

  taskId=236: com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity bounds=[0,0][1440,2960] userId=0 visible=false topActivity=ComponentInfo{com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity}

然后把短信放到分屏上部分即0,下部分1

adb shell dumpsys activity service SystemUIService  WMShell moveToSideStage 236 0

这里看看现象:
在这里插入图片描述

分屏另一个显示电话app,但是一定电话么?当然不是,如果我们打开相册情况下,执行命令那么下部分就是相册
在这里插入图片描述
可以看出来又变成图库在下面了,所以这个命令其实不太灵活,没办法准确启动分屏两个task具体显示什么。

ps:高版本这个moveToSideStage命令还有使用差异
aosp14版本如下:
adb shell dumpsys activity service SystemUIService WMShell help

SERVICE com.android.systemui/.SystemUIService 494dc62 pid=736 user=0
  Client:

    com.android.systemui.wmshell.WMShell:
    ----------------------------------------------------------------------------
    Window Manager Shell commands:
      compatui
        restartDialogEnabled [0|false|1|true]
          Enable/Disable the restart education dialog for Size Compat Mode
        reachabilityEducationEnabled [0|false|1|true]
          Enable/Disable the restart education dialog for letterbox reachability
          Disable the restart education dialog for letterbox reachability
      protolog
        status
          Get current ProtoLog status.
        start
          Start proto logging.
        stop
          Stop proto logging and flush to file.
        enable [group...]
          Enable proto logging for given groups.
        disable [group...]
          Disable proto logging for given groups.
        enable-text [group...]
          Enable logcat logging for given groups.
        disable-text [group...]
          Disable logcat logging for given groups.
        save-for-bugreport
          Flush proto logging to file, only if it's enabled.
      splitscreen
        moveToSideStage <taskId> <SideStagePosition>
          Move a task with given id in split-screen mode.
        removeFromSideStage <taskId>
          Remove a task with given id in split-screen mode.
        setSideStagePosition <SideStagePosition>
          Sets the position of the side-stage.
      transitions
        tracing
          start
            Start tracing the transitions.
          stop
            Stop tracing the transitions.
          save-for-bugreport
            Flush in memory transition trace to file.
      help
          Print this help text.
      <no arguments provided>
        Dump all Window Manager Shell internal state



明显可以看到多个参数splitsreen,而且也没有pair命令

所以使用需要变成如下
adb shell dumpsys activity service SystemUIService WMShell splitscreen moveToSideStage 585 0

扩展一个startTask命令(代码只针对相关课程学员开源)

针对上面moveToSideStage无法确定另一个分屏的task情况,这里自己补充了startTask,使用方式如下:
adb shell dumpsys activity service SystemUIService WMShell splitscreen startTask taskId1 position1 taskId2 position2

具体实战使用如下:
taskId查看

taskId=590: com.android.dialer/com.android.dialer.main.impl.MainActivity
taskId=589: com.android.messaging/com.android.messaging.ui.conversationlist.ConversationListActivity

有了taskId就可以执行了

adb shell dumpsys activity service SystemUIService WMShell splitscreen startTask  589 0 590 1

在这里插入图片描述

本文章更多详细代码和资料需要购买课程获取
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

私聊作者+v(androidframework007)

其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/549156.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Altium Designer 20 笔记】PCB铺铜过程

PCB铺铜步骤 切换到Keep-Out Layer&#xff08;禁止布线层&#xff09; 使用shifts键切换单层显示 画禁止布线范围&#xff08;防止铺铜过大&#xff09; 切换到需要铺铜的层 选择铺铜网络&#xff0c;通常是地&#xff08;GND&#xff09;或某个电源网络 隐藏覆铜&#xff1a;…

一.吊打面试官系列-数据库优化-认识MySql索引

1.什么是索引 索引&#xff08;Index&#xff09;是帮助DBMS&#xff08;数据库&#xff09;高效获取数据的数据结构&#xff0c;索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。如果数据库没有索引就会走表进行全表扫描&#xff0c;一旦数据量上来&#xff0c…

如何基于香橙派AIpro对视频/图像数据进行预处理

背景介绍 受网络结构和训练方式等因素的影响&#xff0c;绝大多数神经网络模型对输入数据都有格式上的限制。在计算机视觉领域&#xff0c;这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图或视频的尺寸、格式等与网络模型的要求不一致时&#xff0c;我们需要对其…

【中间件】ElasticSearch简介和基本操作

一、简介 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎&#xff0c;支持各种数据类型&#xff0c;包括文本、数字、地理、结构化、非结构化 ,可以让你存储所有类型的数据&#xff0c;能够解决不断涌现出的各种用例。其构成如下&#xff1a; 说明&#xff1…

递归、搜索与回溯算法——递归

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享递归,搜索与回溯算法关于递归的专题 如果有不足的或者错误的请您指出! 目录 1.什么时候使用递归2.汉诺塔2.1解析2.2题解 3.合并两个有序链表3.1解析3.2题解 4.翻转链表4.1解析4…

Spring Boot 统一功能处理(二)

本篇主要介绍Spring Boot统一功能处理中的统一数据返回格式。 目录 一、定义统一的返回类 二、配置统一数据格式 三、测试配置效果 四、统一格式返回的优点 五、源码角度解析String问题 一、定义统一的返回类 在我们的接口在处理请求时&#xff0c;返回的结果可以说是参…

判断位数、按位输出、倒序输出(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int number 0;int i 1;int m 0;int z 0;int z1 0, z2 0, z3 0, z4 0;//提示用户&#xff1b;printf("请输…

编程新手必看,Python3中函数知识点及语法学习总结(18)

介绍&#xff1a; Python3中的函数是组织好的、可重复使用的代码段&#xff0c;用于实现单一或相关联的功能。 以下是Python3中函数的一些基本介绍&#xff1a; 函数定义&#xff1a;在Python中&#xff0c;可以通过def关键字来定义一个函数。函数定义后&#xff0c;可以多次调…

ADB的基本语法及常用命令

学习网址 ADB命令的基本语法如下&#xff1a; adb [-d|-e|-s <serialNumber>] <command> 如果有多个设备/模拟器连接&#xff0c;则需要为命令指定目标设备。 参数及含义如下&#xff1a; 常用命令如下&#xff1a; 1. 启动ADB服务 adb start-server 2. 停止…

【ROS2笔记六】ROS2中自定义接口

6.ROS2中自定义接口 文章目录 6.ROS2中自定义接口6.1接口常用的CLI6.2标准的接口形式6.3接口的数据类型6.4自定义接口Reference 在ROS2中接口interface是一种定义消息、服务或动作的规范&#xff0c;用于描述数据结构、字段和数据类型。ROS2中的接口可以分为以下的几种消息类型…

腾讯云优惠券领取及使用教程详解

腾讯云作为国内领先的云服务提供商&#xff0c;以其稳定可靠、性能卓越的服务赢得了广大用户的青睐。为了回馈用户&#xff0c;腾讯云经常推出各种优惠活动&#xff0c;其中优惠券就是非常受欢迎的一种。本文将详细介绍腾讯云优惠券的领取和使用方法&#xff0c;帮助大家更好地…

【c语言】结构体的访问

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

记录 OpenHarmony 使用 request.uploadFile 时踩的坑

​ 开发环境 设备环境&#xff1a;OpenHarmony 4.1.x SDK 版本&#xff1a;API 10 开发模型&#xff1a;Stage 模型 IDLE: Dev Eco 4.1 官方文档 踩坑一&#xff1a;后台服务地址 上传文件依赖后台服务器&#xff0c;如果使用本地搭建的服务&#xff0c;是无法访问的&…

两部电话机怎样能实现对讲?直接连接能互相通话吗?门卫门房传达室岗亭电话怎么搞?

目录 两部电话机能直接连接吗&#xff1f;用三通头分出来一条电话线两部电话机用一根电话线直接连接能互相通话吗&#xff1f; 什么电话机可以直接连接两部IP电话机&#xff08;网络电话机&#xff09;可以直接连接两部普通电话机之间通过一个电话交换机也可以连接跨区域的两部…

Avalonia中嵌入网页程序(CefNet)

Avalonia中嵌入网页程序cefNet 1. 引入CefNetNuget包2. 下载 cef 基础环境3. 将cef基础环境放入程序运行目录下4. 代码中初始化cef5. 添加Webview控件6. 在窗口关闭的时候释放Cef7. 项目结构图CefNet 开源的作者已经停止维护并删除了原始的代码库:GetHub:CefNet,Nuget上还有发…

【简单介绍下单片机】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Python编程之旅:深入探索强大的容器——列表

在Python编程的世界中&#xff0c;容器&#xff08;Containers&#xff09;是一种用于存储多个项目的数据结构。其中&#xff0c;列表&#xff08;List&#xff09;是最常用且功能强大的容器之一。无论是初学者还是资深开发者&#xff0c;掌握列表的使用方法和技巧都是提升Pyth…

引导和服务(2)

服务 1.systemd服务的简要介绍 &#xff08;1&#xff09;对比5 6 可以解决依赖关系并行启动 &#xff08;2&#xff09;按需启动 &#xff08;3&#xff09;自动解决依赖关系 负责在系统启动或运行时&#xff0c;激活系统资源&#xff0c;服务器进程和其它进程 2.System…

Python 处理地理空间异常值:基于 MAD 的简单方法

就像任何其他数据一样,在处理地理空间数据时,识别和纠正异常值是数据准备中的关键步骤,可确保任何后续分析的准确性。异常值可能会严重扭曲空间分析的结果,从而导致错误的结论。虽然还有其他方法可以解决此问题,但处理这些异常值的一种直接有效的方法是使用中值绝对偏差 (…

第十一届土木与城市工程国际会议(ICCUE 2024)即将召开!

第十一届土木与城市工程国际会议&#xff08;ICCUE 2024&#xff09;将于2024年8月20-22日在意大利罗马召开。土木与城市工程&#xff0c;作为人类社会发展的重要基石&#xff0c;承载着推动城市繁荣、提升人民生活质量的重任。ICCUE 2024的召开&#xff0c;旨在搭建一个国际化…