需求和问题记录,以博客形式记录。
1、背景
当前需求基本出现在商显大屏,需要满足多点触控的场景。
当前出现的问题是:触摸硬件设备满足40点触控,但系统仅开放16点触控,当出现16+个点同时在设备操作时,导致设备重启。
问题的根因应该是:
- 系统组件可能使用了固定大小的数组或缓冲区来存储和处理触摸事件。当触摸点数超过这些数组或缓冲区的容量时,可能发生越界访问,导致系统crash重启。
-
超过系统限制的触摸点可能导致处理触摸事件的线程或进程消耗过多资源(如CPU时间、内存等),影响系统的稳定性。
2、需求
需要触摸屏(触摸框)厂家提供固件。
首先需要保证的是该硬件具备有40点触控数据识别的功能,然后才是提供40点的固件。
最后才开始做系统的适配。
3、系统修改
(1)首先找到IMS中对应的模块:(本文以Android 9为例)
Android13\frameworks\native\include\input\Input.h
可以看到此处宏定义系统默认的最大触控点数是16点,按需求修改数值即可。
此外:
Android13\frameworks\native\include\android\input.h
中同样可以看到关于16点的宏定义,按需修改。
同样的:(有关注到Android13中文件位置略有变动,可自行grep查找)
Android13\frameworks\native\include\input\InputEventLabels.h
对应修改。
(2)触控点数的不同
如果你修改的需求是20点,或32点以内,到这里直接编应该是没什么问题。
但如果需要达到32+,乃至更多点的触控点数的话,需要修改:
Android13\frameworks\native\include\input\Input.h
此处需要对应修改。
但是!!敲重点的来了:
修改更多的触控点数对设备CPU的要求会变高,更多的触控点数会造成内存的占用,修改前需要确认产品的需求。
(3)编译
此时如果直接编译,很可能不会报出任何错误,烧录后系统无法启动,卡在开机logo页。
因为我们在对Android framework进行修改之后,需要对api进行更新。
(建议删除整个out目录后再进行后续操作)
回到代码根目录:make update-api
然后就是漫长的整编过程。
(4)烧录
测试看看。
正常启动。
找4个人来在系统上同时画线看看——
正常。
done!!
4、严谨的测试
需要在Android原生的设置下,打开Android开发者模式,在开发者模式中打开触控点数据的反馈。
(1)进入原生设置:
am start com.android.settings/.Settings
(2)关于手机:
连续点击版本号直至进入开发者模式
(3)系统->开发者选项:
打开指针位置。
(4)测试:
实际最高能达到32个点。