Wi-Fi

Wi-Fi 모듈은 업데이트 가능합니다. 즉, 일반적인 Android 출시 주기 이외의 기능에 관한 업데이트를 받을 수 있습니다. 이 모듈에는 다음과 같은 구성요소가 포함됩니다.

Wi-Fi 모듈 구성요소

그림 1. Wi-Fi 모듈 구성요소 및 아키텍처

Wi-Fi 모듈은 다음과 같은 이점을 제공합니다.

  • 최종 사용자는 모듈 업데이트를 통해 Android 기기 전반에 걸쳐 일관된 Wi-Fi 환경을 경험하고 상호 운용성 문제를 수정할 수 있습니다.

  • 앱 개발자는 플랫폼 조각화를 줄일 수 있습니다.

  • OEM은 이동통신사 요구사항을 충족하는 동시에 개별 맞춤설정 비용을 절감할 수 있습니다(동일한 요구사항을 서로 다른 방식으로 다양하게 구현할 필요가 없음).

Android 12 및 Android 13의 모듈 경계

  • packages/modules/Wifi
    • framework
      • java/
        • android/net/wifi(frameworks/base/wifi/java의 파일)
      • tests/
        • android/net/wifi(frameworks/base/wifi/tests의 파일)
      • aidl-export/
      • api/
      • Android.bp
    • service/
      • java/
        • com/android/server/wifi(frameworks/opt/net/wifi/service/java의 파일)
      • tests/
        • com/android/server/wifi(frameworks/opt/net/wifi/tests의 파일)
      • proto/
      • Android.bp
      • proguard.flags
      • wifi.rc
    • OsuLogin/(frameworks/base/packages/OsuLogin의 파일)
    • ServiceResources/(Android 12의 새로운 기능, 오버레이 APK 매니페스트가 여기에 저장됨)
      • res/(Android 11의 새로운 기능, frameworks/base/core/res/res에서 추출된 Wi-Fi 구성)
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/(Android 13의 새로운 기능, 서비스에서 요청한 사용자 대화상자를 실행하는 앱이 여기에 저장됨)
      • src/
        • com/android/wifi/dialog(대화상자가 시작된 활동을 포함함)
      • AndroidManifest.xml
      • Android.bp

위 디렉터리에는 모듈식 시스템 구성요소 외부와 현재 위치에 유지되는 코드도 포함됩니다. 예를 들면 다음과 같습니다.

  • wificond interface(android.net.wifi.nl80211 패키지의 클래스, 예: WifiNl80211Manager)
  • 샘플 리소스 오버레이 앱
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

OEM은 샘플 명령어를 사용하여 원본 프로젝트 디렉터리에서 새 프로젝트 디렉터리로 패치를 이동할 수 있습니다.

frameworks/base/wifi에서 패치 이동

root/frameworks/base/wifi에 패치 파일 생성

git format-patch -1 commit --stdout > patch-file.txt

root/packages/modules/Wifi에 패치 파일 적용

git am -p2 --directory=framework/ patch-file.txt

frameworks/opt/net/wifi에서 패치 이동

frameworks/opt/net/wifi에서 패치를 이동하려면 이전 중에 디렉터리 계층 구조가 변경되었으므로 복잡한 단계가 필요합니다.

frameworks/opt/net/wifi에서 커밋을 service/tests/ 두 커밋으로 분할합니다.

HEAD 커밋 이전

git reset HEAD^
git add service/
git commit # Enter your commit message. Call this commit service-commit
git add tests/
git commit # Enter your commit message. Call this commit test-commit

2개의 커밋 패치 파일 생성

git format-patch -1 service-commit --stdout > service-patch.txt
git format-patch -1 test-commit --stdout > test-patch.txt

2개의 패치를 패키지/모듈/Wi-Fi에 적용

git am service-patch.txt
git am -p1 --directory=service/ test-patch.txt

두 커밋을 하나의 커밋으로 다시 스쿼싱

git rebase -i

두 번째 커밋의 작업을 squash로 변경합니다.

