2025년 3월 27일부터 AOSP를 빌드하고 기여하려면 aosp-main
대신 android-latest-release
를 사용하는 것이 좋습니다. 자세한 내용은 AOSP 변경사항을 참고하세요.
애플리케이션별 네트워크 선택(PANS)
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
OEM과 차량 소유자의 요청에 따라 늘어나는 사용 사례를 관리하기 위해 차량은 점점 더 연결성에 의존하고 있습니다. 따라서 데이터 공간과 관련 비용이 증가합니다. 애플리케이션별 네트워크 선택(PANS) 기능을 사용하여 OEM이 비용을 부담하는 네트워크에서 지정된 앱의 트래픽을 라우팅하세요.
PANS를 사용하면 데이터 사용량과 비용을 관리하면서 강력하고 안전하며 연결된 자동차 환경을 제공할 수 있습니다. PANS는 다음과 같습니다.
- 자동차 기기에서만 사용할 수 있는
ConnectivityManager
에 추가된 새 API로 구성됩니다.
- 동적으로 변경되는 PANS 네트워크 기능 지원이 포함되도록 업데이트된 Wi-Fi 추천 API(인터넷 연결을 위한 Wi-Fi 추천 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 앱이 전용 네트워크 액세스 권한을 얻는 데 주로 사용됩니다.
/**
* 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 중 하나를 통해 사용하려는 네트워크를 지정하지 않았을 때 사용됩니다. 이렇게 하면 대부분의 연결 요구사항이 해결될 뿐 아니라
NetworkRequest
API와 같은 특수 API를 계속 사용하여 기존의 앱 사용 사례가 중단되지 않도록 할 수 있습니다. 예를 들어, 앱이 무제한(UNMETERED) 네트워크에서만 작업을 실행하려는 경우 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
기능으로 네트워크에 태그를 지정하면 네트워크가 제한된 네트워크로 표시됩니다. 제한된 네트워크는 OEM이 제어하는 CONNECTIVITY_USE_RESTRICTED_NETWORKS
권한이 있는 앱에서만 사용할 수 있습니다.
이 권한이 있는 앱은 앱에서 명시적으로 요청하는 경우 제한된 네트워크를 사용할 수 있습니다. 그러나 이러한 앱은 제한된 네트워크를 기본값으로 사용하지 않습니다. PANS를 통해 매핑된 앱은 제한된 OEM 네트워크를 기본값으로 설정할 수 있으며 이를 사용하기 위해 제한된 네트워크 권한이 필요하지 않습니다. 이러한 앱에 PANS를 통해 기본 네트워크로 할당된 제한된 OEM 네트워크가 있으면 앱에서 원하는 경우 앞서 언급한 OEM 네트워크를 명시적으로 요청할 수도 있습니다.
참조 앱 검토
NetworkPreferenceApp
이라는 참조 앱(코드 포함)이 사용자 디버그 자동차 빌드에 제공되고 다음을 실행하는 방법을 보여줍니다.
- PANS 측정항목 사용
- PANS 정책 설정
- 기기의 기본 정책 설정
- 정책 삭제
- 부팅 시 정책 적용
- Driver Distraction API 사용(운전자 주의 분산 행동 가이드라인 참고)
OEM_PAID
및 OEM_PRIVATE
으로 Wi-Fi 동적 업데이트

그림 3. 참조 앱
측정항목
데이터 사용량의 투명성을 높이기 위해 OEM_PAID
및 OEM_PRIVATE
네트워크 매핑을 통해 전송되는 데이터의 양에 관한 측정항목이 수집되고 제공됩니다.
문제 해결
대부분의 문제 해결 상황은 잘못된 네트워크(네트워크 연결 없음)를 사용하는 앱이나 데이터 초과로 인해 발생합니다. 빠르게 문제를 해결하려면 다음 안내를 따르세요.
- 연결
dumpsys
에는 앱별 활성 기본 네트워크 및 연결된 앱 (PANS에서 매핑됨) 목록이 포함됩니다.
- Netd
dumpsys
에는 UID IP 및 방화벽 규칙이 포함됩니다.
- Netstats
dumpsys
에는 앱별 PANS 측정항목이 포함됩니다.
예를 들어 어떤 앱에서 어떤 OEM 네트워크를 사용했는지 알 수 있습니다.
모든 dumpsys
데이터는 Android 버그 신고를 만들어 사용할 수 있습니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-06-12(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-06-12(UTC)"],[],[],null,["# Per-application network selection (PANS)\n\nVehicles increasingly rely on connectivity to manage the growing list of\nuse cases requested by both OEMs and vehicle owners, resulting in an increased\ndata footprint and associated costs. Use the *per-application network selection\n(PANS)* feature to route the traffic of specified apps on networks paid for\nby the OEM.\n\nWith PANS, you can manage the volume and cost of data usage while simultaneously\nproviding a robust, secure, and connected car experience. PANS:\n\n- Consists of a new API added to `ConnectivityManager` available only to automotive devices.\n- Provides an updated Wi-Fi suggestion API (see [Wi-Fi suggestion API for internet connectivity](https://developer.android.com/guide/topics/connectivity/wifi-suggest)) to include support for dynamically changing PANS network capabilities.\n- Collects supporting metrics.\n- Provides a reference app.\n\nWhy PANS?\n---------\n\nPANS can:\n\n- Dynamically update app-to-network mappings.\n- Manage app-level routing without making changes to apps.\n- Only OEM-allowed apps can access the mapped OEM networks.\n- App developers needn't make any changes to implement this feature.\n- User-facing metrics track app-to-network data usage for OEM managed networks.\n- Network access is secure and can't be abused through unintended use cases or unauthorized apps.\n- Changes to PANS app-to-network mappings are communicated to users.\n- The same network configuration is applied across all users.\n\n### Core advantages\n\nPANS provides OEMS with these core advantages:\n\n1. OEMs can pay for network traffic instead of users:\n - System updates can be provided at no cost to the user.\n - Network usage of specified apps can be provided at no cost to the user.\n - Telemetry and other analytics can be managed at no cost to the user.\n2. OEMs can ensure critical apps remain connected even without a user-paid data plan. For example, safety-critical features such as maps, assistant (hands-free driving), and system updates continue to function even when a user has no data plan.\n3. PANS provides additional granularity of control specific to network traffic routing in Android. For example, OEMs can optimally define a logical network topology for the routing of app-level traffic.\n\n**Figure 1**. PANS framework\n\nImplement PANS\n--------------\n\nTo implement PANS, a new `ConnectivityManager` API,\n`setOemNetworkPreference`, is provided.\nThis new API maps apps to an `OemNetworkPreference`.\nThis API is available only to automotive devices and is annotated as a\n`@SystemApi` with a new `signature` permission.\n\n**Figure 2.** Implement PANS\n\n### OemNetworkPreference\n\n`OemNetworkPreference` is an abstraction over `OEM_PAID` and\n`OEM_PRIVATE` `NetworkCapabilities` mapping apps by package name\nto a *network preference* . Network preferences allow for network hierarchies.\nFor example, mapping an app to the `OEM_NETWORK_PREFERENCE_OEM_PAID` preference\nresults in the following priority of default networks assigned to an app: use an\n`UNMETERED` network first, if `UNMETERED` is not available use an\n`OEM_PAID` network, and if `OEM_PAID` is not available, use the system\ndefault network.\n\n- `OEM_PAID` Used primarily for apps that can be routed on both OEM and non-OEM networks.\n- `OEM_PRIVATE` Used primarily for OEM apps to gain access to a network dedicated to them.\n\n```scilab\n/**\n* If an unmetered network is available, use it.\n* Otherwise, if a network with the OEM_PAID capability is available, use it.\n* Otherwise, use the general default network.\n*/\npublic static final int OEM_NETWORK_PREFERENCE_OEM_PAID = 1;\n\n/**\n* If an unmetered network is available, use it.\n* Otherwise, if a network with the OEM_PAID capability is available, use it.\n* Otherwise, the app doesn't get a default network.\n*/\npublic static final int OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK = 2;\n\n/**\n* Use only NET_CAPABILITY_OEM_PAID networks.\n*/\npublic static final int OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY = 3;\n\n/**\n* Use only NET_CAPABILITY_OEM_PRIVATE networks.\n*/\npublic static final int OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY = 4;\n```\n\n### Call PANS APIs\n\nTo use PANS APIs:\n\n1. Use `OemNetworkPreferences` to map an app to a network preference.\n2. Call `setOemNetworkPreference` with the `OemNetworkPreferences` object.\n3. Use the `Runnable` interface to listen for API completion.\n\nFor example: \n\n```carbon\n// Mapping three packages to two network preferences\n// Packages have a 1:1 mapping to network preferences\nOemNetworkPreferences pref = new OemNetworkPreferences.Builder()\n .addNetworkPreference(\"first.package.name\", OEM_NETWORK_PREFERENCE_OEM_PAID)\n .addNetworkPreference(\"second.package.name\", OEM_NETWORK_PREFERENCE_OEM_PAID)\n .addNetworkPreference(\"third.package.name\", OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY)\n .build();\n\nmyConnectivityManager.setOemNetworkPreference(pref, myExecutor, myListener);\n```\n\n### Considerations\n\nAs you implement PANS, keep the following points in mind:\n\n- Network preferences aren't persisted across boots and needs to be reapplied on each boot.\n- To create a preference for an app, it needn't be installed. Therefore, network preferences for uninstalled apps can be set proactively.\n- At any given time, an app can only be mapped to a single network preference.\n- Network preferences are used to set the default network of an app. This is the network used when an app hasn't specified what network(s) it wants to use through one of the specialized APIs. Not only does this cover the vast majority of connectivity needs, it also allows continued usage of specialized APIs such as the `NetworkRequest` API so as to not break existing app use-cases. For example, when an app only wants to do an operation over an unmetered network, PANS won't force it to use another network.\n\nConfigure a network\n-------------------\n\nA network with either the `OEM_PAID` or `OEM_PRIVATE`\ncapabilities must be available when using a corresponding network preference. Android\nprovides support for the configuration of capabilities for Ethernet and Wi-Fi networks. For\nEthernet networks, you can use a resource overlay, `config_ethernet_interfaces`.\nThis is set at compile time.\n\nFor Wi-Fi, the `WifiNetworkSuggestion` API can be used with the new\nAndroid 12 APIs, `setOemPaid(Boolean)` and\n`setOemPrivate(Boolean)`. This can be changed at runtime.\n\nConsider these examples:\n\n1. A resource overlay named `config_ethernet_interfaces` specifies:\n - The name of the interface to configure.\n - The desired `NetworkCapabilities` values. \n\n ```scdoc\n \u003c!-- 11 NET_CAPABILITY_NOT_METERED\n 12 NET_CAPABILITY_INTERNET\n 14 NET_CAPABILITY_TRUSTED\n 15 NET_CAPABILITY_NOT_VPN\n 22 NET_CAPABILITY_OEM_PAID || 26 NET_CAPABILITY_OEM_PRIVATE --\u003e\n \u003cstring-array translatable=\"false\" name=\"config_ethernet_interfaces\"\u003e\n \u003citem\u003eeth0;11,12,14,15,22;;\u003c/item\u003e\u003c/string-array\u003e\n ```\n2. This `WiFiNetworkSuggestion` can be changed dynamically: \n\n ```text\n ArrayList\u003cWifiNetworkSuggestion\u003e list = new ArrayList\u003c\u003e();\n list.add(new WifiNetworkSuggestion.Builder()\n .setSsid(WifiInfo.sanitizeSsid(ssid))\n .setOemPrivate(true)\n .build());\n mWifiManager.addNetworkSuggestions(list);\n ```\n\nRestrict access to PANS networks\n--------------------------------\n\nTagging a network with either the `OEM_PAID` or `OEM_PRIVATE`\ncapabilities marks that network as a *restricted network* . Restricted networks\ncan *only* be used by apps that have the\n`CONNECTIVITY_USE_RESTRICTED_NETWORKS` permission, which is controlled by OEMs.\n\nApps with this permission can use restricted networks *provided the apps explicitly request\nthem*. However, these apps won't get restricted networks as their default. Apps\nmapped through PANS can have restricted OEM networks set as their default and won't need\nthe restricted network permission to use them. When such an app has a restricted\nOEM network assigned as its default network by PANS, it also has the ability to\nexplicitly request said OEM network if the app chooses to do so.\n\nReview the reference app\n------------------------\n\nA reference app (including code) named `NetworkPreferenceApp` is provided\nin user-debug automotive builds and demonstrates how to:\n\n- Consume PANS metrics.\n- Set PANS policy.\n- Set a default policy for the device.\n- Clear a policy.\n- Apply a policy on boot.\n- Use the Driver Distraction API (see [Driver Distraction Guidelines](/docs/automotive/driver_distraction/guidelines)).\n- Dynamically update Wi-Fi with `OEM_PAID` and `OEM_PRIVATE`.\n\n**Figure 3.** Reference app\n\nMetrics\n-------\n\nTo facilitate transparency around data usage, metrics are collected and made\navailable regarding the amount of data transmitted over the\n`OEM_PAID` and `OEM_PRIVATE` network mappings.\n\nTroubleshooting\n---------------\n\nMost troubleshooting conditions arise from either an app using the wrong network\n(no network connectivity) or data overages. To enable quick resolutions:\n\n- Connectivity `dumpsys` includes a list of active per-app default networks and their associated apps (mapped from PANS).\n- Netd `dumpsys` includes UID IP and firewall rules.\n- Netstats `dumpsys` includes PANS per-app metrics. For example, which apps used which OEM network.\n\nAll `dumpsys` data is available by creating an Android bugreport."]]