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

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

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

Применение двух патчей к пакетам/модулям/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 )
  • Resource APK ( ServiceWifiResourcesGoogle.apk )
  • Сертификаты WFA

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

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

  • Связность
  • Телефония
  • Прото-библиотеки
  • Разные компоненты системы
  • Wi-Fi HAL
  • wificond
  • bouncycastle
  • ksoap2
  • libnanohttpd

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

Настройка

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

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

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

  • Для небольших настроек включите или отключите параметры в config RRO.
  • Для большего контроля настройте значения конфигурации для любого ключа конфигурации оператора, представленного как @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 , необходимо установить для атрибута наложения APKS 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 @hide Wi-Fi. Например, ниже приведено правило сборки для 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 .