커밋 메시지를 적절하게 수정합니다.

Android 11의 모듈 경계

Wi-Fi 서비스는 시스템 서비스 프로세스 내에서 계속 실행됩니다. Wi-Fi 모듈은 packages/modules/Wifi에 다음을 비롯한 모든 코드를 포함합니다.

  • WifiService, WifiP2pService, WifiAwareService, WifiScannerService. WifiRttService용 SDK 및 서비스 클래스
  • OsuLogin
  • ServiceWifiResources

모듈은 OEM의 AOSP 빌드의 일부로 남아 있는 다음 구성요소를 제외합니다.

  • system/connectivity/wificondwificond 네이티브 구성요소
  • wificond 인터페이스(android.net.wifi.nl80211 패키지의 클래스, 예를 들어 WifiNl80211Manager)
  • android.net.wifi.SoftApConfToXmlMigrationUtil
  • android.net.wifi.WifiNetworkScoreCache
  • android.net.wifi.WifiMigration
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Android 11에서는 파일을 이동하지 않지만 향후 출시에서는 파일 이동을 지원할 수도 있습니다. 파일 위치 변경사항 포팅과 관련된 작업을 줄이려면 AOSP에 변경사항을 가능한 한 많이 업스트림하는 것이 좋습니다(변경사항을 Android 11에 포팅한 후 또는 공식 Android API 또는 공급업체 HAL 확장을 사용하도록 독점 확장을 리팩터링하여 AOSP 코드에서 분리한 후).

모듈 형식

Wi-Fi 모듈(com.android.wifi)은 APEX 형식이며 Android 11 이상을 실행하는 기기에서 사용할 수 있습니다. APEX 파일에는 다음과 같은 구성요소가 포함됩니다.

  • SDK 라이브러리(framework-wifi.jar)
  • 서비스 라이브러리(service-wifi.jar)
  • OsuLogin APK(OsuLoginGoogle.apk)
  • 리소스 APK(ServiceWifiResourcesGoogle.apk)
  • WFA 인증서

모듈 종속 항목

Wi-Fi 모듈은 다음 구성요소에 종속됩니다.

  • 연결
  • 전화 통신
  • Proto 라이브러리
  • 기타 시스템 구성요소
  • WiFi HAL
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

이 모듈은 안정적인 @SystemApi(@hide API 사용 없음)만 사용하여 프레임워크와 상호작용하며, 플랫폼 서명 대신 Google 서명으로 서명됩니다.

맞춤설정

Wi-Fi 모듈은 직접 맞춤설정을 지원하지 않지만, 런타임 리소스 오버레이(RRO) 또는 이동통신사 구성을 사용하여 구성을 맞춤설정할 수 있습니다.

Wi-Fi 맞춤설정

그림 2. Wi-Fi 모듈 맞춤설정

  • 소규모 맞춤설정의 경우 RRO config에서 설정을 사용 또는 사용 중지합니다.
  • 더 세부적으로 제어하려면 @SystemAPI로 노출된 이동통신사 구성 키의 구성 값을 맞춤설정합니다.

런타임 리소스 오버레이 사용

RRO를 사용하여 기본 구성을 재정의함으로써 Wi-Fi 모듈을 맞춤설정할 수 있습니다. 오버레이 가능한 구성 목록은 packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml을 참고하세요. 구성 동작 세부정보는 packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml을 참고합니다. 샘플 오버레이 앱은 device/google/coral/rro_overlays/WifiOverlay/를 참고하세요.

device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml 파일에서 targetPackage 속성을 com.android.wifi.resources로 설정하고 Wi-Fi 모듈에서 제공하는 리소스 APK의 패키지 이름이 com.google.android.wifi.resources이므로 Wi-Fi 구성을 성공적으로 오버레이하려면 오버레이 APKS targetPackagecom.google.android.wifi.resources로 설정해야 합니다.

구성 저장소 형식 이전

