Модуль Wi-Fi можно обновлять, то есть он может получать обновления функций вне обычного цикла выпуска Android. Этот модуль содержит следующие компоненты:
Рисунок 1. Компоненты и архитектура модуля Wi-Fi
Модуль Wi-Fi предоставляет следующие преимущества.
Конечные пользователи получают стабильное подключение к Wi-Fi на устройствах Android и исправления проблем совместимости благодаря обновлениям модуля.
Разработчики приложений получают меньше фрагментации платформы.
Производители устройств могут выполнять требования операторов связи и при этом снижать затраты на индивидуальную настройку, поскольку им не нужно реализовывать одни и те же требования разными способами.
Границы модулей для Android 12 и Android 13
packages/modules/Wififrameworkjava/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.bpproguard.flagswifi.rc
OsuLogin/(файлы изframeworks/base/packages/OsuLogin)ServiceResources/(новый каталог в Android 12, в нем хранится манифест APK наложения)res/(новое в Android 11, конфигурации Wi-Fi извлекаются изframeworks/base/core/res/res)AndroidManifest.xmlAndroid.bp
WifiDialog/(новый элемент в Android 13. Здесь хранится приложение, которое должно запускать диалоговые окна, запрошенные службой).src/com/android/wifi/dialog(содержит Activity, из которой запускаются диалоговые окна)
AndroidManifest.xmlAndroid.bp
В указанных выше каталогах также содержится код, который остается за пределами модульного системного компонента и в своем текущем местоположении, например:
wificond interface(классы в пакетеandroid.net.wifi.nl80211, напримерWifiNl80211Manager)- Пример приложения для переопределения ресурсов
WifiTrackerLiblibwifi_hallibwifi_systemlibwifi_system_iface
Производители оригинального оборудования могут использовать примеры команд, чтобы перенести свои исправления из исходных каталогов проекта в новый каталог проекта.
Как переместить исправление из 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-commitgit add tests/git commit # Enter your commit message. Call this commit test-commit
Создание двух файлов исправлений для коммитов
git format-patch -1 service-commit --stdout > service-patch.txtgit format-patch -1 test-commit --stdout > test-patch.txt
Применение двух исправлений к packages/modules/Wifi
git am service-patch.txtgit am -p1 --directory=service/ test-patch.txt
Объединение двух коммитов в один
git rebase -iИзмените операцию второго коммита на squash.
При необходимости измените сообщение фиксации.
Граница модуля для Android 11
Сервис Wi-Fi продолжает работать в процессе системного сервиса. Модуль Wi-Fi содержит весь код в packages/modules/Wifi, в том числе:
- Классы SDK и сервисов для
WifiService,WifiP2pService,WifiAwareService,WifiScannerServiceиWifiRttService OsuLoginServiceWifiResources
В модуль не входят следующие компоненты, которые остаются частью сборки AOSP от OEM-производителя:
wificondнативный компонент вsystem/connectivity/wificond- Интерфейс
wificond(классы в пакетеandroid.net.wifi.nl80211, напримерWifiNl80211Manager) android.net.wifi.SoftApConfToXmlMigrationUtilandroid.net.wifi.WifiNetworkScoreCacheandroid.net.wifi.WifiMigrationWifiTrackerLiblibwifi_hallibwifi_systemlibwifi_system_iface
Android 11 не перемещает файлы, но в будущих версиях эта функция может появиться. Чтобы упростить перенос изменений местоположения файлов, мы рекомендуем как можно больше изменений передавать в AOSP (после переноса в Android 11 или рефакторинга собственных расширений для использования официальных API Android или расширений 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
- Разные системные компоненты
- HAL Wi-Fi
wificondbouncycastleksoap2libnanohttpd
Этот модуль взаимодействует с фреймворком, используя только стабильные API @SystemApi (без API @hide), и подписан подписью Google, а не подписью платформы.
Настройка канала
Модуль Wi-Fi нельзя настраивать напрямую, но вы можете изменить конфигурацию с помощью оверлеев ресурсов времени выполнения (RRO) или конфигураций оператора.
Рисунок 2. Настройка модуля Wi-Fi
- Для небольших изменений включите или отключите настройки в RRO
config. - Чтобы получить больше контроля, настройте значения для любого ключа конфигурации оператора, представленного как
@SystemAPI.
Как использовать переопределение ресурсов во время выполнения
Вы можете настроить модуль Wi-Fi, переопределив конфигурации по умолчанию с помощью RRO. Список конфигураций, которые можно переопределить, приведен в файле 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, а у APK-файла ресурса, предоставленного модулем Wi-Fi, название пакета com.google.android.wifi.resources, необходимо задать для APK-файлов оверлея targetPackage значение com.google.android.wifi.resources, чтобы успешно переопределить конфигурации Wi-Fi.
Перенести формат хранения конфигурации
Модуль Wi-Fi может анализировать только формат хранилища конфигурации Wi-Fi AOSP. Если вы ранее изменили формат хранения конфигурации Wi-Fi (включая список сохраненных сетей пользователя), вам необходимо преобразовать эти данные в формат AOSP при обновлении устройства до любой версии Android, включающей модуль Wi-Fi. Хуки, необходимые для этого преобразования, находятся в классе android.net.wifi.WifiMigration.
Реализуйте преобразование формата в следующих методах.
WifiMigration.convertAndRetrieveSharedConfigStoreFile(<storeFileId>)Вызывается модулем Wi-Fi для получения содержимого файла общего хранилища Wi-Fi, преобразованного в формат AOSP.
Ранее (в Android 10) эти файлы хранились в папке
/data/misc/wifiна устройстве.
WifiMigration.convertAndRetrieveUserConfigStoreFile(<storeFileId>)Вызывается модулем Wi-Fi для получения содержимого файла хранилища, относящегося к пользователю Wi-Fi, которое было преобразовано в формат AOSP.
Ранее (в Android 10) эти файлы хранились в папке
/data/misc_ce/<userId>/wifiна устройстве.
Доступ к скрытым API Wi-Fi
Символы (классы, методы, поля и т. д.), аннотированные с помощью @hide в модуле Wi-Fi, не входят в его общедоступный API и недоступны на устройствах с установленным модулем. Устройства, не оснащенные модулем Wi-Fi, могут использовать API Wi-Fi @hide, выполнив следующие действия.
Снимите ограничения видимости, установленные для
framework-wifiвpackages/modules/Wifi/framework/Android.bp, изменив атрибутimpl_library_visibilityна public.java_sdk_library { name: "framework-wifi", ... impl_library_visibility: [ "//visibility:public", // Add this rule and remove others. ], ... }Измените правило сборки, чтобы разрешить доступ к библиотеке API Wi-Fi
@hide. Например, ниже приведено правило сборки для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", ], }Убедитесь, что
framework-wifi.implуказан в спискеlibsраньше, чемframework. Порядок зависимостей в атрибутеlibsимеет значение.
Доступ к скрытым API фреймворка
Символы, аннотированные с помощью @hide вне модуля Wi-Fi, недоступны для кода в этом модуле. Устройства, в которых нет модуля Wi-Fi, могут продолжать использовать внешние API @hide (например, из framework.jar) в service-wifi, внеся следующие изменения в 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 Compatibility Test Suite (CTS) проверяет возможности модуля Wi-Fi, запуская полный набор тестов CTS для каждой версии модуля. Вы также можете выполнить тесты, описанные в разделе Тестирование, отладка и настройка Wi-Fi.