Вай-фай

Модуль 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, манифест Overlay APK хранится здесь)
      • 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

Создание файла исправления в корне/frameworks/base/wifi

git format-patch -1 commit --stdout > patch-file.txt

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

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 продолжает работать внутри процесса системной службы. Модуль 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 )
  • Сертификаты ВФА

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

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

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

Этот модуль взаимодействует с платформой, используя только стабильный @SystemApi (без использования @hide API) и подписывается подписью 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 , для успешного наложения конфигураций Wi-Fi необходимо установить для наложенного APKS targetPackage значение com.google.android.wifi.resources .

Миграция формата хранения конфигурации

Модуль 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 @hide Wi-Fi, выполнив следующие действия.

  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» .