Wi-Fi

Модуль Wi-Fi является обновляемым, то есть он может получать обновления, расширяющие его возможности вне обычного цикла выпуска Android. Этот модуль содержит следующие компоненты.

Компоненты модуля Wi-Fi

Рисунок 1. Компоненты и архитектура модуля Wi-Fi.

Модуль Wi-Fi обеспечивает следующие преимущества.

  • Пользователи получают стабильную работу Wi-Fi на всех устройствах Android, а также исправления проблем совместимости благодаря обновлениям модулей.

  • Разработчики приложений получают возможность снизить фрагментацию платформы.

  • Производители оригинального оборудования могут удовлетворять требованиям операторов связи, одновременно снижая затраты на индивидуальную настройку (поскольку им не требуется различное воплощение одних и тех же требований разными способами).

Границы модуля для 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, манифест Overlay APK хранится здесь)
      • res/ (новое в Android 11, конфигурации Wi-Fi извлечены из frameworks/base/core/res/res )
      • AndroidManifest.xml
      • Android.bp
    • WifiDialog/ (новое в Android 13 приложение для запуска диалоговых окон пользователя, запрашиваемых службой, хранится здесь.)
      • src/
        • com/android/wifi/dialog (Содержит Activity, из которой запускаются диалоги)
      • AndroidManifest.xml
      • Android.bp

В указанных выше каталогах также содержится код, который остается вне модульного компонента системы и в своем текущем местоположении, например:

  • wificond interface (классы в пакете android.net.wifi.nl80211 , например, WifiNl80211Manager )
  • Пример приложения "Наложение ресурсов"
  • WifiTrackerLib
  • libwifi_hal
  • libwifi_system
  • libwifi_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-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 .

Edit the commit message as appropriate.

Границы модуля для Android 11

Служба Wi-Fi продолжает работать внутри процесса системной службы. Модуль Wi-Fi включает в себя весь код в packages/modules/Wifi в том числе следующий.

  • SDK и сервисные классы для WifiService , WifiP2pService , WifiAwareService , WifiScannerService и WifiRttService
  • OsuLogin
  • ServiceWifiResources

Данный модуль исключает следующие компоненты, которые остаются частью сборки AOSP от производителя оборудования.

  • встроенный компонент wificond в system/connectivity/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 или рефакторинга проприетарных расширений с использованием формальных API Android или расширений HAL от поставщиков, чтобы отделить их от кода AOSP).

Формат модуля

Модуль Wi-Fi ( com.android.wifi ) имеет формат APEX и доступен для устройств под управлением Android 11 или выше. Файл APEX включает следующие компоненты.

  • Библиотека SDK ( framework-wifi.jar )
  • Service library ( service-wifi.jar )
  • OsuLogin APK ( OsuLoginGoogle.apk )
  • Ресурсный APK ( ServiceWifiResourcesGoogle.apk )
  • Сертификаты WFA

Зависимости модуля

Модуль Wi-Fi зависит от следующих компонентов.

  • Подключение
  • Телефония
  • Протобиблиотеки
  • Различные системные компоненты
  • Wi-Fi HALs
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

Этот модуль взаимодействует с фреймворком, используя только стабильную аннотацию @SystemApi (без использования @hide API) и подписан подписью Google, а не платформенной подписью.

Настройка

Модуль Wi-Fi не поддерживает прямую настройку, но вы можете изменить конфигурацию с помощью наложений ресурсов во время выполнения (RRO) или конфигураций оператора связи.

Настройка Wi-Fi

Рисунок 2. Настройка модуля Wi-Fi.

  • Для внесения небольших изменений включите или отключите соответствующие параметры в config RRO.
  • Для более полного контроля настройте значения конфигурации для любого ключа конфигурации оператора, доступного по адресу @SystemAPI .

Use runtime resource overlays

Вы можете настроить модуль 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 , для успешной настройки конфигураций Wi-Fi необходимо установить атрибут targetPackage для APK-файлов наложения на com.google.android.wifi.resources .

Migrate configuration storage format

Модуль 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 выполнив следующие шаги.

  1. Снимите ограничения видимости, наложенные на 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.
        ],
        ...
    }
    
  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. Убедитесь, что framework-wifi.impl находится перед framework в списке libs . Порядок зависимостей в атрибуте libs имеет значение.

Получите доступ к скрытым API фреймворка.

Символы, аннотированные @hide вне модуля Wi-Fi, недоступны для кода внутри модуля Wi-Fi. Устройства, не содержащие модуль Wi-Fi, могут продолжать использовать внешние API @hide (например, из framework.jar ) в service-wifi , внеся следующие изменения в frameworks/opt/net/wifi/service/Android.bp .

  1. В обоих модулях wifi-service-pre-jarjar и service-wifi измените атрибут sdk_version на core_platform .

  2. В обоих модулях wifi-service-pre-jarjar и service-wifi добавьте framework и android_system_server_stubs_current в атрибут libs .

  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) проверяет возможности модуля Wi-Fi, запуская полный набор тестов CTS для каждой версии модуля. Вы также можете запустить тесты, описанные в разделе «Тестирование, отладка и настройка Wi-Fi» .