按应用选择网络 (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 数据。