Wi-Fi 모듈은 AOSP Wi-Fi 구성 저장소 형식만 파싱할 수 있습니다. 이전에 Wi-Fi 구성 저장소 형식(사용자의 저장된 네트워크 목록 포함)을 수정했다면 Wi-Fi 모듈이 포함된 Android 출시로 기기를 업그레이드할 때 해당 데이터를 AOSP 형식으로 변환해야 합니다. 이 변환에 필요한 후크는 android.net.wifi.WifiMigration 클래스에 있습니다.

다음 메서드에서 형식 변환을 구현합니다.

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • Wi-Fi 모듈에 의해 호출되어 AOSP 형식으로 변환된 Wi-Fi 공유 저장소 파일 콘텐츠를 검색합니다.

    • 이전에는(Android 10에서) 이러한 파일이 기기의 /data/misc/wifi 폴더에 저장되었습니다.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • Wi-Fi 모듈에 의해 호출되어 AOSP 형식으로 변환된 Wi-Fi 사용자별 저장소 파일 콘텐츠를 검색합니다.

    • 이전에는(Android 10에서) 이러한 파일이 기기의 /data/misc_ce/<userId>/wifi 폴더에 저장되었습니다.

숨겨진 Wi-Fi API 액세스

Wi-Fi 모듈에서 @hide 주석이 지정된 기호(클래스, 메서드, 필드 등)는 공개 API 노출 영역의 일부가 아니며 모듈이 설치된 기기에서 액세스할 수 없습니다. Wi-Fi 모듈이 포함되지 않은 기기는 다음 단계에 따라 @hide Wi-Fi API를 계속 사용할 수 있습니다.

  1. impl_library_visibility 속성을 공개로 변경하여 packages/modules/Wifi/framework/Android.bpframework-wifi에 적용된 공개 상태 제한을 삭제합니다.

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. @hide Wi-Fi API 라이브러리 액세스를 허용하도록 빌드 규칙을 변경합니다. 예를 들어 다음은 java_library의 빌드 규칙입니다.

    java_library {
        name: "foo-lib",
    
        // no sdk_version attribute defined
    
        libs: [
            "dependency1",
            "dependency2",
        ],
    }
    

    foo-lib의 라이브러리 액세스를 허용하려면 아래와 같이 빌드 규칙을 변경합니다.

    java_library {
        name: "foo-lib",
    
        sdk_version: "core_platform",
    
        libs: [
            "framework-wifi.impl",
            "framework",
            "dependency1",
            "dependency2",
        ],
    }
    
  3. libs 목록에서 framework-wifi.implframework보다 먼저 표시되는지 확인합니다. libs 속성의 종속 항목 순서는 중요합니다.

숨겨진 프레임워크 API 액세스

Wi-Fi 모듈 외부에서 @hide 주석이 지정된 기호는 Wi-Fi 모듈 내의 코드로 액세스할 수 없습니다. Wi-Fi 모듈이 포함되지 않은 기기는 frameworks/opt/net/wifi/service/Android.bp를 다음과 같이 수정하여 service-wifi에서 @hide 외부 API(예를 들어 framework.jar의)를 계속 사용할 수 있습니다.

  1. wifi-service-pre-jarjarservice-wifi 모두에서 sdk_version 속성을 core_platform으로 변경합니다.

  2. wifi-service-pre-jarjarservice-wifi 모두에서 libs 속성에 frameworkandroid_system_server_stubs_current를 추가합니다.

  3. 결과가 다음 코드 샘플과 비슷한지 확인합니다.

    java_library {
        name: "wifi-service-pre-jarjar",
        ...
        sdk_version: "core_platform",
        ...
        libs: [
            ...
            "framework",
            "android_system_server_stubs_current",
        ],
    }
    ...
    java_library {
        name: "service-wifi",
        ...
        sdk_version: "core_platform",
        ...
        libs: [
            ...
            "framework",
            "android_system_server_stubs_current",
        ],
    }
    

    Wi-Fi 모듈은 업데이트 가능합니다. 즉, 일반적인 Android 출시 주기 이외의 기능에 관한 업데이트를 받을 수 있습니다. 이 모듈에는 다음과 같은 구성요소가 포함됩니다.

