Android/Linux:在较低系统级别记录(电源)键使用情况

Android/Linux: Log (power) key usage on lower system level

我不是在搜索一段特定的代码,而是在寻找从哪里开始研究的提示。对于有经验的 android 开发人员来说,我想做的可能是一件容易的事。

我只是想在比 Dalvik 引擎更低的级别上记录所有硬件按钮交互。我是 Android 开发的新手,我从未在 Linux/Unix 基础上开发过,但我在 C 方面的经验很少。

我经常发现有人问他们如何在他们的应用程序中使用电源按钮,我发现通常这是不可能的,或者至少不打算这样做,因为系统本身会捕捉电源按钮按钮,并且不会将其交给 Java VM 中的应用程序或服务 运行(不同于按下音量控制按钮,您可以为其注册监听器的按键事件)。

但是,我想编写一个简单的过程或任何适合记录所有按钮按下的过程(音量控制、电源按钮或设备上可用的任何硬件按钮)。

现在,由于我对这个主题还很陌生,而且此刻我的知识有限,所以我的第一个想法是使用 linux 进程或内核扩展来完成这项工作。稍后我可能想填充我自己的消息、事件或任何我可以通过 JNI(如果我理解正确的话)在应用程序或后台服务中接收的内容。

所以这是我的问题:我需要做什么才能捕获硬件按钮交互并将它们用于我自己的目的(记录文本消息)而不干扰默认系统功能?库、进程、内核扩展或我还没有想到的完全不同的东西?非常感谢任何想法或提示。

亲切的问候 扬·蒂勒曼

经过更多研究,我发现 Android 的 PhoneWindowManager.java 方法 interceptKeyBeforeDispatching 是我可以挂钩的地方。

现在您要么必须更改此 class 并编译您自己的系统版本,要么您可以使用 xposed 框架(在 root 设备上)及其方法挂钩来获得事件通知。

我使用 hooks beforeHookedMethod() 方法来检查我感兴趣的 KeyEvent 事件。据我所知,我现在可以拦截 KeyEvent(例如 KeyEvent.KEYCODE_POWER)并执行我的自己的代码,但仍然让系统决定如何处理事件。

我什至可以检查模式(例如,按住 3 到 5 秒,然后短按不到 1 秒)来执行我的代码。按住电源 5 秒钟,系统仍然会提示我关闭或重启设备,但我的代码也会执行。