【标题】【原创】为安卓自定义触摸屏按键(4.0++)
【作者】Malokch
【时间】16:16 2014/2/20
【链接】http://www.kanxue.com/bbs/showthread.php?t=184782
最近想买新手机,由于嫌弃小米,且囊肿羞涩,但最近黄章复出,魅族大降价,于是想买魅族
虽然魅族配置不错,但是我嫌弃其取消了菜单键和返回键,设计了个什么smartbar.如果能自
己鼓捣出把去掉的按键弄回来的方法,不妨买来玩玩,方法是找到了,但是又没钱买了,一阵桑心..
注意:这个修改方案有一定风险(libinput.so是安卓系统重要的库)!没信心的小白就不要冒险了.
修改之前记得备份系统!
Android4.0之后的虚拟按键定义是根据/sys/board_properties/virtualkeys.{devicename}中的内容来定义.
例如:--------------------------------------------------------
root@android:/sys/board_properties # cat virtualkeys.synaptics_rmi4_i2c
cat virtualkeys.synaptics_rmi4_i2c
0x01:139:60:900:100:50:0x01:172:240:900:100:50:0x01:158:420:900:100:50
--------------------------------------------------------------------
0x01:139:60:900:100:50:0x01:172:240:900:100:50:0x01:158:420:900:100:50
内容意思是:0x01:keycode:x:y:width:height,对应触摸屏的区域
这个内核文件是在/system/lib/libinput.so.中读取和处理.
.text:0001D864 ; =============== S U B R O U T I N E =======================================
.text:0001D864
.text:0001D864
.text:0001D864 ; android::EventHub::loadVirtualKeyMapLocked(android::EventHub::Device *)
.text:0001D864 EXPORT _ZN7android8EventHub23loadVirtualKeyMapLockedEPNS0_6DeviceE
.text:0001D864 _ZN7android8EventHub23loadVirtualKeyMapLockedEPNS0_6DeviceE
.text:0001D864 ; CODE XREF: android::EventHub::openDeviceLocked(char const*)+398 p
.text:0001D864
.text:0001D864 name = -0xC
.text:0001D864
.text:0001D864 13 B5 PUSH {R0,R1,R4,LR}
.text:0001D866 01 A8 ADD R0, SP, #0x10+name
.text:0001D868 0C 46 MOV R4, R1
.text:0001D86A FE F7 5C E8 BLX _ZN7android7String8C1Ev ; android::String8::String8(void)
.text:0001D86E 0E 49 LDR R1, =(aSysBoard_prope - 0x1D876)
.text:0001D870 01 A8 ADD R0, SP, #0x10+name
.text:0001D872 79 44
ADD R1, PC ; "/sys/board_properties/virtualkeys."
.text:0001D874 FE F7 9E E8 BLX _ZN7android7String86appendEPKc ; android::String8::append(char const*)
.text:0001D878 04 F1 10 01 ADD.W R1, R4, #0x10
.text:0001D87C 01 A8 ADD R0, SP, #0x10+name
.text:0001D87E FE F7 A0 E8 BLX _ZN7android7String86appendERKS0_ ; android::String8::append(android::String8 const&)
.text:0001D882 01 98 LDR R0, [SP,#0x10+name] ; name
.text:0001D884 04 21 MOVS R1, #4 ; type
.text:0001D886 FE F7 74 E9 BLX access
.text:0001D88A 30 B9 CBNZ R0, loc_1D89A
.text:0001D88C 04 F1 B8 01 ADD.W R1, R4, #0xB8
.text:0001D890 01 A8 ADD R0, SP, #0x10+name
.text:0001D892 FE F7 74 E9 BLX _ZN7android13VirtualKeyMap4loadERKNS_7String8EPPS0_ ; android::VirtualKeyMap::load(android::String8 const&,android::VirtualKeyMap**)
.text:0001D896 04 46 MOV R4, R0
.text:0001D898 01 E0 B loc_1D89E
.text:0001D89A ; ---------------------------------------------------------------------------
libinput.so中先载入"/sys/board_properties/virtualkeys.",然后再在后面加入设备名,拼凑成这样子: “/sys/board_properties/virtualkeys.synaptics_rmi4_i2c”
我们的思路是通过修改"/sys/board_properties/virtualkeys."的内容让程序读取我们自定义的按键区域,比如改成”/system/virtualkeys.”
这样系统就会去找”/system/virtualkeys.synaptics_rmi4_i2c”.
动手修改:
0.我们先把/sys/board_properties/virtualkeys.{devicename}复制到”/system/”下面
1.然后用你喜欢的方法提取你手机上的/system/lib/libinput.so到电脑上
2.用UltraEdit打开libinput.so
3.在UltraEdit中按Ctrl+F查找“virtualkeys.”(没有双引号,记得把 查找ASCII 打钩)
4.这时没错的话找到一处/sys/board_properties/virtualkeys.
5.我们改为/system/virtualkeys.
6.保存后把libinput.so放回到/system/lib/libinput.so,重启就好了
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!