android - 通过 USB 反向绑定(bind)多个 Android 设备

标签 android linux usb adb tethering

我正在尝试为我的 Android 应用程序设置一个测试环境,其中单独的设备需要互联网连接,但没有无线功能。

所以我决定使用 USB 反向网络共享。我的主机正在运行 Ubuntu。我已经设法为一台设备设置反向网络共享,连接正常,我可以从该设备的 adb shell ping google.com。

当我连接第二个设备时,第一个网络共享停止工作。 两个设备在其内部 USB0 接口(interface)上配置了相同的 IP 地址。

这是我目前所拥有的:

  1. 主机上的端口转发已激活

    echo 1 > /proc/sys/net/ipv4/ip_forward
    
  2. 主机上的 Iptables 规则以路由流量:

    iptables -t nat -A POSTROUTING -s 169.254.255.2/24 -j MASQUERADE
    
  3. 插件第一个设备:

    ifconfig shows the device on usb0 @ ip 169.254.255.2/30
    
  4. 在第一台设备上(使用 adb shell)

    > route add default gw 169.254.255.2 dev usb0
    > setprop net.dns1 8.8.8.8
    > ping google.com --> is giving results
    
  5. 插入第二个设备

    ifconfig shows this device on usb1 @ ip 169.254.255.2/30 
    
  6. 在第二台设备上

    Add gw, set DNS like above
    

现在第二台设备可以 ping google.com,但第一台不能。

当我更改内部 IP 或分配给主机 usb0、usb1 接口(interface)的 IP 时,我无法再通过 adb 连接到设备。

我怀疑这是网络问题,而不是 ADB 的问题?有任何想法吗?

最佳答案

经过大量谷歌搜索和反复试验后,我终于找到了适合我的特定设置的解决方案。

我最后所做的,也是我在第一次尝试中遗漏的,是将每个连接的 USB 设备放入一个单独的子网中(参见 this answer on serverfault)。

明确地说,现在的设置如下:

  1. iptables 包含以下规则

    iptables -t nat -A POSTROUTING -j MASQUERADE
    
  2. 主机的 usb0 和 usb1 接口(interface),现在在不同的子网中

    usb0: inet addr:169.254.0.1  Bcast:169.254.15.255  Mask:255.255.240.0
    usb1: inet addr:169.254.16.1  Bcast:169.254.31.255  Mask:255.255.240.0
    
  3. 在主机的 usb0 上连接的 Android 设备的内部 usb0 iface:

    - usb0 169.254.0.2/20
    - default gw 169.254.0.1 (so the host's usb0 iface)
    
  4. Android 设备的内部 usb0 iface 连接到主机的 usb1:

    - usb0 169.254.16.2/20
    - default gw 169.254.16.1 (so the host's usb1 iface)
    

通过这种方式,我现在可以从连接到我主机上 USB 接口(interface)的每个 Android 设备访问互联网(在 adb shell setprop net.dns1 8.8.8.8 之后)。

关于android - 通过 USB 反向绑定(bind)多个 Android 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28857402/

相关文章:

java - 替代 java.nio.file

java - Firebase .orderByChild - 尝试对数字进行排序,但它只对第一个数字进行排序

android - 未能解决 Firebase 崩溃库 android 'com.google.firebase:firebase-core:11.0.2'

c# - 无法从 DeviceInformation.Id 创建 UsbDevice

android - 为应用程序实现不同的 Material 主题。基于 Material Design 的猫头鹰应用

c - 为什么我们需要一个未使用的字符数组才能成功绑定(bind)?

无法在 CentOS 6 上获得对 stat 的大文件支持

c++ - 两个程序的运行时间分别运行然后一起运行

android - 声明 Android 终端和嵌入式 Linux 卡之间的 USB 接口(interface)

android-studio - 无法通过 Android Studio、Windows 7 连接到三星 Galaxy Tab S