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

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

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

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

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

Android предоставляет эталонную реализацию функции выбора домена в 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" : позволяет службе быть обнаруженной и запущенной телефонией до того, как пользователь разблокирует устройство. Служба не сможет получить доступ к зашифрованному хранилищу устройства до того, как пользователь разблокирует устройство. Подробнее см. в разделах Поддержка режима прямой загрузки и шифрования на основе файлов .

  • 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 , запустите тесты CTS в DomainSelectionServiceTestOnMockModem .