Wi-Fi

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

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

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

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

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

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

  • 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 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

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

Применение двух патчей к пакетам/модулям/Wi-Fi

git am service-patch.txt
git am -p1 --directory=service/ test-patch.txt

Объединение двух коммитов обратно в один коммит

git rebase -i

Измените операцию второго коммита на squash .

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

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

Служба Wi-Fi продолжает работать внутри процесса System Service. Модуль 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 зависит от следующих компонентов.

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