今天终于把android的apk正常调用/sys下的bind与unbind。
现象:
插入鼠标后,会在/sys下面生成一个usb设备,其中就会有unbind与unbind。由于项目中需要走自己的usb采集,因此要用到绑定与解绑定。自己写的测试程序,可以正常绑定与解绑定,但是apk调用测试程序后就会出现解绑定失败。
分析过程:
出现这种现象,人的第一反应就会认为是android的apk的权限问题,我也是这么认为的。
因此我尝试了以下几种办法:
1,在java代码中加入chmod 的命令,具体见我的博客。
2,在android的工程中,修改xml的uses-permission android::name所对应的属性。
3,修改init.rc
4,修改sdk下面的build/core/main.mk,把其中的ro.seure修改为0,还有persist修改为1。详细见我的另一篇博客。
但是这几种办法都没有成功。
我之后就/sys所生成的usb设备下查看unbind属性,发现其属性为-w- --- ---,因此我就chmod 777 bind,使其为777属性,发现apk可以正常调用其属性。
唉,这时候其实才解决了问题的一半,因为在终端输入命令不能从根本上解决这个问题,我们不可能让用户在终端输入命令。
之后正常思维就是在jni的C代码中加入system("chmod *****");*****是我要修改的属性。又回到了起点,脱离apk的test代码可以成功,但是通过apk调用的test,无法修改其属性。
人生无常,但要锲而不舍才能自强不息。
system无法正常使用,我就又想到了方法四,但是试试了不行。
这时候我就跳出去想,应该与驱动有关系,而与android没有关系,因为usb驱动生成的bind与unbind属性为-w- --- --- ,这时候为什么不修改驱动文件,使其生成时就是777属性呢?
经过修改尝试,发现成功。修改文件为kernel/drivers/base/bus.c文件中的
static DRIVER_ATTR(unbind, 0777, NULL, driver_unbind);
static DRIVER_ATTR(bind, 0777, NULL, driver_bind);
至此问题彻底解决。