Wi-Fi 모듈 구성요소

그림 1. Wi-Fi 모듈 구성요소 및 아키텍처

Wi-Fi 모듈은 다음과 같은 이점을 제공합니다.

  • 최종 사용자는 모듈 업데이트를 통해 Android 기기 전반에 걸쳐 일관된 Wi-Fi 환경을 경험하고 상호 운용성 문제를 수정할 수 있습니다.

  • 앱 개발자는 플랫폼 조각화를 줄일 수 있습니다.

  • OEM은 이동통신사 요구사항을 충족하는 동시에 개별 맞춤설정 비용을 절감할 수 있습니다(동일한 요구사항을 서로 다른 방식으로 다양하게 구현할 필요가 없음).

Android 12의 모듈 경계

  • packages/modules/Wifi
    • framework
      • java/
        • android/net/wifi(frameworks/base/wifi/java의 파일)
      • tests/
        • android/net/wifi(frameworks/base/wifi/tests의 파일)
      • aidl-export/
      • api/
      • Android.bp
    • service/
      • java/
        • com/android/server/wifi(frameworks/opt/net/wifi/service/java의 파일)
      • tests/
        • com/android/server/wifi(frameworks/opt/net/wifi/tests의 파일)
      • proto/
      • Android.bp
      • proguard.flags
      • wifi.rc
    • OsuLogin/(frameworks/base/packages/OsuLogin의 파일)
    • ServiceResources/(Android 12의 새로운 기능, 오버레이 APK 매니페스트가 여기에 저장됨)
      • res/(Android 11의 새로운 기능, frameworks/base/core/res/res에서 추출된 Wi-Fi 구성)
      • AndroidManifest.xml
      • Android.bp

위 디렉터리에는 모듈식 시스템 구성요소 외부와 현재 위치에 유지되는 코드도 포함됩니다. 예를 들면 다음과 같습니다.

  • wificond interface(android.net.wifi.nl80211 패키지의 클래스, 예: WifiNl80211Manager)
  • 샘플 리소스 오버레이 앱
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

OEM은 샘플 명령어를 사용하여 원본 프로젝트 디렉터리에서 새 프로젝트 디렉터리로 패치를 이동할 수 있습니다.

frameworks/base/wifi에서 패치 이동

root/frameworks/base/wifi에 패치 파일 생성

git format-patch -1 commit --stdout > patch-file.txt

root/packages/modules/Wifi에 패치 파일 적용

git am -p2 --directory=framework/ patch-file.txt

frameworks/opt/net/wifi에서 패치 이동

frameworks/opt/net/wifi에서 패치를 이동하려면 이전 중에 디렉터리 계층 구조가 변경되었으므로 복잡한 단계가 필요합니다.

frameworks/opt/net/wifi에서 커밋을 service/tests/ 두 커밋으로 분할합니다.

HEAD 커밋 이전

git reset HEAD^
git add service/
git commit # Enter your commit message. Call this commit service-commit
git add tests/
git commit # Enter your commit message. Call this commit test-commit

2개의 커밋 패치 파일 생성

git format-patch -1 service-commit --stdout > service-patch.txt
git format-patch -1 test-commit --stdout > test-patch.txt

2개의 패치를 패키지/모듈/Wi-Fi에 적용

git am service-patch.txt
git am -p1 --directory=service/ test-patch.txt

두 커밋을 하나의 커밋으로 다시 스쿼싱

git rebase -i

두 번째 커밋의 작업을 squash로 변경합니다.

커밋 메시지를 적절하게 수정합니다.

Android 11의 모듈 경계

Wi-Fi 서비스는 시스템 서비스 프로세스 내에서 계속 실행됩니다. Wi-Fi 모듈은 packages/modules/Wifi에 다음을 비롯한 모든 코드를 포함합니다.

  • WifiService, WifiP2pService, WifiAwareService, WifiScannerService. WifiRttService용 SDK 및 서비스 클래스
  • OsuLogin
  • ServiceWifiResources

