Android Input设备debug技巧

本文详细介绍安卓系统中触控输入的调试方法,包括驱动层、Native层和Java层的关键检查点。从驱动上报到Framework层接收,覆盖点上报、设备属性、设备模式及消息类型等常见问题。

一、驱动层

检查是否有点上报

adb shell getevent -l /dev/input/eventX

检查input设备支持的属性值

adb shell getevent -i /dev/input/eventX

二、Native层

检查驱动上报的点是否被InputReader转发给上层

在TouchInputMapper::sync(nsecs_t when)函数中,打印相关的变量值,检查报点路径是否正常。驱动已经报点,但是上层收不到点的情况大致有以下几种:

a. 设备模式被设为禁用模式,mDeviceMode == DEVICE_MODE_DISABLED

引起此问题的原因是,在注册input device时,有些属性值设置不合法,导致在configure阶段,走了异常流程;

b. 设备类型不正确,走了其他路径

三、Java层

在ViewRootImpl.java文件的onInputEvent( )函数中添加打印信息,检查底层上报的点,是否通过Framework层成功上报了。

一般来讲,如果onInputEvent能收到点,报点基本上是OK的。

有些特殊情况除外,报点的消息类型不正确或者TP的横竖坐标搞反了,会出现上层收点了,但是TP仍然无法正常使用。

以上是debug input子系统的几个关键地方,如果想debug更细一些,还可以划分更多关键点出来,但是根据我目前的调试经验,这几点基本够用了。希望这个能给大家在调试的时候提供一些帮助!

### Android 开发或使用中的实用技巧Android 开发过程中,有许多小技巧可以提高开发效率和应用的用户体验。以下是一些常见的实用技巧: #### 1. 有序管理功能引导 在开发过程中,对于新用户首次使用应用时的功能引导,可以采用有序管理的方式。通过分步骤地引导用户了解应用的核心功能,而不是一次性展示所有信息,可以提升用户的理解和使用体验。这种方式尤其适用于功能较为复杂的应用场景。 #### 2. 给 View 增加按下态 可以通过一行代码为任意 View 添加按下态效果,从而提升用户交互体验。例如,使用 `View.setPressed()` 方法结合选择器(Selector)实现视觉反馈。此外,也可以通过 `RippleDrawable` 实现 Material Design 风格的涟漪效果。 ```xml <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/ripple_effect" android:text="Click Me" /> ``` #### 3. 扩大点击区域 在 Android 中,可以通过 `TouchDelegate` 来扩大某个 View 的点击区域,而无需修改布局结构。这对于小控件(如按钮)的点击体验优化非常有用。 ```java final View parent = findViewById(R.id.parent); final View child = findViewById(R.id.child); parent.post(new Runnable() { @Override public void run() { Rect rect = new Rect(); child.getHitRect(rect); rect.top -= 50; // 扩展顶部点击区域 rect.bottom += 50; // 扩展底部点击区域 rect.left -= 50; // 扩展左侧点击区域 rect.right += 50; // 扩展右侧点击区域 parent.setTouchDelegate(new TouchDelegate(rect, child)); } }); ``` #### 4. 运行时切换 Debug 模式 在 Android Studio 中,可以通过点击 **Attach debugger to Android process** 按钮来在应用运行时附加调试器,而不是直接以 Debug 模式启动应用。这种方式可以更灵活地进行调试,尤其是在需要观察某些特定运行状态时非常有用。 #### 5. EditText 在 ActionBar 中作为搜索框时的适配问题 当将 `EditText` 放置在 ActionBar 中作为搜索框时,如果设置 `android:imeOptions="actionSearch"`,在横屏模式下可能会导致 EditText 宽度过宽。为了解决这个问题,可以将 `imeOptions` 设置为 `actionSearch|flagNoFullscreen`,以避免全屏输入法的影响。 ```xml <EditText android:id="@+id/search_edit_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:imeOptions="actionSearch|flagNoFullscreen" android:inputType="text" /> ``` #### 6. 系统预定义隐藏常量的访问 Android 系统中有一些预定义的隐藏常量(如 `com.android.internal.R.id.inputExtractEditText`),这些常量不能直接通过包名访问。可以通过反射机制获取这些资源 ID,从而在需要时使用它们。 ```java try { Class<?> internalR = Class.forName("com.android.internal.R$id"); Field field = internalR.getField("inputExtractEditText"); int inputExtractEditTextId = field.getInt(null); // 使用 inputExtractEditTextId } catch (Exception e) { e.printStackTrace(); } ``` #### 7. 动态计算 DIP 值 在不同设备上保持一致的 UI 表现时,通常需要将像素值(px)转换为密度无关像素(dp)。可以通过 `TypedValue.applyDimension()` 方法动态计算 DIP 值。 ```java int dipValue = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 10, getResources().getDisplayMetrics() ); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值