随着 OEM 和车辆所有者申请的用例日益增多,汽车越来越依赖网络连接来管理这些用例,从而导致流量使用和相关费用也相应增加。使用按应用选择网络 (PANS) 功能可以在 OEM 付费的网络中发送指定应用的流量。
借助 PANS,您可以管理流量用量和费用,同时提供安全可靠的互联车载体验。PANS:
- 包含一个添加到
ConnectivityManager
中的新 API,仅供汽车设备使用。 - 提供更新后的 WLAN 建议 API(请参阅适用于互联网连接的 WLAN 建议 API),用于支持动态更改的 PANS 网络功能。
- 收集辅助指标。
- 提供参考应用。
为什么使用 PANS?
PANS 具有以下特点:
- 动态更新应用到网络的映射。
- 无需对应用进行任何更改即可管理应用级路由。
- 只有 OEM 允许的应用才能访问映射的 OEM 网络。
- 应用开发者无需进行任何更改即可实现此功能。
- 面向用户的指标会针对 OEM 管理的网络跟踪应用到网络的流量使用情况。
- 网络访问十分安全,不会被意外用例或未经授权的应用滥用。
- PANS 应用到网络映射的更改会传达给用户。
- 对所有用户应用相同的网络配置。
核心优势
PANS 可为 OEM 提供以下核心优势:
- OEM 可以代用户支付网络流量的费用:
- 用户可以免费获得系统更新。
- 指定应用使用网络无需用户付费。
- 遥测和其他分析的管理不会向用户收费。
- 即使用户未付费购买流量套餐,OEM 也可以确保关键应用保持网络连接。例如,即使用户没有流量套餐,地图、智能助理(免触摸驾驶)和系统更新等对保障安全至关重要的功能也会继续运行。
- PANS 可以专门针对 Android 中的网络流量路由提供更加精细的控制。例如,OEM 可以为应用级流量的发送定义最适宜的逻辑网络拓扑。
图 1. PANS 框架
实现 PANS
为了实现 PANS,新提供了一个 ConnectivityManager
API setOemNetworkPreference
。这一新 API 可将应用映射到一个 OemNetworkPreference
。此 API 仅供汽车设备使用,并带有 @SystemApi
注解,具有新的 signature
权限。
图 2. 实现 PANS
OemNetworkPreference
OemNetworkPreference
是对 OEM_PAID
和 OEM_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,请执行以下操作:
- 使用
OemNetworkPreferences
将应用映射到网络偏好设置。 - 使用
OemNetworkPreferences
对象调用setOemNetworkPreference
。 - 使用
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_PAID
或 OEM_PRIVATE
网络偏好设置时,具有相应功能的网络必须可用。Android 支持为以太网和 Wi-Fi 网络配置这些功能。对于以太网,您可以使用资源叠加层 config_ethernet_interfaces
。这需要在编译时设置。
对于 Wi-Fi 网络,可将 WifiNetworkSuggestion
API 与新的 Android 12 API setOemPaid(Boolean)
和 setOemPrivate(Boolean)
搭配使用。可以在运行时对此进行更改。
请考虑以下示例:
- 名为
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>
- 此
WiFiNetworkSuggestion
可动态更改:ArrayList<WifiNetworkSuggestion> list = new ArrayList<>(); list.add(new WifiNetworkSuggestion.Builder() .setSsid(WifiInfo.sanitizeSsid(ssid)) .setOemPrivate(true) .build()); mWifiManager.addNetworkSuggestions(list);
限制对 PANS 网络的访问
为网络标记 OEM_PAID
或 OEM_PRIVATE
功能会将该网络标记为受限网络。受限网络只能由具有 CONNECTIVITY_USE_RESTRICTED_NETWORKS
权限的应用使用,该权限由 OEM 控制。
具有此权限的应用可以使用受限网络,前提是应用明确请求该网络。不过,这些应用不会以受限网络作为其默认网络。通过 PANS 映射的应用可以将受限 OEM 网络设置为默认网络,并且不需要受限网络权限即可使用这些网络。当此类应用由 PANS 分配了受限 OEM 网络作为其默认网络时,它也能够明确请求该 OEM 网络(如果应用选择这样做)。
查看参考应用
user-debug Automotive build 中提供了一个名为 NetworkPreferenceApp
的参考应用(包括代码),并演示了如何执行以下操作:
- 使用 PANS 指标。
- 设置 PANS 政策。
- 为设备设置默认政策。
- 清除政策。
- 在启动时应用政策。
- 使用防止驾驶员分心 API(请参阅有关防止驾驶员分心的准则)。
- 使用
OEM_PAID
和OEM_PRIVATE
动态更新 Wi-Fi。
图 3. 参考应用
指标
为了提高流量使用的透明度,系统会就通过 OEM_PAID
和 OEM_PRIVATE
网络映射传输的数据量收集并提供相关指标。
问题排查
大多数问题排查情况的起因都是应用使用了错误的网络(无网络连接)或超额使用流量。为了快速地解决问题:
- 连接
dumpsys
包含一个列表,列出了按应用分配的有效默认网络及其关联的应用(通过 PANS 映射)。 - netd
dumpsys
包含 UID IP 和防火墙规则。 - netstats
dumpsys
包含 PANS 按应用的指标。例如,哪些应用使用了哪个 OEM 网络。
创建一个 Android bug 报告即可获得所有 dumpsys
数据。