8

我有一个运行 Android 的小型电视盒设备。每当我打开 Wi-Fi 接口时,以太网接口就会断开连接。如果我随后调出以太网设备,即 Wi-Fi 接口。我尝试了各种方法,包括使用命令行手动调出界面,但出现了同样的问题。我希望能够连接到 Wi-Fi 并将其作为我的默认网关,然后也连接到以太网端口以通过该接口路由某些流量。显然这在 Linux 中是可能的,所以必须有一种方法......有没有人知道当另一个接口启动时是什么在拆除接口......

4

3 回答 3

8

这是 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/ 目录中。

然后重新启动 - 第一次启动将花费比正常时间更长的时间。

于 2013-11-20T20:15:32.627 回答
4

有一种更简单的方法,它不需要您构建与您的设备匹配的 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() 中编辑 out/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
于 2014-10-25T09:19:48.493 回答
1

所以我也发现了如何在 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

于 2015-11-26T11:59:48.193 回答