android多屏触摸相关的详解方案-安卓framework开发手机车载车机系统开发课程

【干货】Android系统定制基础篇:第十六部分(双屏异触、定时开关机与看门狗) 如果看门狗功能处于打开状态,Android 系统会在小于看门狗超时时长内定时发送心跳数据给 MCU,如果看门狗超时时长到,仍未收到心跳数据,则拉低 RESET 引脚10ms,使 CPU 复位重启。通过属性配置副屏 TP 的: 设备名、PID&VID、USB 端口,在 EventHub 中获取输入设备的设备名、PID&VID、USB 端口与属性值进行对比,如果是配置中的设备就将其标记为副输入设备。发送看门狗(Watchdog)心跳,至少在每个看门狗超时周期内发送一次心跳,否则超时复位。获取看门狗超时时长。 阅读详情
AI摘要

文章讲述了在开发双屏应用时遇到的触摸功能问题,介绍了两种解决方案:静态修改ConfigurationFile中的displayId,以及动态通过adbshelldumpsys进行输入映射。重点在于获取虚拟显示屏的uniqueId并应用到input配置中。,

背景

直播免费视频课程地址:https://www.bilibili.com/video/BV1hN4y1R7t2/

在做双屏相关需求开发过程中,经常会有对两个屏幕都要求可以正确触摸的场景。但是目前我们模拟器默认创建的双屏其实是没有办法进行触摸的
在这里插入图片描述

修改方案1

