Сервис выбора домена

На устройствах с Android 15 или более поздней версии можно реализовать выбор домена между сервисом IMS и устаревшими сервисами в сетях с коммутацией каналов с помощью системного API DomainSelectionService. DomainSelectionService – это четко определенный интерфейс между платформой Android и реализацией выбора домена, предоставленной поставщиком. Этот интерфейс позволяет реализации поставщика предоставлять платформе информацию о сигналах, например о домене, в котором выполняются исходящие вызовы и отправляются SMS, и о предпочтительном типе сети при сканировании.

Схема архитектуры сервиса выбора домена, на которой показано его взаимодействие с платформой Android и реализациями поставщиков

Рисунок 1. Схема архитектуры функции выбора домена

Примеры и источник

В Android Open Source Project (AOSP) по адресу TelephonyDomainSelectionService приведена эталонная реализация функции выбора домена. Подробную документацию по API DomainSelectionService можно найти в статье DomainSelectionService и других материалах по API.

Реализация

Чтобы реализовать функцию выбора домена на устройстве Android, выполните следующие действия:

  1. Создайте приложение для выбора домена. Сервис должен быть определен в файле AndroidManifest.xml.

  2. Добавьте конфигурацию в оверлей устройства, чтобы платформа могла привязаться к реализации DomainSelectionService.

  3. Поддерживать необходимые интерфейсы уровня абстракции радиооборудования (HAL) для функции выбора домена.

Ниже приведены подробные инструкции.

Добавьте запись о сервисе в файл AndroidManifest.xml

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

<service
     android:name="com.example.domainselection.DomainSelectionService"
     android:directBootAware="true"
     android:persistent="true"
     …
     android:permission="android.permission.BIND_DOMAIN_SELECTION_SERVICE"
     …
    <intent-filter>
        <action android:name="android.telephony.DomainSelectionService"/>
    </intent-filter>
    …
</service>

Чтобы функция выбора домена работала, в определении сервиса в файле AndroidManifest.xml должны быть заданы следующие атрибуты:

  • directBootAware="true": позволяет сервису быть обнаруженным и запущенным телефонией до того, как пользователь разблокирует устройство. Сервис не может получить доступ к хранилищу device-encrypted, пока пользователь не разблокирует устройство. Подробнее о поддержке режима Direct Boot и о шифровании на уровне файлов…
  • persistent="true": позволяет сервису работать постоянно и не быть закрытым системой для освобождения памяти. Этот атрибут работает, только если приложение создано как системное.
  • permission="android.permission.BIND_DOMAIN_SELECTION_SERVICE" – проверяет, что к приложению может подключаться только процесс с разрешением BIND_DOMAIN_SELECTION_SERVICE. Это не позволяет вредоносным приложениям подключаться к сервису, поскольку разрешение могут получить только системные приложения.

Также сервис должен указать элемент intent-filter с действием android.telephony.DomainSelectionService. Это позволяет фреймворку найти сервис DomainSelectionService.

Как задать конфигурацию в оверлее устройства

Чтобы платформа могла безопасно подключиться к сервису DomainSelectionService, добавьте в оверлей устройства следующую конфигурацию:

Поскольку Android не поддерживает приложения со сторонними реализациями DomainSelectionService, доступными для скачивания, приложение для выбора домена должно быть системным и находиться в папке /system_ext/priv-app/ или /product/priv-app/. Фреймворк проверяет, совпадает ли название пакета реализации со значением наложения устройства, чтобы убедиться, что привязываются только доверенные предустановленные приложения.

Поддержка интерфейсов HAL для радио

Чтобы включить функцию выбора домена, поддержите следующие обязательные интерфейсы HAL радио:

  • IRadioNetwork

    void setEmergencyMode(int serial, EmergencyMode emcModeType);
    void triggerEmergencyNetworkScan(int serial,
            EmergencyNetworkScanTrigger request);
    void cancelEmergencyNetworkScan(int serial, boolean resetScan);
    void exitEmergencyMode(int serial);
    
  • IRadioNetworkIndication

    void emergencyNetworkScanResult(RadioIndicationType type,
            EmergencyRegResult result);
    

Проверка

Чтобы проверить, правильно ли фреймворк телефонии отвечает на интерфейс DomainSelectionService, запустите тесты Compatibility Test Suite (CTS) в DomainSelectionServiceTestOnMockModem.