前言
当你费劲千辛万苦终于成功启动 GSI 的时候,你会发现这东西居然亮度调节、蓝牙甚至屏幕旋转都不正常,心态瞬间就崩了。。
但好在你找到了这篇文章,就不算太糟,这些其实都有方法解决!
已知问题
系统属性:
- 缺少平板特征声明
- 亮度范围错误
- 蓝牙 A2DP offload 异常
HAL层:
- Sensors HAL 中对 Device Orientation Sensor 的值处理和 GSI Framework 不兼容
如何修复系统属性领域的问题
非常简单,只需要在 vendor 的 build.prop 修改(如没有则追加):
# 平板特性
ro.build.characteristics=tablet
# 解决:将 sprd_backlight 最大亮度设为 1023
persist.sys.qcom-brightness=1023
# 解决:禁用蓝牙 A2DP offload
persist.bluetooth.a2dp_offload.disabled=true
如何修复其它领域的问题
本文所讨论的屏幕方向传感器是 Android 的 设备方向(Device Orientation) 传感器:
在 Unisoc/SPRD 的 sensor HAL 中,该传感器由 sensorhub HAL 负责处理。数据通常在如下代码中生成:
SensorHubInputSensor::processTypeAEvent()SensorHubInputSensor::processTypeBEvent()- 或
SensorHubInputSensor::readEvents()
我们需要修改以下内容:
找到为设备方向传感器填充 sensors_event_t 的位置,并添加如下代码:
```cpp
if (event.type == SENSOR_TYPE_DEVICE_ORIENTATION) {
int value = static_cast<int>(event.data[0]);
event.data[0] = static_cast<float>((value + 1) % 4);
}
```
或者,如果代码是通过 handle(句柄)来识别该传感器的:
```cpp
if (sensorHandle == DEVICE_ORIENTATION_HANDLE) {
int value = static_cast<int>(event.data[0]);
event.data[0] = static_cast<float>((value + 1) % 4);
}
```
其映射关系如下:
```text
0 -> 1
1 -> 2
2 -> 3
3 -> 0
```
也就是“加 1 再对 4 取模”。
但是我们没有原厂的 HAL 层源码,所以我们可以通过对平板中已编译好的二进制文件进行修改,考虑到难度系数较大,我在 Evarentha 的 Github 上开源了我的设备(CB-C6s-STU)的 GSI 修复包:https://github.com/Evarentha/iflytekcb-iclass-c6s-gsi-fix.
使用方法:
- 下载 Release 中的修复包
- 将
CB-C6s-STU-GSI-Fixes.zip复制到设备(sdcard 或 adb push)。 - 使用 Magisk 刷写模块或者使用 Magisk 管理器安装模块。
- 重启设备。
注意事项:
- 本修复包的兼容性验证范围仅限于 CB-C6s-STU 设备。其他型号设备未经测试,使用前请进行充分的风险评估。
发表回复