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, в нем хранится манифест 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.

При необходимости измените сообщение фиксации.

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

Сервис Wi-Fi продолжает работать в процессе системного сервиса. Модуль Wi-Fi содержит весь код в packages/modules/Wifi, в том числе:

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

В модуль не входят следующие компоненты, которые остаются частью сборки AOSP от OEM-производителя:

  • 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-wifi.jar)
  • OsuLogin APK (OsuLoginGoogle.apk)
  • APK ресурсов (ServiceWifiResourcesGoogle.apk)
  • Сертификаты WFA

Зависимости модулей

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

  • Функции связи
  • Телефонная связь
  • Библиотеки Proto
  • Разные системные компоненты
  • HAL Wi-Fi
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

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

Настройка канала

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

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

Рисунок 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, выполнив следующие действия.

  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. Измените правило сборки, чтобы разрешить доступ к библиотеке 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",
        ],
    }
    
  3. Убедитесь, что 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.

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