Вай-фай

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

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

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

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

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

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

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

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

  • 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

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

  • 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

Применение двух патчей к пакетам/модулям/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

Модуль исключает следующие компоненты, которые остаются частью сборки OEM 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.google.android.wifi.apex ) имеет формат APEX и доступен для устройств под управлением Android 11 или выше. Файл APEX включает следующие компоненты.

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

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

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

  • Связь
  • Телефония
  • Прото библиотеки
  • Разные компоненты системы
  • HAL Wi-Fi
  • 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 необходимо установить для targetPackage 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 могут продолжать использовать @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. Например, ниже приведено правило сборки для 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 .