我需要找到一种方法(使用 Android 应用程序)以编程方式连接和断开 Android 设备与主机的连接。
我正在使用 Galaxy Nexus。我的目标是让一切尽可能接近库存,尽管我已经在内核中启用了详细的调试消息,并且为了查看它们已经在手机上启用了 root 访问权限以访问 /proc/kmsg
(以及 shell 命令 dmesg
)。
我确信有一种方法可以利用 root 访问权限来做我需要做的事情,但我所有的尝试都导致了 nix。
- 弄乱
/proc/bus/usb
- 与
/dev/bus/usb
混淆
- 在 MTP/PTP 之间切换(无法以编程方式进行)
- 将 Android USB 小工具驱动程序制作成一个模块 <- ???
我将尝试弄清楚如何处理列表中的最后一个对象,因为这样我就可以 rmmod
和 insmod
生成结果 *.ko
在我的应用程序中,这将连接和断开电话。不过,我不确定此选项的可行性。
最佳答案
解决方案是在接近截止日期时出现的,所以我几乎可以肯定这不是最好的做事方式,但它满足了我的要求。
构建 Modded 内核(以允许 Hook 特定功能)
- 修改内核配置以支持 Kprobes(将 CONFIG_KPROBES 设置为 Y)
- 从 android_setup() 定义 (driver/usb/gadget/android.c) 中移除“static”关键字
- 构建内核
构建内核模块(提供连接和断开连接的实际功能)
- 使用Kallsyms动态拉取android_setup()的绝对地址
- 使用 kprobes,钩子(Hook) android_setup()
- 设置两个定时器,每次调用 android_setup() 时执行
- 第一个计时器设置为从现在开始 2 秒,第二个设置为从现在开始 2.005 秒
- 两个计时器都将一个指向 struct usb_gadget 的指针作为它们的数据
- 在各自的回调函数中,调用 usb_gadget_connect() 和 usb_gadget_disconnect(),这会在 Samsung Galaxy Nexus 上强制物理断开然后重新连接
构建应用程序
- 必须 Root设备
- 只需使用 SU 权限 -“insmod module_name”进行 shell 调用。在您调用 rmmod 之前,该模块会强制设备进入一个枚举周期,不断地断开连接并重新连接。
如果您有兴趣重复这些结果,请阅读此处发布的文档并随时向我发送任何问题。
https://docs.google.com/uc?export=download&id=0B9WchRkSOWwJbi10MGhLWUljT2s
关于android - 以编程方式连接和断开 Android 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12979650/