如何在 android 9 上赋予 WiFi 比以太网更高的优先级?

Posted

技术标签:

【中文标题】如何在 android 9 上赋予 WiFi 比以太网更高的优先级?【英文标题】:How to give WiFi higher priority than Ethernet on android 9? 【发布时间】:2022-01-12 13:19:04 【问题描述】:

我正在开发 android 9,我想优先使用 WiFi over Ethernet。 我尝试在我的config.xml 文件中赋予 wifi 比以太网更高的优先级,如下所示,但我的以太网仍然具有更高的优先级。

<string-array translatable="false" name="networkAttributes">
        <item>"wifi,1,1,2,6000,true"</item>
        <item>"ethernet,9,9,0,6000,true"</item>
</string-array>

我在网上搜索,发现默认网络偏好可以在ConnectivityManager.java 中给出。但它在 API28 中显示已弃用。

@Deprecated
    public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI;

另外,getNetworkInfostartUsingNetworkFeature 也已弃用。

@Deprecated
    @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
    public NetworkInfo getNetworkInfo(int networkType) 
@Deprecated
    public int startUsingNetworkFeature(int networkType, String feature) 

如何在 android 9 上赋予 WIFI 比以太网更高的优先级?

【问题讨论】:

两个问题;你能更新Android源代码并有一个自定义图像吗?例如,更新 AOSP 作为潜在修复的一部分,还是只能依赖 SDK?第二个问题,以太网对于您的用例是否总是具有相同的名称?例如,以太网是否总是命名为eth0 @AlwaysLearning:是的。我可以更新 android 源代码,是的,以太网总是被命名为 eth0。 【参考方案1】:

关于如何处理这个问题,您有两种选择。

选项 1:更新 AOSP 源代码

在 Android 9 中,ConnectivityService 将使用静态网络分数来确定使用各种网络传输类型(以太网、Wi-Fi 还是蜂窝网络等)的优先级。

以太网的网络得分为 70 (link),而 Wi-Fi 的网络得分为 60 (link)。

在您的情况下,如果我希望 Wi-Fi 优先于以太网,您可以更改分数以反映新的优先级(例如,在上面的 Wi-Fi 链接中将 Wi-Fi 更改为 71 或类似地,将以太网的分数降低到比如说59在它的工厂里)。

Wi-Fi 示例:

private static final int SCORE_FILTER = 71;

选项 2:使用资源叠加层

有一个资源覆盖可用于手动配置以太网网络上的网络功能,名为config_ethernet_interfaces (link)。

<!-- Configuration of Ethernet interfaces in the following format:
         <interface name|mac address>;[Network Capabilities];[IP config];[Override Transport]
         Where
               [Network Capabilities] Optional. A comma seprated list of network capabilities.
                   Values must be from NetworkCapabilities#NET_CAPABILITY_* constants.
                   The NOT_ROAMING, NOT_CONGESTED and NOT_SUSPENDED capabilities are always
                   added automatically because this configuration provides no way to update
                   them dynamically.
               [IP config] Optional. If empty or not specified - DHCP will be used, otherwise
                   use the following format to specify static IP configuration:
                       ip=<ip-address/mask> gateway=<ip-address> dns=<comma-sep-ip-addresses>
                       domains=<comma-sep-domains>
               [Override Transport] Optional. An override network transport type to allow
                    the propagation of an interface type on the other end of a local Ethernet
                    interface. Value must be from NetworkCapabilities#TRANSPORT_* constants. If
                    left out, this will default to TRANSPORT_ETHERNET.
         -->
    <string-array translatable="false" name="config_ethernet_interfaces">
        <!--
        <item>eth1;12,13,14,15;ip=192.168.0.10/24 gateway=192.168.0.1 dns=4.4.4.4,8.8.8.8</item>
        <item>eth2;;ip=192.168.0.11/24</item>
        <item>eth3;12,13,14,15;ip=192.168.0.12/24;1</item>
        -->
    </string-array>

这是基于以太网接口名称的索引,因此您需要在所有情况下使用相同的以太网名称,例如eth0 对于大多数人来说。您可以更新上述配置以使用这些功能。在您的情况下,您可以省略 NOT_RESTRICTED 功能 (link),在这种情况下,以太网永远不会被用作默认网络,只会让 Wi-Fi 的优先级更高。

  <!-- Restricting eth0 -->
  <string-array translatable="false" name="config_ethernet_interfaces">
    <item>eth0;11,12,14;;</item>
  </string-array>

事实上,Android Cuttlefish 目标 (link) 今天出于类似的原因这样做。请注意,上述配置会将eth0 标记为受限,因此它可能无法获得IP 或根本无法使用(除非可能是网络访问受限的应用程序)。如果您想要不同的行为,您可以随时使用这些功能。

【讨论】:

非常感谢!有效!我使用了选项 1。我找不到 wifinetworkfactory.java 来增加 wifi 的优先级。所以,我只是在 EthernetNetworkFactory.java 中将以太网的优先级降低到 30。此外,由于某种原因,使用选项 2,我的以太网将无法获得 IP。所以,我正在使用选项 1。无论如何,它有效。谢谢。 是的,当然。很高兴它起作用了,我根据您的评论添加了一些上下文来稍微更新了这个问题。编码愉快!

以上是关于如何在 android 9 上赋予 WiFi 比以太网更高的优先级?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 9.0(PIE) 中获取 WIFI SSID?

如何模拟像素比以在 Windows 上使用 Google Chrome 或 Firefox 测试媒体查询?

如何在伺服电机上使用 pwm 将度数转换为占空比以实现平稳移动?

如何在Android上获取wifi硬件信息

如何在 android 上创建非持久 WiFi 直连组?

在Android上检测wifi IP地址?