按应用选择网络 (PANS)

车辆越来越依赖连接来管理 OEM 和车主请求的不断增长的用例列表,从而导致数据占用空间和相关成本增加。使用按应用选择网络 (PANS) 功能,在 OEM 付费的网络上路由指定应用的网络流量。

借助 PANS,您可以管理数据用量和成本,同时提供稳健、安全且互联的汽车体验。PANS

  • 由添加到 ConnectivityManager 的新 API 组成,该 API 仅适用于车载设备。
  • 提供更新后的 Wi-Fi 建议 API(请参阅用于互联网连接的 Wi-Fi 建议 API),以包含对动态更改 PANS 网络功能的支持。
  • 收集支持指标。
  • 提供参考应用。

为何使用 PANS?

PANS 可以

  • 动态更新应用到网络的映射。
  • 管理应用级路由,而无需更改应用。
  • 只有 OEM 允许的应用才能访问映射的 OEM 网络。
  • 应用开发者无需进行任何更改即可实现此功能。
  • 面向用户的指标跟踪 OEM 管理网络的“应用到网络”数据用量。
  • 网络访问是安全的,不会通过意外用例或未经授权的应用而被滥用。
  • 对 PANS 应用到网络映射的更改会传达给用户。
  • 相同的网络配置应用于所有用户。

核心优势

PANS 为 OEM 提供以下核心优势

  1. OEM 可以为网络流量付费,而不是用户付费
    • 系统更新可以免费提供给用户。
    • 指定应用的网络使用量可以免费提供给用户。
    • 遥测和其他分析可以免费提供给用户。
  2. OEM 可以确保关键应用即使在没有用户付费数据套餐的情况下仍保持连接。例如,即使在用户没有数据套餐的情况下,安全关键功能(如地图、助手(免手动驾驶)和系统更新)仍可继续运行。
  3. PANS 提供特定于 Android 中网络流量路由的额外粒度控制。例如,OEM 可以为应用级流量路由最佳地定义逻辑网络拓扑。

图 1. PANS 框架

实现 PANS

为了实现 PANS,提供了一个新的 ConnectivityManager API setOemNetworkPreference。这个新 API 将应用映射到 OemNetworkPreference。此 API 仅适用于车载设备,并且使用新的 signature 权限注释为 @SystemApi

图 2. 实现 PANS

OemNetworkPreference

OemNetworkPreferenceOEM_PAIDOEM_PRIVATE NetworkCapabilities 的抽象,通过软件包名称将应用映射到网络偏好设置。网络偏好设置允许网络分层。例如,将应用映射到 OEM_NETWORK_PREFERENCE_OEM_PAID 偏好设置会导致分配给应用的默认网络具有以下优先级:首先使用 UNMETERED 网络,如果 UNMETERED 不可用,则使用 OEM_PAID 网络,如果 OEM_PAID 不可用,则使用系统默认网络。

  • OEM_PAID 主要用于可以在 OEM 网络和非 OEM 网络上路由的应用。
  • OEM_PRIVATE 主要用于 OEM 应用以访问专用于它们的网络。
/**
* If an unmetered network is available, use it.
* Otherwise, if a network with the OEM_PAID capability is available, use it.
* Otherwise, use the general default network.
*/
public static final int OEM_NETWORK_PREFERENCE_OEM_PAID = 1;

/**
* If an unmetered network is available, use it.
* Otherwise, if a network with the OEM_PAID capability is available, use it.
* Otherwise, the app doesn't get a default network.
*/
public static final int OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK = 2;

/**
* Use only NET_CAPABILITY_OEM_PAID networks.
*/
public static final int OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY = 3;

/**
* Use only NET_CAPABILITY_OEM_PRIVATE networks.
*/
public static final int OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY = 4;

调用 PANS API

要使用 PANS API,请执行以下操作

  1. 使用 OemNetworkPreferences 将应用映射到网络偏好设置。
  2. 使用 OemNetworkPreferences 对象调用 setOemNetworkPreference
  3. 使用 Runnable 接口监听 API 完成情况。

例如

// Mapping three packages to two network preferences
// Packages have a 1:1 mapping to network preferences
OemNetworkPreferences pref = new OemNetworkPreferences.Builder()
   .addNetworkPreference("first.package.name", OEM_NETWORK_PREFERENCE_OEM_PAID)
   .addNetworkPreference("second.package.name", OEM_NETWORK_PREFERENCE_OEM_PAID)
   .addNetworkPreference("third.package.name", OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY)
   .build();