모듈은 OEM의 AOSP 빌드의 일부로 남아 있는 다음 구성요소를 제외합니다.

  • system/connectivity/wificondwificond 네이티브 구성요소
  • wificond 인터페이스(android.net.wifi.nl80211 패키지의 클래스, 예를 들어 WifiNl80211Manager)
  • android.net.wifi.SoftApConfToXmlMigrationUtil
  • android.net.wifi.WifiNetworkScoreCache
  • android.net.wifi.WifiMigration
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_system_iface

Android 11에서는 파일을 이동하지 않지만 향후 출시에서는 파일 이동을 지원할 수도 있습니다. 파일 위치 변경사항 포팅과 관련된 작업을 줄이려면 AOSP에 변경사항을 가능한 한 많이 업스트림하는 것이 좋습니다(변경사항을 Android 11에 포팅한 후 또는 공식 Android API 또는 공급업체 HAL 확장을 사용하도록 독점 확장을 리팩터링하여 AOSP 코드에서 분리한 후).

모듈 형식

Wi-Fi 모듈(com.google.android.wifi.apex)은 APEX 형식이며 Android 11 이상을 실행하는 기기에서 사용할 수 있습니다. APEX 파일에는 다음과 같은 구성요소가 포함됩니다.

  • SDK 라이브러리(framework-wifi.jar)
  • 서비스 라이브러리(service-wifi.jar)
  • OsuLogin APK(OsuLoginGoogle.apk)
  • 리소스 APK(ServiceWifiResourcesGoogle.apk)
  • WFA 인증서

모듈 종속 항목

Wi-Fi 모듈은 다음 구성요소에 종속됩니다.

  • 연결
  • 전화 통신
  • Proto 라이브러리
  • 기타 시스템 구성요소
  • WiFi HAL
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

이 모듈은 안정적인 @SystemApi(@hide API 사용 없음)만 사용하여 프레임워크와 상호작용하며, 플랫폼 서명 대신 Google 서명으로 서명됩니다.

맞춤설정

Wi-Fi 모듈은 직접 맞춤설정을 지원하지 않지만, 런타임 리소스 오버레이(RRO) 또는 이동통신사 구성을 사용하여 구성을 맞춤설정할 수 있습니다.

Wi-Fi 맞춤설정

그림 2. Wi-Fi 모듈 맞춤설정

  • 소규모 맞춤설정의 경우 RRO config에서 설정을 사용 또는 사용 중지합니다.
  • 더 세부적으로 제어하려면 @SystemAPI로 노출된 이동통신사 구성 키의 구성 값을 맞춤설정합니다.

런타임 리소스 오버레이 사용

RRO를 사용하여 기본 구성을 재정의함으로써 Wi-Fi 모듈을 맞춤설정할 수 있습니다. 오버레이 가능한 구성 목록은 packages/modules/Wifi/service/ServiceWifiResources/res/values/overlayable.xml을 참고하세요. 구성 동작 세부정보는 packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml을 참고합니다. 샘플 오버레이 앱은 device/google/coral/rro_overlays/WifiOverlay/를 참고하세요.

device/google/coral/rro_overlays/WifiOverlay/AndroidManifest.xml 파일에서 targetPackage 속성을 com.android.wifi.resources로 설정하고 Wi-Fi 모듈에서 제공하는 리소스 APK의 패키지 이름이 com.google.android.wifi.resources이므로 Wi-Fi 구성을 성공적으로 오버레이하려면 오버레이 APKS targetPackagecom.google.android.wifi.resources로 설정해야 합니다.

구성 저장소 형식 이전

Wi-Fi 모듈은 AOSP Wi-Fi 구성 저장소 형식만 파싱할 수 있습니다. 이전에 Wi-Fi 구성 저장소 형식(사용자의 저장된 네트워크 목록 포함)을 수정했다면 Wi-Fi 모듈이 포함된 Android 출시로 기기를 업그레이드할 때 해당 데이터를 AOSP 형식으로 변환해야 합니다. 이 변환에 필요한 후크는 android.net.wifi.WifiMigration 클래스에 있습니다.

