Wi-Fi 모듈은 업데이트가 가능합니다. 즉, 일반적인 Android 출시 주기 외에 기능 업데이트를 받을 수 있습니다. 이 모듈에는 다음 구성 요소가 포함되어 있습니다.
그림 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
두 개의 커밋 패치 파일 생성
git format-patch -1 service-commit --stdout > service-patch.txt
git format-patch -1 test-commit --stdout > test-patch.txt
두 개의 패치를 packages/modules/Wifi에 적용
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/wificond
의wificond
기본 구성 요소 -
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 모듈은 다음 구성 요소에 의존합니다.
- 연결성
- 전화 통신
- 프로토 라이브러리
- 기타 시스템 구성 요소
- WiFi HAL
-
wificond
-
bouncycastle
-
ksoap2
-
libnanohttpd
이 모듈은 안정적인 @SystemApi
( @hide
API 사용 없음)만 사용하여 프레임워크와 상호 작용하며 플랫폼 서명 대신 Google 서명으로 서명됩니다.
커스터마이징
Wi-Fi 모듈은 직접 사용자 지정을 지원하지 않지만 런타임 리소스 오버레이(RRO) 또는 이동통신사 구성을 사용하여 구성을 사용자 지정할 수 있습니다.
그림 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 targetPackage
를 com.google.android.wifi.resources
로 설정해야 합니다.
구성 저장 형식 마이그레이션
Wi-Fi 모듈은 AOSP Wi-Fi 구성 저장 형식만 구문 분석할 수 있습니다. 이전에 Wi-Fi 구성 저장 형식(사용자의 저장된 네트워크 목록 포함)을 수정한 경우 기기를 Wi-Fi 모듈이 포함된 Android 릴리스로 업그레이드할 때 해당 데이터를 AOSP 형식으로 변환해야 합니다. 이 변환에 필요한 후크는 android.net.wifi.WifiMigration
클래스에 있습니다.
다음 방법으로 형식 변환을 구현하십시오.
WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)
AOSP 형식으로 변환된 Wi-Fi 공유 저장소 파일 콘텐츠를 검색하기 위해 Wi-Fi 모듈에 의해 호출됩니다.
이러한 파일은 이전에(Android 10에서) 기기의
/data/misc/wifi
폴더에 저장되었습니다.
WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)
AOSP 형식으로 변환된 Wi-Fi 사용자별 저장소 파일 콘텐츠를 검색하기 위해 Wi-Fi 모듈에 의해 호출됩니다.
이러한 파일은 이전에(Android 10에서) 기기의
/data/misc_ce/<userId>/wifi
폴더에 저장되었습니다.
숨겨진 Wi-Fi API에 액세스
Wi-Fi 모듈에서 @hide
주석이 달린 기호(클래스, 메서드, 필드 등)는 공용 API 표면의 일부가 아니며 모듈이 설치된 장치에서 액세스할 수 없습니다. Wi-Fi 모듈을 포함하지 않는 장치는 다음 단계를 사용하여 @hide
Wi-Fi API를 계속 사용할 수 있습니다.
impl_library_visibility
속성을 public으로 변경하여packages/modules/Wifi/framework/Android.bp
에서framework-wifi
에 적용된 가시성 제한을 제거합니다.java_sdk_library { name: "framework-wifi", ... impl_library_visibility: [ "//visibility:public", // Add this rule and remove others. ], ... }
라이브러리 액세스
@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", ], }
libs
목록에서framework-wifi.impl
이framework
앞에 나타나는지 확인하십시오.libs
속성의 종속성 순서는 중요합니다.
숨겨진 프레임워크 API에 액세스
Wi-Fi 모듈 외부의 @hide
주석이 달린 기호는 Wi-Fi 모듈 내의 코드로 액세스할 수 없습니다. Wi-Fi 모듈이 포함되지 않은 기기는 frameworks/opt/net/wifi/service/Android.bp
를 다음과 같이 수정하여 service-wifi
에서 @hide
외부 API(예: framework.jar
)를 계속 사용할 수 있습니다. frameworks/opt/net/wifi/service/Android.bp
.
wifi-service-pre-jarjar
및service-wifi
모두 에서sdk_version
속성을core_platform
으로 변경하십시오.wifi-service-pre-jarjar
및service-wifi
둘 다 에서framework
및android_system_server_stubs_current
를libs
속성에 추가합니다.결과가 다음 코드 샘플과 유사한지 확인합니다.
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 테스트, 디버깅 및 튜닝에 설명된 테스트를 실행할 수도 있습니다.