按应用选择网络 (PANS)

随着 OEM 和车辆所有者申请的用例日益增多,汽车越来越依赖网络连接来管理这些用例,从而导致流量使用和相关费用也相应增加。使用按应用选择网络 (PANS) 功能可以在 OEM 付费的网络中路由指定应用的流量。

借助 PANS,您可以管理流量用量和费用,同时提供安全可靠的互联车载体验。PANS:

  • 包含一个添加到 ConnectivityManager 中的新 API,仅供汽车设备使用。
  • 提供更新后的 WLAN 建议 API(请参阅适用于互联网连接的 WLAN 建议 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 仅供汽车设备使用,并带有 @SystemApi 注解,具有新的 signature 权限。

图 2. 实现 PANS

OemNetworkPreference

OemNetworkPreference 是对 OEM_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 网络(如果应用选择这样做)。

查看参考应用

user-debug Automotive build 中提供了一个名为 NetworkPreferenceApp 的参考应用(包括代码),并演示了如何执行以下操作:

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

图 3. 参考应用

指标

为了提高流量使用的透明度,系统会就通过 OEM_PAIDOEM_PRIVATE 网络映射传输的数据量收集并提供相关指标。

问题排查

大多数问题排查情况的起因都是应用使用了错误的网络(无网络连接)或超额使用流量。为了快速地解决问题:

  • 连接 dumpsys 包含一个列表,列出了按应用分配的有效默认网络及其关联的应用(通过 PANS 映射)。
  • netd dumpsys 包含 UID IP 和防火墙规则。
  • netstats dumpsys 包含 PANS 每应用指标。 例如,哪些应用使用了哪个 OEM 网络。

创建一个 Android bug 报告即可获得所有 dumpsys 数据。