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

news2024/11/25 22:25:59

背景:

分屏一般在手机上都是都是从桌面的最近任务卡片进入的,一般来说手机用户都是这样操作的,但是有一些场景或者情况就不一定可以顺利用上这个桌面的多任务卡片进入。
比如以下场景:
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/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++入门 命名空间

文章目录 C入门命名空间域作用限定符域作用限定符操作C的域编译器的搜索原则命名空间域的展开命名空间的嵌套 C入门 命名空间 命名空间的存在&#xff1a;为了解决同域中起名字冲突的问题 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、…

使用Python实现文字识别,教你如何从图片中识别提取文字

今天分享的是如何使用Python从图片中提取文字。虽然从我的实际操作结果来看第三方库的图片文字识别效果并不是十分理想&#xff0c;但也能满足我的需求了。 首先&#xff0c;我们需要知道Python中两个非常重要的库&#xff1a;Pillow和Tesseract-OCR。Pillow是一个免费开源的图…

类与对象(中

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 目录 前言 一、类的6个默认成员函数 二、构造函数 2.1 概念 2.2 特性 2.3 总结 三、析构函数 3.1 概念 3.2 特性 3.3 总结 四. 拷贝构造函数 4.1 概念 4.2 特征 4.3 总结 五.赋值运算符重载 5.1 运算符重载 5.2 赋…

OpenHarmony实战开发-Grid和List内拖拽交换子组件位置。

介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子组件&#xff0c;到目标List子组件…

Linux进阶篇:性能监控工具:socket 统计信息

Linux性能监控工具&#xff1a;socket 统计信息 1 ss命令介绍 ss 是 Socket Statistics 的缩写。ss 命令可以用来获取 socket 统计信息&#xff0c;它显示的内容和 netstat 类似。但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息&#xff0c;而且比 netsta…

408数据结构,怎么练习算法大题?

其实考研的数据结构算法题是有得分技巧的 得分要点 会写结构定义&#xff08;没有就自己写上&#xff09;写清楚解题的算法思想描述清楚算法实现最后写出时间和空间复杂度 以上这四步是完成一道算法题的基本步骤&#xff0c;也是其中得分的主要地方就是后面两步。但是前面两…

【HCIP】OSPF的高级特性

OSPF的高级特性1 --- 不规则区域 一、OSPF不规则区域类型 产生原因&#xff1a;区域划分不合理&#xff0c;导致的问题 1、非骨干区域无法和骨干区域保持连通 2、骨干区域被分割 造成后果&#xff1a;非骨干区域没和骨干区域相连&#xff0c;导致ABR将不会帮忙转发区域间的路由…

自学Java的第二十四次笔记

一,方法重载 1.基本介绍 java 中允许同一个类中&#xff0c;多个同名方法的存在&#xff0c;但要求 形参列表不一致&#xff01; 比如&#xff1a; System.out.println(); out 是 PrintStream 类型 2.重载的好处 1) 减轻了起名的麻烦 2) 减轻了记名的麻烦 3.快速入门案…

免费无限换脸神器Facefusion最新版(支持数字人)

Facefusion&#xff0c;一款超炫的AI视频/图片换脸项目&#xff0c;号称“下一代换脸器和增强器”。作者一直在不停地更新&#xff0c;新版2.3.0版本甚至还支持了数字人&#xff0c;快随我去看看吧~ Facefusion2.3.0新版本介绍 Facefusion新版本升级了人脸解析能力&#xff0c…

算法学习——LeetCode力扣补充篇8(146. LRU 缓存、 215. 数组中的第K个最大元素、25. K 个一组翻转链表)

算法学习——LeetCode力扣补充篇8 146. LRU 缓存 146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09; 描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化…

基于深度学习的乳腺癌淋巴结转移预测模型(E-Transformer)

乳腺癌细胞淋巴结转移是界定乳腺癌早中期的重要标准&#xff0c;需要活检&#xff0c;患者体验较差。 传统的图像辅助诊断需要手动提取特征、组合图像特征&#xff0c;效率低下、效果不佳。新兴的基于深度学习的图像辅助诊断&#xff0c;利用卷积神经网络通过全连接层或机器学…

ubuntu23.10.1 php8.2安装

1、更新镜像源 apt update2、安装php 如果在这里不知道自己Linux能安装什么版本的php,可以使用apt install php,会给你提示&#xff0c;根据提示自己选择版本安装 apt install php我这里是php8.2-cli apt install php8.2-cli其他扩展包&#xff0c;在后面加个-可以查看&…

跟TED演讲学英文:How AI can bring on a second Industrial Revolution by Kevin Kelly

How AI can bring on a second Industrial Revolution Link: https://www.ted.com/talks/kevin_kelly_how_ai_can_bring_on_a_second_industrial_revolution Speaker: Kevin Kelly Date: June 2016 文章目录 How AI can bring on a second Industrial RevolutionIntroduction…

福布斯发布2024年人工智能初创企业50强

随着人工智能热潮的持续&#xff0c;一种新的技术经济正在帮助企业开发和部署人工智能驱动的应用程序。在《福布斯》第六届年度“人工智能50强”榜单上&#xff0c;这类新锐企业正大行其道。该榜单遴选了AI领域最有前途的初创公司&#xff0c;由《福布斯》在领先行业专家的帮助…

文献速递:深度学习胰腺癌诊断--胰腺癌在CT扫描中通过深度学习检测:一项全国性的基于人群的研究

Title 题目 Pancreatic Cancer Detection on CT Scans with Deep Learning: A Nationwide Population-based Study 胰腺癌在CT扫描中通过深度学习检测&#xff1a;一项全国性的基于人群的研究 01 文献速递介绍 胰腺癌&#xff08;PC&#xff09;的五年生存率是所有癌症中…

redis五种类型介绍

Redis是一种内存数据存储系统&#xff0c;它支持五种不同的数据类型&#xff1a; 1. String String是Redis中最基本的数据类型&#xff0c;它可以存储任何形式的字符串数据&#xff0c;例如普通的文本字符串&#xff0c;二进制数据或JSON格式的数据。除此之外&#xff0c;还可以…

AtCoder Educational DP Contest

A - Frog 1 大意 有块石头&#xff0c;第块石头的高度为。从石头跳到石头的花费是。 一只青蛙在石头上&#xff0c;每次可以跳步或步&#xff0c;请问跳到石头的最小代价是多少&#xff1f; 思路 设&#xff0c;为青蛙跳到第号石头时的最小代价。 每一个点都可以由前两个点…

动态规划Dynamic programming详解-编辑距离问题【python】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

【笔试训练】day3

今天的题又简单了很多欸 1.简写单词 没思路 代码&#xff1a; #include <iostream> #include<string> using namespace std;int main() {string str;string ans;getline(cin,str);if(str[0]>Z)ans(str[0]-32);else ansstr[0];for(int i1;i<str.size();i…

Linux第88步_非阻塞IO实验

非阻塞IO是“应用程序”对“驱动设备”进行操作&#xff0c;若不能获取到设备资源&#xff0c;则非阻塞IO应用程序的线程不会被“挂起”&#xff0c;即线程不进入休眠&#xff0c;而是一直“轮询”&#xff0c;直到获取到设备资源为止&#xff0c;或者直接放弃。 非阻塞IO应用举…