android系统添加新键值流程

本文详细解析了在Android系统中添加新键值的过程,从驱动层到Java层,包括键值映射、资源文件更新及消费键值的具体实现。

1. 前言

android系统有时候会有添加新键值的需求,底层方面和上层方面可能会由于发行平台,芯片厂商和系统版本的原因会存在一定差异,但原理基本相同,个人理解就是收到原始信号之后,底层键值与上层键值进行一一映射,然后在上层处理相应键值。下面就举例一个新键值,首页键添加过程中所要修改的点。

2. 驱动层

驱动层键值信号传递跟芯片厂商有关,就以hisi芯片Android4.4版本为例:
驱动层收到原始信号之后进行映射:
key.xml

<other>
    <key value="0x34cbff33" name="KEY_HOME"       />
</other>

value的值为收到的原始信号值,键值信号会通过name变量值映射往上层抛
linux_key.h

{"KEY_HOME",		102       }

3. native层

kl文件对应驱动的键值

key 102   HOME

再往上:
./framworks/native/include/input/KeycodeLabels.h

static const KeycodeLabel KEYCODES[] = {
	......
    { "HOME", 3 },
	......
};

./framwork/native/include/android/keycodes.h

enum {
	......
   AKEYCODE_HOME    = 3,
	......
};

4. java层

./framworks/base/core/java/android/view/KeyEvent.java

public static final int KEYCODE_HOME            = 3;
names.append(KEYCODE_HOME, "KEYCODE_HOME");

5. 添加到资源文件

./framworks/base/core/res/res/values/attrs.xml

<enum name="KEYCODE_HOME" value="3" />

6. 消费键值

./framworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) {
		......
		switch (keyCode) {
			   case KeyEvent.KEYCODE_HOME:
                
                     return result;
         }
                
	
		......
}
### 在 Android添加唤醒源的键值以支持休眠状态唤醒但亮屏 在展讯平台的 Android 系统中,若需实现休眠状态下的设备唤醒而点亮屏幕,则需要从以下几个方面入手:定义的唤醒源键值、修改底层驱动程序中的中断处理逻辑以及调整框架层的行为。 --- #### 1. **定义唤醒源键值** 在 Android 系统中,增唤醒源的键值通常涉及以下步骤: - **定义 Key 名称** 在 `hardware/libhardware/include/hardware/power.h` 文件中扩展枚举类型 `hw_power_state_t`,增加自定义的唤醒源标识符。例如: ```c typedef enum { POWER_STATE_OFF, POWER_STATE_ON, CUSTOM_WAKEUP_SOURCE, // 自定义唤醒源 ... } hw_power_state_t; ``` - **注册 Key 到 Framework 层** 将该唤醒源映射到 Android 上层框架中使用的常量表。可以在 `frameworks/base/core/res/res/values/config.xml` 文件中添加一个的布尔型配置项: ```xml <bool name="config_customWakeupSourceEnabled">true</bool> ``` 此处表示启用自定义唤醒源的功能[^3]。 --- #### 2. **修改底层驱动程序** 为了让系统识别来自特定硬件模块(如传感器或其他外设)的唤醒信号,需要对驱动代码进行适配: - **启用 IRQ 唤醒功能** 在驱动初始化阶段调用函数 `enable_irq_wake()` 注册指定的中断号作为合法唤醒源。例如: ```c static int __init custom_device_probe(struct platform_device *pdev) { int irq = platform_get_irq(pdev, 0); if (irq > 0) { enable_irq_wake(irq); // 启用该IRQ作为唤醒源 } return 0; } ``` - **捕获唤醒事件并通知 Power Manager** 当检测到有效的唤醒信号时,应向 Android 的电源管理服务发送广播消息。可通过 `wake_lock` 和 `wake_unlock` 接口锁定 CPU 防止再次进入深度睡眠,并通过 Binder IPC 调用告知上层应用进程已发生唤醒动作[^1]。 --- #### 3. **调整 Framework 行为** 为了避免屏幕被意外点亮,还需进一步干预 Android 框架层的服务逻辑: - **拦截 Wakeup Event 处理流程** 编辑文件 `PhoneWindowManager.java`,重写方法 `interceptKeyBeforeQueueing()` 来过滤掉可能导致屏幕点亮的操作码。例如: ```java @Override public boolean interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) { final int action = event.getAction(); if (action == KeyEvent.ACTION_DOWN && event.getScanCode() == SCANCODE_CUSTOM_WAKEUP) { // 忽略此按键引发的任何UI变化 return true; // 截停事件传播链条 } return super.interceptKeyBeforeQueueing(event, policyFlags); } ``` - **维护独立的任务队列** 创建后台线程专门用于执行与用户界面无关的工作负载,确保即使触发了唤醒机制也会干扰前台 Activity 生命周期[^3]。 --- #### 4. **测试验证方案** 完成上述改造后,建议按照以下步骤验证功能是否满足预期效果: 1. 设置目标设备进入 Sleep Mode; 2. 触发预置好的唤醒条件(如连接 USB 数据线或按下专用按钮); 3. 检查日志确认是否有对应标志位记录生成; 4. 确认显示屏始终保持熄灭状态直至手动解除限制。 --- ```python # 示例伪代码展示如何模拟异步任务调度 import threading def background_task_handler(): while True: process_pending_requests() thread = threading.Thread(target=background_task_handler) thread.daemon = True thread.start() ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值