myConnectivityManager.setOemNetworkPreference(pref, myExecutor, myListener);

注意事项

在实现 PANS 时,请注意以下几点

  • 网络偏好设置不会跨重启持久保留,需要在每次启动时重新应用。
  • 要为应用创建偏好设置,无需安装该应用。因此,可以主动设置未安装应用的网络偏好设置。
  • 在任何给定时间,一个应用只能映射到一个网络偏好设置。
  • 网络偏好设置用于设置应用的默认网络。这是在应用未通过其中一个专用 API 指定要使用的网络时使用的网络。这不仅涵盖了绝大多数连接需求,而且还允许继续使用专用 API(例如 NetworkRequest API),从而不会破坏现有的应用用例。例如,当应用只想通过非按流量计费的网络执行操作时,PANS 不会强制其使用另一个网络。

配置网络

当使用相应的网络偏好设置时,必须提供具有 OEM_PAIDOEM_PRIVATE 功能的网络。Android 提供对以太网和 Wi-Fi 网络的配置功能的支持。对于以太网,您可以使用资源叠加 config_ethernet_interfaces。这是在编译时设置的。

对于 Wi-Fi,WifiNetworkSuggestion API 可以与新的 Android 12 API setOemPaid(Boolean)setOemPrivate(Boolean) 一起使用。这可以在运行时更改。

考虑以下示例

  1. 名为 config_ethernet_interfaces 的资源叠加指定
    • 要配置的接口的名称。
    • 所需的 NetworkCapabilities 值。
      <!-- 11 NET_CAPABILITY_NOT_METERED
           12 NET_CAPABILITY_INTERNET
           14 NET_CAPABILITY_TRUSTED
           15 NET_CAPABILITY_NOT_VPN
           22 NET_CAPABILITY_OEM_PAID || 26 NET_CAPABILITY_OEM_PRIVATE -->
      <string-array translatable="false" name="config_ethernet_interfaces">
         <item>eth0;11,12,14,15,22;;</item></string-array>
  2. WiFiNetworkSuggestion 可以动态更改
    ArrayList<WifiNetworkSuggestion> list = new ArrayList<>();
    list.add(new WifiNetworkSuggestion.Builder()
                   .setSsid(WifiInfo.sanitizeSsid(ssid))
                   .setOemPrivate(true)
                   .build());
    mWifiManager.addNetworkSuggestions(list);

限制对 PANS 网络的访问

将网络标记为 OEM_PAIDOEM_PRIVATE 功能会将该网络标记为受限网络。受限网络只能由具有 CONNECTIVITY_USE_RESTRICTED_NETWORKS 权限的应用使用,该权限由 OEM 控制。

具有此权限的应用可以使用受限网络,前提是应用明确请求使用这些网络。但是,这些应用不会将受限网络作为其默认网络。通过 PANS 映射的应用可以将受限 OEM 网络设置为其默认网络,并且无需受限网络权限即可使用它们。当此类应用通过 PANS 将受限 OEM 网络分配为其默认网络时,如果应用选择这样做,它也能够显式请求所述 OEM 网络。

查看参考应用

用户调试车载版本中提供了一个名为 NetworkPreferenceApp 的参考应用(包括代码),演示了如何

  • 使用 PANS 指标。
  • 设置 PANS 政策。
  • 为设备设置默认政策。
  • 清除政策。
  • 在启动时应用政策。
  • 使用驾驶员分心 API(请参阅驾驶员分心指南)。
  • 使用 OEM_PAIDOEM_PRIVATE 动态更新 Wi-Fi。

图 3. 参考应用

指标

为了方便数据用量方面的透明度,收集并提供关于通过 OEM_PAIDOEM_PRIVATE 网络映射传输的数据量的指标。

问题排查

大多数问题排查情况都源于应用使用错误的网络(没有网络连接)或数据超额。为了实现快速解决

  • 连接 dumpsys 包括活动应用默认网络及其关联应用(从 PANS 映射)的列表。
  • Netd dumpsys 包括 UID IP 和防火墙规则。
  • Netstats dumpsys 包括 PANS 按应用指标。例如,哪些应用使用了哪些 OEM 网络。

所有 dumpsys 数据都可通过创建 Android 错误报告获得。