按应用选择网络 (PANS)

车辆越来越依赖连接来管理原始设备制造商和车主要求的越来越多的用例,从而导致数据足迹和相关成本增加。使用按应用程序网络选择 (PANS)功能在 OEM 付费的网络上路由指定应用程序的流量。

借助 PANS,您可以管理数据使用量和成本,同时提供强大、安全和互联的汽车体验。平移系统:

  • 包含添加到ConnectivityManager的新 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

OEM网络偏好

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 错误报告来获取。