首页
社区
课程
招聘
[原创]为安卓自定义触摸屏按键(4.0++)
发表于: 2014-2-20 16:15 22594

[原创]为安卓自定义触摸屏按键(4.0++)

2014-2-20 16:15
22594
【标题】【原创】为安卓自定义触摸屏按键(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,重启就好了

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 214
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错收藏了!
2014-2-20 23:32
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
貌似复制到/system下面的virtualkeys.{devicename}还需要修改吧
2014-2-27 09:51
0
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
4
不用改了,系统处理的时候会加上设备名
2014-2-27 13:12
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看了你的文章,真心觉得你好厉害,   快要成为大牛了
2015-3-29 22:31
0
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
6
谢谢你的支持和鼓励,漫漫大神之路,还远呢,嘿嘿。
2015-3-30 10:38
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
大神真心牛逼啊。。找了好久。没想到绕了一大圈还是会到看雪了
4.0的没问提哈。。但现在 遇到呀。。求问大神
Android5.0 无论是 libinput.so 还是 libinputService.so 全都找不到这个路径肿么办呀
2015-4-6 22:22
0
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
8
我手头也没有5.0的机器,也不知道改道啥位置了。不过还是有办法找到地方的。首先找到在/sys下按钮定义的文件名,假如还是virtualkeys。然后到/system下执行命令
grep 'virtualkeys' .

看看命令列出那些文件就是了。
2015-4-7 08:54
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=malokch;1363760]我手头也没有5.0的机器,也不知道改道啥位置了。不过还是有办法找到地方的。首先找到在/sys下按钮定义的文件名,假如还是virtualkeys。然后到/system下执行命令
grep 'virtualkeys' .

看看命令列出那些文件就是了。[/QUOTE]

好的,昨晚逆了个晚上,搞定了,,谢谢大哥指点哈..5.0 三大金刚现在完美了,5.1 页一起搞定了
2015-4-7 14:10
0
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
10
不好意思,上面那行命令少了个参数,应该是这样才对,少了个递归参数,不然找不到
grep -r "....." .

还有就是找这个参数也没那么麻烦,去源码找应该很容易,对照虚拟机的源码
2015-4-8 10:23
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
5.0以上怎么弄,可以加你好友吗,我QQ742276879,谢谢大神!!
2015-6-27 12:55
0
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
12
直觉一样的思路吧,手头没有5.0的机器,不太清楚
2015-6-28 14:40
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我手机是htc one ,Android5.0 无论是 libinput.so 还是 libinputService.so 在UltraEdit中按Ctrl+F查找“virtualkeys.”都找不到第一张图,我是准备把1080p改成720p的,改后触控键位点也得改,不然不能用,我对于编程一点不懂,你说首先找到在/sys下按钮定义的文件名,假如还是virtualkeys。然后到/system下执行命令
代码:
grep -r 'virtualkeys' .这里我就不懂了,去源码找应该很容易,对照虚拟机的源码,这句更不懂了!可以加下我qq吗,感激不尽742276879
2015-6-28 17:14
0
游客
登录 | 注册 方可回帖
返回
//