다음 메서드에서 형식 변환을 구현합니다.

  • WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)

    • Wi-Fi 모듈에 의해 호출되어 AOSP 형식으로 변환된 Wi-Fi 공유 저장소 파일 콘텐츠를 검색합니다.

    • 이전에는(Android 10에서) 이러한 파일이 기기의 /data/misc/wifi 폴더에 저장되었습니다.

  • WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)

    • Wi-Fi 모듈에 의해 호출되어 AOSP 형식으로 변환된 Wi-Fi 사용자별 저장소 파일 콘텐츠를 검색합니다.

    • 이전에는(Android 10에서) 이러한 파일이 기기의 /data/misc_ce/<userId>/wifi 폴더에 저장되었습니다.

숨겨진 Wi-Fi API 액세스

Wi-Fi 모듈에서 @hide 주석이 지정된 기호(클래스, 메서드, 필드 등)는 공개 API 노출 영역의 일부가 아니며 모듈이 설치된 기기에서 액세스할 수 없습니다. Wi-Fi 모듈이 포함되지 않은 기기는 다음 단계에 따라 @hide Wi-Fi API를 계속 사용할 수 있습니다.

  1. impl_library_visibility 속성을 공개로 변경하여 packages/modules/Wifi/framework/Android.bpframework-wifi에 적용된 공개 상태 제한을 삭제합니다.

    java_sdk_library {
        name: "framework-wifi",
        ...
        impl_library_visibility: [
           "//visibility:public", // Add this rule and remove others.
        ],
        ...
    }
    
  2. @hide Wi-Fi API 라이브러리 액세스를 허용하도록 빌드 규칙을 변경합니다. 예를 들어 다음은 java_library의 빌드 규칙입니다.

    java_library {
        name: "foo-lib",
    
        // no sdk_version attribute defined
    
        libs: [
            "dependency1",
            "dependency2",
        ],
    }
    

    foo-lib의 라이브러리 액세스를 허용하려면 아래와 같이 빌드 규칙을 변경합니다.

    java_library {
        name: "foo-lib",
    
        sdk_version: "core_platform",
    
        libs: [
            "framework-wifi.impl",
            "framework",
            "dependency1",
            "dependency2",
        ],
    }
    
  3. libs 목록에서 framework-wifi.implframework보다 먼저 표시되는지 확인합니다. libs 속성의 종속 항목 순서는 중요합니다.

숨겨진 프레임워크 API 액세스

Wi-Fi 모듈 외부에서 @hide 주석이 지정된 기호는 Wi-Fi 모듈 내의 코드로 액세스할 수 없습니다. Wi-Fi 모듈이 포함되지 않은 기기는 frameworks/opt/net/wifi/service/Android.bp를 다음과 같이 수정하여 service-wifi에서 @hide 외부 API(예를 들어 framework.jar의)를 계속 사용할 수 있습니다.

  1. wifi-service-pre-jarjarservice-wifi 모두에서 sdk_version 속성을 core_platform으로 변경합니다.

  2. wifi-service-pre-jarjarservice-wifi 모두에서 libs 속성에 frameworkandroid_system_server_stubs_current를 추가합니다.

  3. 결과가 다음 코드 샘플과 비슷한지 확인합니다.

    java_library {
        name: "wifi-service-pre-jarjar",
        ...
        sdk_version: "core_platform",
        ...
        libs: [
            ...
            "framework",
            "android_system_server_stubs_current",
        ],
    }
    ...
    java_library {
        name: "service-wifi",
        ...
        sdk_version: "core_platform",
        ...
        libs: [
            ...
            "framework",
            "android_system_server_stubs_current",
        ],
    }
    

테스트

Android 호환성 테스트 모음(CTS)은 모든 모듈 출시에 대해 일련의 종합 CTS 테스트를 실행하여 Wi-Fi 모듈의 기능을 확인합니다. 또한 개발자는 Wi-Fi 테스트, 디버깅 및 미세 조정에 설명된 테스트를 실행할 수도 있습니다.