自動車では、OEM と車両所有者の両方から要求されるユースケースの増加に伴い、接続性への依存度が高まっており、その結果、データの使用量とそれに関連するコストが増加しています。OEM がコストを支払っているネットワークに特定のアプリケーションのトラフィックをルーティングするには、PANS(Per-Application Network Selection)機能を使用します。
PANS を使用すると、データの使用量と費用を管理し、同時に堅牢かつ安全なコネクテッド カー エクスペリエンスを実現できます。PANS には次のような特徴があります。
ConnectivityManager
に追加された、自動車デバイスでのみ使用可能な新しい API で構成されています。- PANS ネットワーク機能の動的な変更をサポートするための最新の Wi-Fi suggestion API(インターネット接続のための Wi-Fi suggestion API を参照)を提供します。
- 補助的な指標を収集します。
- リファレンス アプリケーションを提供します。
PANS を使用する理由
PANS では以下のことができます。
- アプリとネットワークの間のマッピングを動的に更新する
- アプリに変更を加えることなく、アプリケーション レベルのルーティングを管理する
- OEM が許可するアプリケーションのみが、マッピングされた OEM ネットワークにアクセスできるようにする
- アプリ デベロッパーは、この機能を実装するために変更を加える必要はありません。
- ユーザー向けの指標により、OEM が管理するネットワークにおけるアプリとネットワークの間のデータ使用量を追跡する
- 安全なネットワーク アクセスを実現し、意図しないユースケースや不正なアプリケーションによって悪用されないようにする
- PANS のアプリとネットワークの間のマッピングが変更された場合、それをユーザーに通知する
- すべてのユーザーに同じネットワーク設定を適用する
主な利点
PANS には、OEM にとって次のような重要な利点があります。
- OEM は、ユーザーの代わりにネットワーク トラフィックの料金を支払うことができます。
- システム アップデートを無料でユーザーに提供できます。
- ユーザーが指定したアプリでネットワークを無料で使用できるようになります。
- ユーザーが、テレメトリーやその他の分析を無料で管理できます。
- OEM は、ユーザーが有料のデータプランに加入していなくても、重要アプリが接続された状態を維持できます。たとえば、地図、アシスタント(ハンズフリー運転)、システム アップデートなどの安全上重要な機能は、ユーザーがデータプランに加入していなくても引き続き機能します。
- PANS では、Android でのネットワーク トラフィック ルーティングに固有の制御をさらに細かく行うことができます。たとえば、OEM はアプリケーション レベルのトラフィックのルーティングに対して論理ネットワーク トポロジを適切に定義できます。
図 1. PANS フレームワーク
PANS を実装する
PANS を実装するために、新しい ConnectivityManager
API(setOemNetworkPreference
)が提供されています。この新しい API は、アプリを OemNetworkPreference
にマッピングします。
この API は自動車デバイスでのみ使用可能で、新しい signature
権限を持つ @SystemApi
としてアノテーションが付けられます。
図 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 アプリが 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 を実装する場合は、次の点に注意してください。
- ネットワーク設定は再起動後には維持されないため、起動ごとに再適用する必要があります。
- アプリの設定を作成する際、そのアプリがインストールされている必要はありません。したがって、インストールされていないアプリでもネットワーク設定を事前に設定できます。
- どの時点であっても、1 つのネットワーク設定にマッピングできるのは 1 つのアプリのみです。
- ネットワーク設定は、アプリのデフォルト ネットワークの設定に使用されます。これは、アプリが専用 API のひとつを介して使用するネットワークを指定していない場合に使用されるネットワークです。接続ニーズの大部分をカバーするだけでなく、既存のアプリのユースケースに悪影響が及ばないように、
NetworkRequest
API などの専用 API の使用を継続することもできます。たとえば、アプリが定額制ネットワークのみを経由してオペレーションを行う場合、PANS は別のネットワークの使用を強制しません。
ネットワークを設定する
OEM_PAID
または OEM_PRIVATE
機能のいずれかを使用するネットワーク設定を使用する場合、それぞれに対応する機能を備えたネットワークを使用できなければなりません。Android は、イーサネット ネットワークと Wi-Fi ネットワークの機能の設定をサポートしています。イーサネット ネットワークの場合は、リソース オーバーレイ config_ethernet_interfaces
を使用できます。これはコンパイル時に設定されます。
Wi-Fi の場合は、Android 12 の新しい API(setOemPaid(Boolean)
と setOemPrivate(Boolean)
)とあわせて WifiNetworkSuggestion
API を使用できます。これはランタイム時に変更できます。
次のような例を想定します。
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
のいずれかの機能をネットワークにタグ付けすると、そのネットワークは制限付きネットワークとしてマークされます。制限付きネットワークは、OEM が制御する CONNECTIVITY_USE_RESTRICTED_NETWORKS
権限を持つアプリのみが使用できます。
この権限を持つアプリは、制限付きネットワークの使用を明示的にリクエストしている場合にのみ、制限付きネットワークを使用できます。ただし、デフォルトでは、これらのアプリは制限付きネットワークを使用することはできません。PANS によりマッピングされたアプリでは、制限付き OEM ネットワークをデフォルトとして設定でき、制限付きネットワークの使用権限がなくてもこれらのネットワークを使用できます。そのようなアプリは、PANS によってデフォルト ネットワークとして OEM ネットワークが割り当てられている場合、アプリが OEM ネットワークを選択するのであれば、明示的に OEM ネットワークをリクエストできます。
リファレンス アプリを確認する
NetworkPreferenceApp
という名前のリファレンス アプリ(コードを含む)は、ユーザー デバッグ用の自動車用ビルドで提供されています。このリファレンス アプリでは、以下を行う方法を確認できます。
- PANS 指標を使用する。
- PANS ポリシーを設定する。
- デバイスのデフォルトのポリシーを設定する。
- ポリシーを消去する。
- 起動時にポリシーを適用する。
- Driver Distraction API を使用する(ドライバーの注意散漫に関するガイドラインをご覧ください)。
OEM_PAID
とOEM_PRIVATE
を使用して Wi-Fi を動的に更新する。
図 3. リファレンス アプリ
指標
データ使用量の透明性を高めるために、OEM_PAID
と OEM_PRIVATE
のネットワーク マッピング経由で送信されるデータの量に関する指標が収集され、提供されます。
トラブルシューティング
トラブルシューティングの多くは、アプリが間違ったネットワークを使用している(ネットワーク接続がない)か、データ通信の容量がオーバーすることで発生します。迅速に解決できるようにするには:
- Connectivity
dumpsys
には、アプリごとのアクティブなデフォルト ネットワークと、それに関連付けられているアプリ(PANS からマッピング)のリストが含まれています。 - Netd
dumpsys
には、UID IP とファイアウォール ルールが含まれています。 - Netstats
dumpsys
には、アプリケーションごとの PANS 指標が含まれています(どのアプリがどの OEM ネットワークを使用したかなど)。
Android バグレポートを作成すると、すべての dumpsys
データが使用可能になります。