同时使用 Android 以太网和 Wi-Fi
Posted
技术标签:
【中文标题】同时使用 Android 以太网和 Wi-Fi【英文标题】:Android Ethernet and Wi-Fi at the same time 【发布时间】:2013-08-11 04:47:11 【问题描述】:我有一个运行 android 的小型电视盒设备。每当我打开 Wi-Fi 接口时,以太网接口就会断开连接。如果我随后调出以太网设备,即 Wi-Fi 接口。 我尝试了各种方法,包括使用命令行手动调出界面,但出现了同样的问题。 我希望能够连接到 Wi-Fi 并将其作为我的默认网关,然后也连接到以太网端口以通过该接口路由某些流量。 显然,这在 Linux 中是可能的,所以必须有一种方法......有人知道在启动另一个接口时是什么在拆除接口......
【问题讨论】:
【参考方案1】:这是 Android 中的限制。它故意一次只允许一个连接启动,并且在“ConnectivityServices.java”文件中有一个处理程序,当启用具有优先级的网络时,该处理程序会拆除“非首选”网络。这也是在公认热点范围内启动 wifi 并断开蜂窝数据连接的原因......
以防万一有人需要这个,这就是我所做的:
在设备上下载适用于 Android 版本的 AOSP 源代码。
相应地编辑“ConnectivityServices.java”文件。我基本上只是在连接更改处理程序中注释掉了故障转移命令中的命令。我面前没有源代码,如果您需要知道我在这里做了什么,请给我留言...
无论如何,然后在您的机器上构建 AOSP 源代码。
完成后,获取已创建的 /dexclasses/ 目录中的“services.jar”文件。 使用 WinRAR 将其解压缩,然后将 .jar 文件中的“classes.dex”文件复制到单独的目录中。 使用它来提取 classes.dex:https://code.google.com/p/smali/ 获取“ConnectivityServices.smali”文件并妥善保管。
来自设备 转到您希望启用两个网络接口的设备,然后将 /system/framework/services.jar 文件复制到 PC。使用 WinRAR 将其解压缩,然后将 .jar 文件中的“classes.dex”文件复制到单独的目录中。 使用 Java Smali 命令提取 classes.dex。
从 AOSP 中获取 ConnectivityServices.smali 文件,并将其直接放入您刚刚使用设备上的 classes.dex 提取的文件中。在覆盖之前备份原始 ConnectivityServices.smali 文件可能是个好主意。
然后使用 baksmali 命令简单地重新打包 classes.dex 文件。 使用 winRAR 将 classes.dex 文件复制到原始 services.jar 文件中。同样,备份原始文件,然后在 .jar 文件中覆盖它。
然后只需将新的 services.jar 文件放回设备上的 /system/framework/ 目录中。
然后重新启动 - 第一次启动需要比正常时间更长的时间。
【讨论】:
感谢您的评论!我绑定了以下内容(适用于 Android 4.4.2),但没有成功:我像这样编辑了我的“frameworks/base/services/java/com/android/server/ConnectivityService.java”文件:我在函数“private”中注释掉了void handleConnect' 都调用'teardown(thisNet);'。然后我编译了 android,BAKSMALIed 编译后的原始 services.jar,将所有原始的 'ConnectivityService*.smali' 替换为已编译的。再次 SMALIed 并替换 android 设备上的 services.jar。然后我重新启动,当我连接以太网时仍然禁用 WIFI。任何帮助表示赞赏!【参考方案2】:有一种更简单的方法,它不需要您构建与您的设备匹配的 AOSP。您可以简单地修改 smali 反编译的代码并重新编译它。使用https://github.com/android/platform_frameworks_base/blob/master/services/java/com/android/server/ConnectivityService.java 进行比较。 类似这样的东西:
adb pull /system/framework/services.jar
cp services.jar services.jar.bak
unzip services.jar classes.dex
java -jar baksmali.jar classes.dex
在handleConnect()中编辑出/com/android/server/ConnectivityService.smali,结果如下:
// if this is a default net and other default is running
// kill the one not preferred
if (false && mNetConfigs[newNetType].isDefault())
if (mActiveDefaultNetwork != -1 && mActiveDefaultNetwork != newNetType) ...
我做了以下更改:
aget-object v5, v5, v1
invoke-virtual v5, Landroid/net/NetworkConfig;->isDefault()Z
move-result v5
#if-eqz v5, :cond_a6 # changed to unconditional jump
goto :cond_a6
重新编译、重新打包、推送。然后重启并测试。
java -jar smali.jar -o classes.dex out
zip services.jar classes.dex
adb push services.jar /system/framework/services.jar
【讨论】:
非常感谢!完全为我工作。只需查找以下行:invoke-virtual v5, Landroid/net/NetworkConfig;->isDefault()Z 并进行更改 知道如何为 Android 5.1 执行此操作吗? 可能在这里吗? github.com/CyanogenMod/android_frameworks_base/blob/… 对于 Android 6,services.jar 似乎是空的 :( 有什么想法可以在 Android 6 中找到修复程序吗? 没关系,它只是一个未解码的 ROM。安装 CM13 为我修复了它。【参考方案3】:所以我也发现了如何在 CM12.1 上做到这一点
只需在此处更改此行 https://github.com/CyanogenMod/android_frameworks_base/blob/e49d5ea0858a765c22d8aa96cc660d4708a413fb/services/core/java/com/android/server/ConnectivityService.java#L4264
或在 smali 中替换 .line 4266 之前的行 使用 goto :cond_1b1
【讨论】:
以上是关于同时使用 Android 以太网和 Wi-Fi的主要内容,如果未能解决你的问题,请参考以下文章
MTK_android11_以太网(内网)和WIFI(外网)共存
Android Things:Raspberry Pi 上的 ADB over USB