静态修改方案
使用命令查看display2即副屏的信息情况
adb shell dumpsys display

  Display 2:
    mDisplayId=2
    mPhase=1
    mLayerStack=2
    mHasContent=true
    mDesiredDisplayModeSpecs={baseModeId=2 allowGroupSwitching=false primaryRefreshRateRange=[0 Infinity] appRequestRefreshRateRange=[0 Infinity]}
    mRequestedColorMode=0
    mDisplayOffset=(0, 0)
    mDisplayScalingDisabled=false
    mPrimaryDisplayDevice=HDMI Screen
    mBaseDisplayInfo=DisplayInfo{"HDMI Screen", displayId 2", displayGroupId 0, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_PRESENTATION, FLAG_TRUSTED, real 1440 x 2960, largest app 1440 x 2960, smallest app 1440 x 2960, appVsyncOff 2000000, presDeadline 75, mode 2, defaultMode 2, modes [{id=2, width=1440, height=2960, fps=1.3333333E7, alternativeRefreshRates=[]}], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[], mMaxLuminance=500.0, mMaxAverageLuminance=500.0, mMinLuminance=0.0}, userDisabledHdrTypes [], minimalPostProcessingSupported false, rotation 0, state ON, type EXTERNAL, uniqueId "local:4619827551948147201", app 1440 x 2960, density 560 (215152.0 x 214811.02) dpi, layerStack 2, colorMode 0, supportedColorModes [0], address {port=1, model=0x401cecae7d6e8a}, deviceProductInfo DeviceProductInfo{name=EMU_display_1, manufacturerPnpId=GGL, productId=4660, modelYear=null, manufactureDate=ManufactureDate{week=12, year=2021}, connectionToSinkType=0}, removeMode 0, refreshRateOverride 0.0, brightnessMinimum 0.0, brightnessMaximum 1.0, brightnessDefault 0.5, installOrientation ROTATION_0}

这里主要看对应的uniqueId “local:4619827551948147201”

然后结合input中需要这个uniqueId,更新地方:


2: virtio_input_multi_touch_7
      Classes: TOUCH | TOUCH_MT | SWITCH
      Path: /dev/input/event8
      Enabled: true
      Descriptor: e1c836c7be888adb29ca6646292e486f96461e97
      Location: virtio17/input0
      ControllerNumber: 0
      UniqueId: 
      Identifier: bus=0x0006, vendor=0x0000, product=0x0000, version=0x0000
      KeyLayoutFile: 
      KeyCharacterMapFile: 
      ConfigurationFile: /vendor/usr/idc/virtio_input_multi_touch_7.idc
      VideoDevice: <none>

就是这个 ConfigurationFile: /vendor/usr/idc/virtio_input_multi_touch_7.idc

去源码的out路径下修改/aosp/out/target/product/emulator_x86_64/vendor/usr/idc/virtio_input_multi_touch_7.idc
主要把touch.displayId 变成上面的获取的local:4619827551948147201

device.internal = 1

touch.deviceType = touchScreen
touch.orientationAware = 1

cursor.mode = navigation
cursor.orientationAware = 1

# This displayID matches the unique ID of the virtual display created for Emulator.
# This will indicate to input flinger than it should link this input device
# with the virtual display.
touch.displayId = local:4619827551948147201  

再进行整体编译即可以

修改方案2

动态修改方案
思路通过调用input中相关方法对config进行相关修改
对应方法如下:
在这里插入图片描述

即只需要通过这个方法即可以指定触摸的input —》对应显示display进行映射
注意这里使用是port阿,不是displayId
port也可以通过dumpsys display查看哈:
在对应的address有对于的port值,一般就是第一个屏幕0,第二屏幕1

address {port=1, model=0x401cecae7d6e8a}, deviceProductInfo DeviceProductInfo{name=EMU_display_1, manufacturerPnpId=GGL, productId=4660, modelYear=null, manufactureDate=ManufactureDate{week=12, year=2021}

确定了了display的port还有一个input相关inputPort参数,这个就直接通过dumpsy input获取哈,在dumpsys寻找对应屏幕的event,从而找到对应的Device

 2: virtio_input_multi_touch_7
      Classes: TOUCH | TOUCH_MT | SWITCH
      Path: /dev/input/event8
      Enabled: true
      Descriptor: e1c836c7be888adb29ca6646292e486f96461e97
      Location: virtio17/input0
      ControllerNumber: 0
      UniqueId: 
      Identifier: bus=0x0006, vendor=0x0000, product=0x0000, version=0x0000
      KeyLayoutFile: 
      KeyCharacterMapFile: 
      ConfigurationFile: /vendor/usr/idc/virtio_input_multi_touch_7.idc
      VideoDevice: <none>

就是这里的 Location: virtio17/input0,virtio17/input0就是我们要的

做好一个动态调用触发,这里直接也使用dumpsys input命令里面进行:

commit 72193cfb966307940457148bedc793c316d67af5 (HEAD)
Author: Your Name <you@example.com>
Date:   Fri Aug 25 17:23:22 2023 +0800

    add displayfortouch modify

diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 72612a0468cd..587a7b313b8f 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -2678,6 +2678,14 @@ public class InputManagerService extends IInputManager.Stub
         if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
 
         pw.println("INPUT MANAGER (dumpsys input)\n");
+        pw.println("INPUT MANAGER args size = "+args.length + "\n");
+        if (args.length == 3 && args[0].equals("displayForInput")) {
+            String location = args[1];
+            int port = Integer.parseInt(args[2]);
+            addPortAssociation(location,port);
+            pw.println("INPUT MANAGER addPortAssociation location= "+location +" port = " +port+ " \n");
+            return;
+        }
         String dumpStr = mNative.dump();
         if (dumpStr != null) {
             pw.println(dumpStr);


最后使用命令:
adb shell dumpsys input displayForInput virtio17/input0 1

Android10 (.idc)配置文件的解析过程分析 .idc、.kl文件的加载过程分析.idc文件简述路径与命名常用配置属性加载.idc文件调用流程EventHub::openDeviceLockedEventHub::loadConfigurationLockedgetInputDeviceConfigurationFilePathByDeviceIdentifierPropertyMap::load参考资料 .idc文件 简述 .idc文件(Input Device Configuration)为输入设备配置文件,它包含设备具体的配置属性。 输入设备配置 阅读详情

相关推荐

Android Framework车载双屏互动:从架构设计到车规级实现

在智能座舱与物联网领域,设备间的无缝协同已成为核心体验。其技术原理通常基于分布式系统架构,通过中间件实现异构设备间的发现、连接与数据同步,从而将计算与显示能力解耦并重组。这一技术的核心价值在于打破硬件边界,实现资源(如算力、屏幕、传感器)的高效共享与体验的连续性。典型的应用场景包括跨设备应用流转、多屏协同办公以及本文聚焦的智能座舱双屏互动。在车载环境下,该技术面临高可靠性、低延迟与严苛安全性的独特挑战。以Android Framework为基础进行深度定制,构建包含虚拟显示管理、输入事件注入与低延迟编解码传

weixin_30448603的博客 527

Android车载双屏开发避坑指南:手把手教你实现应用跨屏迁移(基于Android 12+ Framework)

本文详细解析了Android 12+ Framework层在车载双屏开发中的应用跨屏迁移技术,涵盖开发环境搭建、手势识别适配、任务迁移优化等核心内容。针对车载环境的特殊需求,提供了真机调试配置、手势冲突解决方案及性能优化建议,帮助开发者高效实现安卓车载双屏交互。

weixin_42528780的博客 370

Android WMS深度解析:从窗口管理到车机系统实战

在Android系统开发中,窗口管理是构建复杂用户界面的核心技术基础。其核心原理在于通过WindowManagerService(WMS)统一管理系统中的所有窗口(Window),负责窗口的创建、排序(Z-order)、布局以及输入事件分发。这项技术的核心价值在于为应用提供了稳定、高效的显示与交互基础,尤其在多窗口、分屏以及系统级悬浮窗等高级场景中不可或缺。在智能座舱、车机系统等复杂应用场景下,对WMS的深入理解和定制能力直接决定了系统UI的稳定性与表现力。本文聚焦WMS的架构设计与实战,通过剖析窗口类型、

weixin_34337381的博客 404

红米手机查看屏幕厂家

红米手机查看屏幕厂家 屏幕厂家代码 36:天马 37:深超 38:三星 41:维信诺 42:华星光电 43:JDI 获取屏幕厂家代码的方法如下 设置 -> 我的设备 -> 全部参数 -> 内核版本(狂点N下) -> 右上角设置按钮 -> 辅助工具 -> Log抓取工具 -> Bug report (等待生成报告) 报告生成完毕后 -> 文件管理 -> 手机(右上角) -> debug_log -> ...

uu564237933的博客 3万+

Android Framework双屏互动架构:智能座舱多屏协同核心技术解析

在智能座舱与物联网领域,多设备协同已成为提升用户体验的关键技术。其核心原理在于通过系统级的进程间通信与状态同步机制,打破设备间的信息孤岛,实现计算资源与交互状态的共享。这项技术的核心价值在于构建无缝的跨设备体验,将单一功能整合为有机的生态。在应用场景上,它广泛适用于导航接力、媒体跨设备控制、游戏流式传输等智能座舱交互。本文深入探讨了基于Android Framework的双屏互动实现方案,重点剖析了其跨进程通信、统一窗口管理及安全稳定性保障等核心模块,为构建高效、可靠的车载多屏协同系统提供了关键技术路径与工

weixin_34161032的博客 410

Android Framework构建智能座舱双屏互动:架构、通信与车规级实践

在智能汽车与物联网融合的背景下,跨设备协同成为提升用户体验的关键技术。其核心原理在于构建高效、可靠的通信中间件,通过服务化架构抽象硬件差异,实现数据与状态在多终端间的实时同步。这项技术的核心价值在于打破信息孤岛,为安全、便捷的智能交互提供基础支撑,广泛应用于智能座舱、车载信息娱乐系统及物联网场景。以当前热门的“双屏互动”为例,它正是该技术在车载领域的具体实践,通过深度整合车机与手机能力,实现导航流转、疲劳监测等智能场景。本文聚焦于基于Android Framework构建高可靠跨设备通信通道与状态同步机制,

weixin_30292843的博客 344

安卓手机车机系统开发面试福利:一线手机车载系统开发相关面试题

14.多屏互动项目中,窗口移动到副屏后,有没有考虑音频焦点的管理,比如继续维持主屏扬声器发声还是副屏扬声器发声?一般你只要跟着马哥认真学了课程,这些题目其实都不是什么大问题哈,当然有一些题目也确实有一定难度哈。有没有性能更加优秀方案。

learnframework的博客 257

高通三屏显示-副屏display[1] dpi密度修改

背景: AOSP中的副屏作为external屏幕,会根据一个公式来计算副屏display[1]的dpiDensity。根据屏幕的不同,需要修改这个dpi density的值。 目的&知识讲解: 目的:修改dpi density,使副屏display[1] 密度正确。 知识讲解:分辨率(PX) 分辨率就是手机屏幕的像素点数。一般为屏幕的“宽×高”,例如分辨率有720×1280的手机设备,表示此屏幕在宽度方向有720个像素点,在高度方向有1280个像素点。 屏幕尺寸(英寸inch) 按

jiang_dlut 1771

安卓车机车载面试福利6:一线厂商车载系统开发相关面试题

8.如果副屏显示了一个最近使用app的列表,主屏是你自己开发的 APP,我在最近列表中点击了 APP,希望把主屏中的 APP拿过来,怎么实现?4.双指拖动当前窗口的话,触摸事件会误触窗口中的activity吗,如果会,如何防止误触?

learnframework的博客 745

深耕车载智能:奇瑞安卓车机开发工程师岗位深度解析与面试指南

奇瑞控股集团招聘安卓车机开发工程师(J22602),负责车载应用开发、性能优化及整车适配。要求大专以上学历,3年以上车机开发经验,精通Android框架及车机特定技术(如Vehicle HAL)。岗位需具备性能调优能力、整车系统适配经验,熟悉车规级开发环境。面试重点考察技术深度、项目经验及问题解决能力,涉及基础技术、性能优化及整车适配等维度。随着智能座舱发展,该职位需持续学习新技术(如AAOS),关注行业趋势(多屏联动、舱驾融合)。职业发展建议深化Android技术,拓展车规硬件知识,提升软技能。

郑伟强dev的专栏 478

别再为多相机标定头疼了!用VisionMaster统一坐标系的保姆级教程

本文详细介绍了使用VisionMaster平台解决多相机视觉系统中坐标系统一问题的完整流程。从标定板选择到N点标定,再到实战演练,提供了从原理到落地的全方位指导,帮助工程师高效解决多相机定位引导中的坐标偏差问题。

weixin_38168322的博客 632

安卓系统fw工程师面试福利9:近期收集学员手机车载FW面试真题

3、看你这边说了解protolog和各种log调试方式,请问你工作中一般怎么看log,main,events,system,kernel,protolog日志分别代表什么,可否详细说说具体场景,及你从这些log中有什么启发,如果要你为某个模块设计详细log你会怎么做。13、看你fw知识面都比较广,而且熟悉程度也还可以,请问你这边对framework知识技能掌握有啥方式方法,你这边如果在未来工作中会很忙,而且framework技术也发现成长有了瓶颈,有啥突破瓶颈想法?你思考过为啥新版本就要有Spy?

learnframework的博客 471

手把手教你用Qt5打造二次元游戏启动器(附鸣潮同款UI源码)

本文详细介绍了如何使用Qt5框架从零开始构建一个功能完整、UI风格贴近《鸣潮》的二次元游戏启动器。教程涵盖无边框窗口、动态背景、自定义控件绘制、多线程资源加载以及下载管理等核心模块的实现,并提供了可运行的源码参考,帮助C++开发者和Qt爱好者深入掌握现代桌面应用开发技术。

weixin_29291863的博客 265

自学成为android framework工程师需要准备哪些装备-千里马车载车机系统开发学习

目前高版本的aosp版本编译都是耗费内存巨大的,所以这里的建议内存最少要有16G,内存不足,那么导致的结果那就是,经常编译源码时候无故退出,停止,oom等,这个时候最简单方式加内存条,不加那就只能减少make的线程,比如make -j 1,单线程编译让编译过那块的耗内存任务。具体需要什么配置呢?建议intel cpu(amd cpu也可以),一般都可以满足,越多核越好,这个是影响你编译速度关键,差异也巨大,比如学员里面编译8.1的老代码为例,有的编译源码10小时,有的16分钟。不然你就只能保留一套代码。

learnframework的博客 2655

从零搭建VGGNet

在 forward 方法中实现了前向传播过程,包括卷积、激活、池化和平铺操作,最后通过全连接层得到分类结果。使用 torch.onnx.export 将模型导出为 ONNX 格式的文件 vgg.onnx。导出 ONNX:将模型导出为 ONNX 格式,便于在其他平台或框架中使用。定义 VGG 网络:构建了一个包含多个卷积层、池化层和全连接层的网络。使用 torch.save 将整个模型保存为 vgg.pth 文件。前向传播:对输入数据进行前向传播,得到输出结果。保存模型:将模型保存为 .pth 文件。

开源驱动,创造价值;坦诚清晰,快速失败;让复杂可计算。 521

AI影像组学在结直肠癌诊疗中的应用:从特征提取到临床决策

影像组学通过高通量计算从医学影像中提取定量特征,揭示肿瘤内部的微观生物学行为,这些特征反映了纹理异质性、形状不规则度等影像表型。其核心原理在于将图像数据转化为可分析的数字特征,结合机器学习算法进行模式识别,从而实现对疾病状态的精准预测。这一技术的价值在于能够无创、定量地评估肿瘤特性,为精准医疗提供关键支持。在临床实践中,AI驱动的影像组学模型广泛应用于结直肠癌的诊疗全链条,包括肿瘤良恶性鉴别、基因突变预测、治疗反应评估和预后分析等场景。通过整合影像组学特征与临床数据,可以构建预测模型,辅助医生进行更准确的诊

weixin_28295799的博客 409

安卓车载手机Framework 面试真题汇总(fw/性能优化/多屏/Input/Binder/wms)-近期v搜集ip学员汇总

不过市场上车载相关的岗位其实还算可以,android系统开发(非app开发)的就业还算比较不错,主要就是因为这些年国家大力发展新能源汽车,各个车机大厂车机系统开发岗位需求大大增加,毕竟都把车机系统功能在汽车发布时候进行大力宣传,开的像手机一样的科技发布会。如果副屏显示了一个最近使用app的列表,主屏是你自己开发的 APP,我在最近列表中点击了 APP,希望把主屏中的 APP拿过来,怎么实现?多屏互动项目中,窗口移动到副屏后,有没有考虑音频焦点的管理,比如继续维持主屏扬声器发声还是副屏扬声器发声?

learnframework的博客 469

汇川H5U模拟量输出模拟量转换FC: S_RTI

汇川H5U模拟量输入模拟量转换 FC S_ITR_RXXW_Dor的博客-优快云博客接口中的临时变量,如果优化的可以省去一些,感兴趣的可以自行编写修改下,这里不在举例。至此模拟量输入转换FC编写完成。

RXXW_Dor的博客 6679

Android 11 CarLauncher源码解析与自定义车载桌面开发实战

车载系统定制开发中,桌面Launcher不仅是UI展示层,更涉及任务栈管理、焦点分发、壁纸联动等系统级机制。Android 11将TaskView从SystemUI下沉至CarLauncher,为车厂定制提供了更大自由度。理解CarLauncher的源码结构,包括TaskView、Workspace、GridCardView等核心组件,是打造稳定流畅车载桌面的基础。本文从AOSP系统应用开发视角出发,梳理CarLauncher的架构原理与运行机制,并基于实际工程经验,分享自定义车载Launcher的完整步骤

weixin_34021089的博客 312

AppStore逆向分析(登录、查询、下单)

某网站全协议流程逆向与分析(自动登录、激活、查询、下单)

吴秋霖的博客 3027

ABAP BDC 处理踩坑笔记:把错误挡在录制之前,把稳定做进每一行 BDCDATA

本文总结了SAP BDC(批输入)开发中的常见问题和解决方案。重点包括:1)理解BDCDATA本质是模拟人工操作而非直接操作数据库;2)数据格式化技巧,如金额、日期、物料号等字段的标准化处理;3)通过CTU_PARAMS参数控制执行环境,确保屏幕尺寸和更新模式一致;4)不要依赖sy-subrc,应通过解析MESSTAB消息判断业务是否成功;5)录制阶段的常见陷阱及解决方法;6)疑难问题的系统性解决思路;7)建议建立完善的错误处理机制,包括日志记录和重跑功能。文章提供了实用的ABAP代码示例和配置建议,帮助开

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 265
上一篇: Launcher对RecentView展示TaskView详细分析-android framework车载车机手机系统开发
下一篇: 上滑动导航栏手势桌面最近任务可见解密-千里马手把手带你搞定framework车载车机系统开发
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值