アプリごとのネットワーク選択(PANS)

自動車では、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 にとって次のような重要な利点があります。

  1. OEM は、ユーザーの代わりにネットワーク トラフィックの料金を支払うことができます。
    • システム アップデートを無料でユーザーに提供できます。
    • ユーザーが指定したアプリでネットワークを無料で使用できるようになります。
    • ユーザーが、テレメトリーやその他の分析を無料で管理できます。
  2. OEM は、ユーザーが有料のデータプランに加入していなくても、重要アプリが接続された状態を維持できます。たとえば、地図、アシスタント(ハンズフリー運転)、システム アップデートなどの安全上重要な機能は、ユーザーがデータプランに加入していなくても引き続き機能します。
  3. PANS では、Android でのネットワーク トラフィック ルーティングに固有の制御をさらに細かく行うことができます。たとえば、OEM はアプリレベルのトラフィックのルーティングに対して論理ネットワーク トポロジを適切に定義できます。

図 1. PANS フレームワーク

PANS を実装する

PANS を実装するために、新しい ConnectivityManager API(setOemNetworkPreference)が提供されています。この新しい API は、アプリを OemNetworkPreference にマッピングします。 この API は自動車デバイスでのみ使用可能で、新しい signature 権限を持つ @SystemApi としてアノテーションが付けられます。

図 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 アプリが 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 を実装する場合は、次の点に注意してください。

  • ネットワーク設定は再起動後には維持されないため、起動ごとに再適用する必要があります。
  • アプリの設定を作成する際、そのアプリがインストールされている必要はありません。したがって、インストールされていないアプリでもネットワーク設定を事前に設定できます。
  • どの時点であっても、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 を使用できます。これはランタイム時に変更できます。

次のような例を想定します。

  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_PAID または OEM_PRIVATE のいずれかの機能をネットワークにタグ付けすると、そのネットワークは制限付きネットワークとしてマークされます。制限付きネットワークは、OEM が制御する CONNECTIVITY_USE_RESTRICTED_NETWORKS 権限を持つアプリのみが使用できます。

この権限を持つアプリは、制限付きネットワークの使用を明示的にリクエストしている場合にのみ、制限付きネットワークを使用できます。ただし、デフォルトでは、これらのアプリは制限付きネットワークを使用することはできません。PANS によりマッピングされたアプリでは、制限付き OEM ネットワークをデフォルトとして設定でき、制限付きネットワークの使用権限がなくてもこれらのネットワークを使用できます。そのようなアプリは、PANS によってデフォルト ネットワークとして OEM ネットワークが割り当てられている場合、アプリが OEM ネットワークを選択するのであれば、明示的に OEM ネットワークをリクエストできます。

リファレンス アプリを確認する

NetworkPreferenceApp という名前のリファレンス アプリ(コードを含む)は、ユーザー デバッグ用の自動車用ビルドで提供されています。このリファレンス アプリでは、以下を行う方法を確認できます。

  • PANS 指標を使用する。
  • PANS ポリシーを設定する。
  • デバイスのデフォルトのポリシーを設定する。
  • ポリシーを消去する。
  • 起動時にポリシーを適用する。
  • Driver Distraction API を使用する(ドライバーの注意散漫に関するガイドラインをご覧ください)。
  • OEM_PAIDOEM_PRIVATE を使用して Wi-Fi を動的に更新する。

図 3. リファレンス アプリ

指標

データ使用量の透明性を高めるために、OEM_PAIDOEM_PRIVATE のネットワーク マッピング経由で送信されるデータの量に関する指標が収集され、提供されます。

トラブルシューティング

トラブルシューティングの多くは、アプリが間違ったネットワークを使用している(ネットワーク接続がない)か、データ通信の容量がオーバーすることで発生します。迅速に解決できるようにするには:

  • Connectivity dumpsys には、アプリごとのアクティブなデフォルト ネットワークと、それに関連付けられているアプリ(PANS からマッピング)のリストが含まれています。
  • Netd dumpsys には、UID IP とファイアウォール ルールが含まれています。
  • Netstats dumpsys には、アプリごとの PANS 指標が含まれています(どのアプリがどの OEM ネットワークを使用したかなど)。

Android バグレポートを作成すると、すべての dumpsys データが使用可能になります。