GyroHook 是一个允许用户修改安卓设备陀螺仪传感器数据的项目。它包含一个安卓应用、一个 Xposed 模块和一个 C++ 命令行工具,它们共同协作以实现对陀螺仪数据的自定义控制。
- 自定义陀螺仪偏移: 用户可以通过安卓应用设置 X, Y, Z 轴的旋转偏移量。
- 实时数据修改: Xposed 模块会读取这些偏移量,并实时应用到系统的陀螺仪事件中。
- 多种数据输入方式:
- 安卓应用界面: 直接在应用内输入和保存设置。
- Socket 通信: 安卓应用可以启动一个 Socket 服务器,接收外部发送的陀螺仪数据并更新设置。
- C++ 命令行工具:
- 可以作为 Socket 客户端连接到安卓应用的服务器,发送固定的或模拟的陀螺仪数据。
- 可以直接修改配置文件 (SharedPreferences) 来更新陀螺仪设置。
-
安卓应用 (
app目录):- 提供用户界面 (
MainActivity.kt) 来输入陀螺仪的 X, Y, Z 偏移值和 Socket 服务器端口。 - 将设置保存到 SharedPreferences 文件 (
/data/user/0/com.example.gyrohook/shared_prefs/gyro_settings.xml)。 - 内置一个 Socket 服务器,用于接收外部发送的陀螺仪数据,并更新应用的设置。
- 提供用户界面 (
-
Xposed 模块 (
app目录中的GyroHook.kt):- 在 Xposed 框架下运行。
- 读取由安卓应用保存的 SharedPreferences 文件中的陀螺仪偏移值。
- Hook 系统底层的传感器事件分发方法 (
dispatchSensorEvent)。 - 当检测到陀螺仪传感器事件时,将配置的偏移量添加到原始传感器数据上。
-
C++ 命令行工具 (
test目录):main.cpp: 主程序,提供了两种操作模式。socket模式:- 作为客户端连接到安卓应用中运行的 Socket 服务器。
- 可以发送一次性的固定 X, Y, Z 值。
- 可以模拟连续的陀螺仪运动并周期性发送数据。
file模式:- 直接读取并修改 SharedPreferences 文件 (默认路径:
/data/user/0/com.example.gyrohook/shared_prefs/gyro_settings.xml)。 - 注意: 该工具会将数据以 JSON 格式写入文件,而原生 SharedPreferences 是 XML 格式。这依赖于 Xposed 模块或应用端对此的兼容处理。
- 直接读取并修改 SharedPreferences 文件 (默认路径:
GyroHook.cpp/GyroHook.hpp: 包含了 C++ 客户端的 Socket 通信逻辑 (GyroClient类) 和文件操作逻辑 (GyroFileUtils命名空间)。
- 设置: 用户通过安卓应用
MainActivity设置陀螺仪的 X, Y, Z 偏移值和 Socket 通信端口。这些设置被保存到应用的 SharedPreferences 文件中。 - Hook 与修改:
- Xposed 模块
GyroHook在系统层面加载。 - 它会读取 SharedPreferences 中的设置。
- 当任何应用请求陀螺仪数据时,
GyroHook会截获原始数据,并根据用户的设置进行修改,然后将修改后的数据传递给请求的应用。
- Xposed 模块
- 外部控制 (可选):
- 通过 Socket:
- 安卓应用启动 Socket 服务器。
- C++ 命令行工具以
socket模式运行,连接到该服务器。 - C++ 工具发送新的 X, Y, Z 数据。
- 安卓应用收到数据后,更新界面显示,并将新设置保存回 SharedPreferences。Xposed 模块随后会读取到新的设置。
- 通过文件修改:
- C++ 命令行工具以
file模式运行。 - 直接修改 SharedPreferences 文件内容。
- Xposed 模块在下次读取配置时(例如,传感器事件触发时重新加载配置)会获取到新的设置。
- C++ 命令行工具以
- 通过 Socket:
编译 test 目录下的 main.cpp 和 GyroHook.cpp (例如使用 g++)。
基本用法:
./main <mode> [options]模式 (mode):
socket: 通过 Socket 发送数据。file: 直接修改配置文件。
Socket 模式选项 (./main socket [ip_address] [port] [x y z]):
-
ip_address: 服务器 IP 地址 (默认:127.0.0.1)。 -
port: 服务器端口 (默认:16384)。 -
x y z: (可选) 要发送的固定 X, Y, Z 值。如果提供,则只发送一次。如果不提供,则进入模拟持续发送模式。- 示例 (模拟发送到指定 IP 和端口):
./main socket 192.168.1.100 12345
- 示例 (发送一次固定值到默认 IP 和端口):
./main socket 127.0.0.1 16384 1.0 2.5 -0.5
- 示例 (发送一次固定值 X,Y,Z 默认为 0,到默认 IP 和端口):
./main socket 127.0.0.1 16384 1.0 2.5
- 示例 (模拟发送到指定 IP 和端口):
文件模式选项 (./main file [file_path] <x> <y> <z> [port_value]):
-
file_path: (可选) 配置文件的完整路径 (默认:/data/user/0/com.example.gyrohook/shared_prefs/gyro_settings.xml)。 -
x y z: 要写入文件的 X, Y, Z 值 (必需)。 -
port_value: (可选) 要写入文件的端口值 (默认:16384)。- 示例 (使用自定义路径、值和端口):
./main file /sdcard/my_settings.json 0.1 0.2 0.3 12345
- 示例 (使用默认路径,提供 X, Y, Z 值和端口):
./main file 0.1 0.2 0.3 12345
- 示例 (使用默认路径和端口,提供 X, Y, Z 值):
./main file 0.1 0.2 0.3
- 示例 (使用自定义路径、值和端口):
- Xposed 依赖:
GyroHook.kt模块的运行需要设备上已安装并激活 Xposed 框架。 - 文件权限: 确保配置文件具有正确的读写权限,以便应用、Xposed 模块和 C++ 工具能够正常访问。安卓应用在保存设置时会尝试设置文件权限。
- 配置文件格式: C++ 工具目前以 JSON 格式写入配置文件,而安卓的 SharedPreferences 通常是 XML 格式。
XSharedPreferences在读取时需要能正确解析这种由 C++ 工具写入的 JSON 格式文件,或者 C++ 工具生成的文件需要与XSharedPreferences的期望格式一致。目前代码中 C++ 端写入的是一个纯 JSON 字符串到.xml后缀的文件。
本项目采用 MIT 许可证。详细信息请参阅 LICENSE 文件。